Đôi khi trong khi thực hiện các cuộc thi lập trình, chúng tôi cần thực hiện thao tác đơn giản với hàng đợi ưu tiên tối thiểu bằng phím giảm để thực hiện thuật toán Dijkstra vv .. Tôi thường sử dụng cặp < đặt < key_value, ID > > và một mảng (ánh xạ ID -> key_value) với nhau để đạt được điều đó.Cách dễ nhất để sử dụng hàng đợi ưu tiên tối thiểu với cập nhật quan trọng trong C++
Việc thêm phần tử vào tập hợp sẽ mất thời gian O (log (N)). Để xây dựng một hàng đợi ưu tiên trong số các phần tử N, chúng ta chỉ cần thêm chúng từng cái một vào tập hợp. Điều này có tổng thời gian O (N log (N)).
Phần tử có min key_value chỉ đơn giản là phần tử đầu tiên của tập hợp. Việc thử nghiệm phần tử nhỏ nhất sẽ mất thời gian O (1). Loại bỏ nó mất thời gian O (log (N)).
Để kiểm tra xem một số ID = k có trong tập hợp không, trước tiên chúng tôi tra cứu key_value = v_k trong mảng và sau đó tìm kiếm phần tử (v_k, k) trong tập hợp. Điều này có thời gian O (log (N)).
Để thay đổi key_value của một số ID = k từ v_k thành v_k ', trước tiên chúng tôi tra cứu key_value = v_k trong mảng và sau đó tìm kiếm phần tử (v_k, k) trong tập hợp. Tiếp theo chúng ta loại bỏ phần tử đó khỏi tập và sau đó chèn phần tử (v_k ', k) vào tập hợp. Chúng tôi sau đó cập nhật mảng, quá. Điều này có thời gian O (log (N)).
Mặc dù cách tiếp cận trên hoạt động, hầu hết sách giáo khoa thường khuyên bạn sử dụng đống nhị phân để triển khai hàng đợi ưu tiên, khi xây dựng đống nhị phân chỉ là O (N). Tôi nghe nói rằng có một cấu trúc dữ liệu xếp hàng ưu tiên được xây dựng sẵn trong STL của C++ sử dụng đống nhị phân. Tuy nhiên, tôi không chắc chắn cách cập nhật key_value cho cấu trúc dữ liệu đó.
Cách dễ nhất và hiệu quả nhất khi sử dụng hàng đợi ưu tiên tối thiểu với cập nhật khóa trong C++ là gì?
Làm thế nào về [Boost.Heap] (http://www.boost.org/doc/libs/master/doc/html/heap.html)? – xuhdev