Sự khác biệt giữa một đống và hàng đợi ưu tiên


36

Tôi luôn luôn nghĩ rằng đống và hàng đợi ưu tiên là từ đồng nghĩa - một cấu trúc dữ liệu trừu tượng mà hỗ trợ các insert, findMindeleteMincác hoạt động.

Một số tài liệu dường như đồng ý với tôi - chẳng hạn cấu trúc dữ liệu chức năng hoàn toàn của Chris Okasaki (chương 3).

Mặt khác, trang heap của Wikipedia định nghĩa nó là một cấu trúc dữ liệu dựa trên cây và nói rằng các heap là một triển khai cụ thể của các hàng đợi ưu tiên.

Tôi đang gặp khó khăn trong việc điều hòa vấn đề này với thực tế là tôi có thể nghĩ ra nhiều hơn một lần thực hiện heap - đống trái, đống nhị phân, đống đống ...

Có phải thực tế đơn giản là một đống có thể được thực hiện với các cấu trúc dữ liệu khác nhau không có nghĩa là nó là một cấu trúc dữ liệu trừu tượng? Và nếu đó là trường hợp, có một sự khác biệt thực sự với hàng đợi ưu tiên?


11
Đọc trang Wikipedia về hàng đợi ưu tiên ( en.wikipedia.org/wiki/P Warriority_queue ), nó cho biết "một hàng đợi ưu tiên có thể được thực hiện với một đống hoặc nhiều phương thức khác như mảng không có thứ tự" - và đó thực sự là câu trả lời cho câu hỏi của bạn.
Doc Brown

2
Chà, thực sự không - nó không giúp tôi hiểu liệu một đống là cấu trúc dữ liệu cụ thể hay trừu tượng. Tôi có xu hướng nói một thứ trừu tượng, vì có nhiều triển khai cụ thể của một đống. Nếu đó là trường hợp, và một danh sách ưu tiên và một đống là cả hai cấu trúc dữ liệu trừu tượng có cùng thuộc tính, thì tôi cần trợ giúp để hiểu sự khác biệt và nói rằng một trong số đó là một triển khai khả thi của cái kia không thực sự hữu ích nếu thực sự không phải là một thi công cụ thể.
Nicolas Rinaudo

Điều thậm chí còn tồi tệ hơn: một đống nhị phân có thể được thực hiện dưới dạng một mảng hoặc như một cây nhị phân. May mắn thay, tôi chưa nghe nói về một mảng được thực hiện như một cái gì đó khác.
Alexey

Câu trả lời:


25

Một hàng đợi ưu tiên có thể có bất kỳ triển khai nào, như một mảng mà bạn tìm kiếm tuyến tính khi bạn bật. Tất cả điều đó có nghĩa là khi bạn bật, bạn nhận được giá trị với mức tối thiểu hoặc tối đa tùy thuộc.

Một đống cổ điển như thường được gọi là một đống tối thiểu. Một triển khai có độ phức tạp thời gian tốt ( O(log n)trên đẩy và bật) và không có chi phí bộ nhớ.


4
Bạn có nghĩa là để nói rằng sự khác biệt là trong khi họ chia sẻ các hoạt động tương tự ( findMin, deleteMin, insert), đống đã đảm bảo "tốt" phức tạp cho họ nơi hàng đợi ưu tiên không?
Nicolas Rinaudo

Heap cũng không thể có các triển khai khác nhau với độ phức tạp thời gian khác nhau (ví dụ, một cây nhị phân được liên kết thông thường)? Ngoài ra, độ phức tạp thời gian phụ thuộc vào bộ nhớ được sử dụng. Nếu đó là một băng từ, sẽ không có O(log(n))cho đẩy và bật, tôi cho rằng.
Alexey

6

Trang web này cung cấp một lời giải thích thực sự rõ ràng. http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html

Nói tóm lại, một hàng đợi ưu tiên có thể được thực hiện bằng nhiều cấu trúc dữ liệu mà chúng ta đã nghiên cứu (một mảng, danh sách được liên kết hoặc cây tìm kiếm nhị phân). Tuy nhiên, những cấu trúc dữ liệu đó không cung cấp các hoạt động hiệu quả nhất. Để làm cho tất cả các hoạt động rất hiệu quả, chúng tôi sẽ sử dụng một cấu trúc dữ liệu mới được gọi là một đống.


1
Lưu ý rằng tại phần tóm tắt của trang bạn đã liên kết đến, chính hàng đợi ưu tiên được gọi là cấu trúc dữ liệu .
Alexey

2

Tôi nghĩ rằng những gì bạn đã viết về cụ thể và trừu tượng là chính xác. Mặc dù bạn nói rằng heap heap, heap binomial là những cách thực hiện khác nhau của heap, tôi nghĩ sẽ đúng hơn khi nói chúng là các loại heap khác nhau. Heap tôi nghĩ về một thể loại triển khai thường đảm bảo không chỉ cùng một giao diện, mà cả thời gian truy cập giống nhau.

Bạn thấy điều này với các bản đồ liên kết, và bảng băm và cây tìm kiếm nhị phân là tốt. Bsts và bảng băm là cả hai cấu trúc dữ liệu cụ thể cung cấp giao diện trừu tượng bản đồ kết hợp. Cây đen và cây avl đều là bsts cân bằng, với cùng một đảm bảo O lớn và cùng một giao diện bổ sung (theo thứ tự đi qua). Chúng là những loại cây khác nhau mà tôi muốn nói nhiều hơn những cách thực hiện khác nhau của cây. Chúng là những triển khai khác nhau nhưng có liên quan chặt chẽ với các bản đồ liên kết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.