[英]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中的文章。 其中介紹了如何快速獲取數據結構。 他提到了一個“便宜列表”,就像為最近的節點提供了一個高速緩存,並且避免了對尋路數據結構的許多懲罰。
我認為A *搜索優先級隊列的基於矢量的數據結構不是一個好主意,因為您將不斷在列表中的某個位置添加單個元素。 如果邊緣較大(我認為這是您的操作方式),並且要在中間添加元素,則效率很低。
幾周前,當我用Java實現A *時,我使用了Java PriorityQueue,它顯然是基於優先級堆的,這似乎是一種很好的方法。 我建議在C ++中使用set
。
編輯:謝謝妮基。 現在,我了解了如何(使用數組)實現二進制堆,並且了解了您實際上在問什么。 我懷疑priority_queue
是最好的選擇,盡管(如Igor所說)將它交換到一set
以檢查其性能並不困難。 我猜測存在使用二進制堆實現優先級隊列(至少在Java和C ++中)的原因。
使用優先級隊列。 基於二進制的堆是好的(就像基於向量的std優先級隊列一樣)。 您可以在O(n)時間內構建堆,所有相關事件操作都需要O(logn)。 除此之外,您還可以實現對a *有用的減少鍵操作。 但是,為std隊列實現它可能很棘手。 用集合執行此操作的唯一方法是刪除元素,然后以其他優先級將其重新插入。
編輯:您可能想研究使用
std::make_heap
(和相關功能)。 這樣,您就可以訪問向量,並且可以輕松實現reduce_key。
編輯2:我看到您打算使用make堆,所以您要做的就是實現reduce鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.