Câu trả lời ngắn gọn: Bạn không thể.
Câu trả lời dài hơn một chút:
Ω(n)Ω(n)
addr(X)<addr(Y)
Câu trả lời rất dài với giả toán không chính xác:
Lưu ý: phần cuối của phần thứ hai là sơ sài, như đã đề cập. Nếu một số người toán học có thể cung cấp một phiên bản tốt hơn, tôi sẽ rất biết ơn.
P
(a,1)<(a,2)(a,1)=(a,1)(a,1)(b,1)
X<YXY
(?,1)?
- X−log2(P)2X
- P
X−log2(P)O(n)n
Bây giờ, mỗi "bộ nhớ" cung cấp cho chúng ta bao nhiêu bit thông tin?
P≥1X−log2(P)<X
Vì vậy, để lưu trữ tất cả thông tin của chúng tôi, chúng tôi có hai khả năng:
- Lưu trữ thứ tự chèn trong địa chỉ và tải trọng trong bộ nhớ.
- Lưu trữ cả trong bộ nhớ và để lại địa chỉ miễn phí cho một số sử dụng khác.
Rõ ràng, để tránh lãng phí, chúng tôi sẽ sử dụng giải pháp đầu tiên.
Bây giờ cho các hoạt động. Tôi cho rằng bạn muốn có:
- Insert(task,priority)O(logn)
- StableExtractMin()O(logn)
StableExtractMin()
Thuật toán thực sự thực sự chung như sau:
- O(logn)
- O(logn)
- Trả lại.
0(1)O(1)O(1)
O(logn)2(X−log2(P))
X−log2(P)O(logn)O(logn)
O(logn)
O(logn)X−log2(P)
O(logn)
X−log2(P)O(logn)
Thuật toán chèn thường chỉ cần cập nhật một phần thông tin này, tôi không nghĩ rằng nó sẽ tốn nhiều tiền hơn (thông minh bộ nhớ) để nó hoạt động nhanh.
X−log2(P)
- X−log2(P)
- P
- X−log2(P)
Ω(n)