Tại sao hầu hết các ngôn ngữ cung cấp một heap tối thiểu thay vì thực hiện heap tối đa?


19

Tôi chỉ nhận thấy một cái gì đó và tôi tự hỏi nếu có bất kỳ lý do cho điều đó. Ngoại trừ C ++ (std :: Prior_queue là một heap tối đa), tôi không biết bất kỳ ngôn ngữ nào khác cung cấp một heap tối đa.

Mô-đun heapq của Python thực hiện một heap nhị phân nhị phân trên đầu danh sách.

Thư viện của Java chứa một lớp PriorityQueue, thực hiện một hàng đợi ưu tiên tối thiểu.

Thư viện của Go chứa mô-đun container / heap, thực hiện một heap tối thiểu trên bất kỳ cấu trúc dữ liệu tương thích nào.

Khung nền tảng Core của Apple chứa cấu trúc CFBinaryHeap, thực hiện một đống nhỏ.

Tôi tìm thấy một heap tối đa trực quan hơn một heap nhỏ và tôi tin rằng về mặt kỹ thuật, sự khác biệt thực hiện chỉ là một câu hỏi về việc thay đổi một toán tử so sánh. Có bất kỳ lý do thực sự? Hầu hết các ứng dụng cần một phút thay vì một đống tối đa? Cảm ơn trước


Họ không giống hệt nhau sao? Tôi bỏ phiếu để đóng như là tranh luận.

2
Chỉ vài ngày trước, tôi cần một đống tối thiểu trong C ++ và hơi khó chịu khi ưu tiên mặc định là một đống tối đa. Nó buộc tôi phải xác định toán tử> trên lớp tùy chỉnh của mình, lớp đã có toán tử <. Khi làm việc với các biểu đồ, bạn thường muốn ưu tiên các cạnh ngắn nhất, vì vậy bạn cần một đống tối thiểu.
LaC

2
@LaC: bạn có thể sử dụng std::not2(std::less<T>()).

Câu trả lời:


9

Như những người khác đã quan sát, nếu heap chấp nhận một bộ so sánh, thì không quá khó để có được một hành vi này hay hành vi khác. Tuy nhiên, một sự hiểu biết nhanh về Mã Google cho thấy rằng min-heap phổ biến hơn nhiều trong mã thực tế, bởi vì hai ứng dụng xuất hiện lặp đi lặp lại.

  • Dijkstra / A * / nhiều thuật toán đường dẫn ngắn nhất khác (vì đường dẫn một phần sẽ dài hơn).

  • Mô phỏng sự kiện (vì thời gian tiến lên).

Ngoài ra, tôi sẽ lập luận rằng vì sắp xếp mặc định trả về các mục từ nhỏ đến lớn, do đó, heap mặc định.


2
Tôi thường lập trình trong C ++ và tự hỏi ngược lại: tại sao C ++ không thực hiện một heap nhỏ? Như bạn đã nói, hầu hết các thuật toán sử dụng một đống nhỏ.
Martín Fixman

5

Nó chỉ là một vấn đề của hương vị. Tôi không nghĩ sẽ có bất kỳ lý do cụ thể nào. Nó giống như một số người thích thể hiện tối ưu hóa các vấn đề như giảm thiểu chi phí, trong khi những người khác thích nói tối đa hóa lợi nhuận.


3

Hầu hết các ngôn ngữ tôi biết đều cho phép truyền tham số để quyết định xem nó nên là một heap tối thiểu hay tối đa. Vì vậy, giá trị mặc định là hơi tùy ý. Tôi đoán đối với hầu hết các ngôn ngữ, đó là một câu hỏi về tính nhất quán để xác định toán tử mặc định là gì. Đối với C ++ trong stl, mặc định sẽ std::lessdẫn đến một heap nhỏ.

Tính nhất quán của việc sử dụng std::lessmặc định ở mọi nơi có nghĩa là bạn chỉ phải thực hiện so sánh này khi bạn đang sử dụng bất kỳ loại cấu trúc dữ liệu nào và bạn không phải quyết định cấu trúc dữ liệu nào bạn sẽ sử dụng sau này khi bạn thiết kế các lớp. Tôi đoán nó giống với các ngôn ngữ khác với sự khác biệt duy nhất là so sánh lớn hơn so với tiêu chuẩn.


3
Tôi không nghĩ có một kết nối như vậy. Bạn có thể thực hiện một trong hai loại heap bằng cách sử dụng <hoặc>. Thật vậy, std :: less là mặc định trong STL, nhưng họ thực hiện heap tối đa thay vì heap tối thiểu.
LaC

1

Về cơ bản, giá trị chỉ số là một số tùy ý. Nếu bạn tin rằng con số đại diện cho mức độ ưu tiên và con số lớn hơn là mức độ ưu tiên cao hơn, thì một heap tối đa có ý nghĩa. Nhưng nếu các con số đại diện, ví dụ, các số hiệu bánh khái niệm ("Lấy một số") thì min-heap có ý nghĩa hơn.

Bạn luôn có thể chuyển đổi từ cái này sang cái khác bằng cách lấy phần bù của chỉ số 1.

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.