Hướng dẫn update element in priority queue c++ - cập nhật phần tử trong hàng đợi ưu tiên c ++

Tôi có một ưu tiên_queue của một số đối tượng:

typedef priority_queue Queue;
Queue queue;

Thỉnh thoảng, mức độ ưu tiên của một trong các đối tượng có thể thay đổi - tôi cần có thể cập nhật mức độ ưu tiên của đối tượng đó trong hàng đợi một cách hiệu quả. Hiện tại tôi đang sử dụng phương pháp này hoạt động nhưng có vẻ không hiệu quả:

Queue newQueue;
while [!queue.empty[]]
{
  Object obj=queue.top[];
  queue.pop[];

  if [priorityHasChanged[obj]]
    newQueue.push_back[Object[new_priority]];
  else
    newQueue.push_back[obj];
}

newQueue.swap[queue]; // this only works because I actually subclassed the priority_queue
                 // class and exposed a swap method that swaps in the container

Tôi đã thực hiện nó theo cách này bởi vì tôi đã rất vội vàng vào thời điểm đó và đây là điều nhanh nhất tôi có thể làm mà tôi có thể chắc chắn rằng nó sẽ hoạt động tốt. Phải có một cách tốt hơn điều này mặc dù. Thực sự những gì tôi muốn là một cách để:

  • Trích xuất phiên bản với mức độ ưu tiên đã thay đổi và chèn một cái mới với giá trị ưu tiên mới
  • Cập nhật thể hiện với mức độ ưu tiên đã thay đổi và sau đó cập nhật hàng đợi để nó được sắp xếp chính xác

Cách tốt nhất để làm việc này là gì?

Đã hỏi ngày 16 tháng 3 năm 2009 lúc 8:31Mar 16, 2009 at 8:31

1800 Thông tin1800 Thông tin1800 INFORMATION

128K29 Huy hiệu vàng157 Huy hiệu bạc239 Huy hiệu Đồng29 gold badges157 silver badges239 bronze badges

Tôi có thể đề xuất 2 lựa chọn để giải quyết vấn đề, mặc dù không thực hiện cập nhật thực sự.

  1. Sử dụng phần tử priority_queue và đẩy mỗi lần bạn muốn cập nhật nó. Chấp nhận thực tế rằng bạn sẽ có các mục vô dụng trong hàng đợi. Khi bật giá trị hàng đầu, hãy kiểm tra xem nó có chứa giá trị cập nhật không. Nếu không, hãy bỏ qua nó và bật tiếp theo.

    Bằng cách này, bạn trì hoãn việc loại bỏ phần tử được cập nhật cho đến khi đến đầu. Tôi nhận thấy phương pháp này được sử dụng bởi các lập trình viên hàng đầu nhận ra thuật toán Dijkstra.

  2. Sử dụng 4. Nó cũng được sắp xếp để bạn có thể trích xuất yếu tố lớn nhất trong thời gian logarit. Bạn cũng có thể loại bỏ phần tử lỗi thời trước khi chèn lại. Vì vậy, vẫn không có hoạt động cập nhật có thể, nhưng loại bỏ và tái cấu trúc là có thể thực hiện được.

Có vẻ như sự phức tạp của cả hai phương pháp là như nhau.

Đã trả lời ngày 23 tháng 12 năm 2012 lúc 8:56Dec 23, 2012 at 8:56

5

Tôi nghĩ rằng bạn không may mắn với hàng đợi ưu tiên tiêu chuẩn vì bạn không thể nhận được ở các deque/vector/danh sách cơ bản hoặc bất cứ điều gì. Bạn cần phải thực hiện của riêng bạn - nó không khó lắm.

Đã trả lời ngày 16 tháng 3 năm 2009 lúc 9:09Mar 16, 2009 at 9:09

2

Tôi đã triển khai hàng đợi ưu tiên cập nhật hiệu suất cao và cung cấp nó trên GitHub.

Đây là cách bạn thường sử dụng nó:

better_priority_queue::updatable_priority_queue pQ;
pQ.push[0, 30];   // or pQ.set[0, 30]
pQ.push[1, 20];
pQ.push[2, 10];

pQ.update[2, 25]; // or pQ.set[2, 25]

while[!pQ.empty[]]
    std::cout 

Bài Viết Liên Quan

Chủ Đề