Đặt là tập hợp các chuỗi trên bảng chữ cái có tổng số ký hiệu.
Nhiệm vụ của bạn là sắp xếp từng chuỗi bên trong, sau đó sắp xếp các chuỗi kết quả theo thứ tự từ điển. (Thuật toán của bạn không phải vận hành theo cách này.)
Thí dụ:
Đầu vào: 33123 15 1 0 54215 21 12
Đầu ra: 0 1 12 12 12333 12455 15
Tôi tìm thấy một cách để làm điều đó trong thời gian và không gian .
Không gian lớn hơn thời gian vì tôi sử dụng một mảng thông minh cho phép bạn tạo một mảng có kích thước và sắp xếp các giá trị ban đầu cho tất cả các ô trong .
Tôi đã sử dụng sắp xếp xô để sắp xếp từng chuỗi ( thời gian và không gian) và từ cây để sắp xếp bộ sưu tập ( thời gian và không gian ). nhưng giải pháp của tôi quá phức tạp.
Có ai có giải pháp tốt hơn, với thời gian và ít không gian hơn, hoặc nhanh hơn không?
Giải pháp phải có tính xác định để không có bản đồ băm hoặc các thuật toán thống kê khác
Giải pháp của tôi: Mảng thông minh là một mảng có kích thước mà chúng ta có thể tạo và "khởi tạo" trong :
Chúng tôi tạo ra ba mảng kích thước của mà không cần khởi tạo bất kỳ trong số họ và chúng tôi cũng giữ một biến số nguyên duy nhất được gọi là .
Mảng đầu tiên chứa dữ liệu. Mảng thứ hai chứa các con trỏ tới một ô trong mảng thứ ba. Mảng thứ ba chứa các con trỏ tới một ô trong mảng thứ hai. chứa số lượng tế bào được khởi tạo cho đến nay.
Giả sử chúng ta muốn đặt giá trị của ô (giả sử đây là lần đầu tiên chúng ta thực hiện nó trên ô này). Sau đó, chúng ta sẽ đi đến ô trong mảng đầu tiên và đặt nó vào val mong muốn.
Bây giờ chúng ta đi đến ô trong mảng thứ hai và đặt nó vào điểm ở mảng thứ ba. Đặt ô trong mảng thứ ba để trỏ đến ô trong mảng thứ hai. Tăng thêm 1.
Giả sử chúng ta muốn biết nếu ô là rác (Điều đó có nghĩa là chúng ta chưa đặt bất cứ thứ gì cho nó).
Chúng ta sẽ đi đến ô trong mảng thứ hai và xem số ô (trong mảng thứ ba) mà ô (trong mảng thứ hai) trỏ đến - chúng ta sẽ gọi nó là .
Nếu thì là rác (vì chúng ta chỉ khởi tạo các ô cho đến nay và không phải là một trong số chúng).
Nếu chúng ta sẽ xem ô nào (trong mảng thứ ba) trỏ đến. Nếu nó không phải thì là rác. Nếu không thì không phải là rác
Bằng cách đó, chúng ta có thể biết ở mỗi bước nếu chúng ta khởi tạo ô này và nếu không khởi tạo nó. Vì vậy, chúng tôi đã tạo và "khởi tạo" một mảng có kích thước trong thời gian .
Bí quyết chính không phải là khởi tạo toàn bộ mảng khi bắt đầu mà là tìm cách biết những ô nào chúng ta đã khởi tạo cho đến nay và chỉ khởi tạo một ô khi chúng ta "nhìn" vào nó. Trong mô hình RAM, phải mất thời gian để tạo ra một mảng có kích thước bất kỳ mà không khởi tạo nó.
Một cây từ có thứ tự m là một khái quát của TRIE. Mỗi nút chứa một mảng các con trỏ tới các con trai của nó. Kích thước mảng là . Mỗi nút cũng chứa một bộ đếm để cho biết có bao nhiêu bộ được mô tả bởi nút này.
Bởi vì chúng ta đang sử dụng các mảng thông minh mỗi lần chúng ta thêm một chữ (một bộ) chỉ mất thời gian và không gian.
Time cannot be smaller than space
đúng. You are cheating in some way
không tuân theo " time và space": với , - giới hạn trên không gian trông không cần thiết.