簡體   English   中英

A *優先級隊列的C ++設置與向量+堆操作

[英]c++ set versus vector + heap operations for an A* priority queue

什么時候使用std :: set效率(寫入時間)比對A *操作中的優先級隊列使用std :: vector和make_heap/push_/pop_更為有效? 我的猜測是,如果打開列表中的頂點很小,則使用矢量是更好的選擇。 但是有人有經驗嗎?

如果我不得不冒險猜測? 我猜矢量版本可能是一個不錯的選擇,因為一旦它增長到一定的大小,就不會有太多的分配。

但是我不喜歡猜測。 我更喜歡硬數字。 嘗試一下,個人資料!

如果您要進行A *尋路工作,請查看Dan Higgins的AI Wisdom中的文章。 其中介紹了如何快速獲取數據結構。 他提到了一個“便宜列表”,就像為最近的節點提供了一個高速緩存,並且避免了對尋路數據結構的許多懲罰。

http://introgamedev.com/resource_aiwisdom.html

我認為A *搜索優先級隊列的基於矢量的數據結構不是一個好主意,因為您將不斷在列表中的某個位置添加單個元素。 如果邊緣較大(我認為這是您的操作方式),並且要在中間添加元素,則效率很低。

幾周前,當我用Java實現A *時,我使用了Java PriorityQueue,它顯然是基於優先級堆的,這似乎是一種很好的方法。 我建議在C ++中使用set

編輯:謝謝妮基。 現在,我了解了如何(使用數組)實現二進制堆,並且了解了您實際上在問什么。 我懷疑priority_queue是最好的選擇,盡管(如Igor所說)將它交換到一set以檢查其性能並不困難。 我猜測存在使用二進制堆實現優先級隊列(至少在Java和C ++中)的原因。

  1. 對於A *搜索,我將使用基於std :: vector的優先級隊列。
  2. 但是,從std :: vector到另一個STL容器的實現更改應該是微不足道的,因此我將嘗試不同的版本,並觀察它如何影響算法性能。 除了stl :: map,我肯定會嘗試stl :: deque。

使用優先級隊列。 基於二進制的堆是好的(就像基於向量的std優先級隊列一樣)。 您可以在O(n)時間內構建堆,所有相關事件操作都需要O(logn)。 除此之外,您還可以實現對a *有用的減少鍵操作。 但是,為std隊列實現它可能很棘手。 用集合執行此操作的唯一方法是刪除元素,然后以其他優先級將其重新插入。

編輯:您可能想研究使用

std::make_heap

(和相關功能)。 這樣,您就可以訪問向量,並且可以輕松實現reduce_key。

編輯2:我看到您打算使用make堆,所以您要做的就是實現reduce鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM