你問一些非常有效的問題,但不幸的是他們都是那種模糊的,所以我們不能給你一個100%固體「行業標準」的答案。不過,我會盡力去超過你的觀點呢:
編程風格明智的,堆是一個黑箱抽象掉優先級隊列的細節
從技術上講,優先隊列是抽象接口(插入具有優先級的元素,提取最低優先級的元素),堆是具體實現(基於數組的堆,二項堆,斐波那契堆等)。
我想說的是,使用數組只是實現優先級隊列的一種特殊方式。
現在,如果我們需要維護一個散列表,它將頂點鍵映射到堆數組中的相應索引,那麼這需要在堆實現中完成,對吧?
是的,因爲每次移動數組內的元素時,都需要更新散列表中的索引。
但是大多數標準堆並不提供這樣的映射的散列表。
是。這可能非常煩人。
解決這個問題的另一種方法是無論任何事情,都可以將放鬆的頂點添加到堆中。
我想這可以工作,但我不認爲我見過任何人這樣做。在這裏使用堆的關鍵是要提高性能,並在堆中添加多餘的元素,這是違背它的。當然,你保留優先隊列的「黑盒子」,但我不知道這是否值得。另外,額外的pop_heap操作可能會對你的漸近複雜性產生負面影響,但我不得不做數學檢查。
處理這個問題的典型方法是什麼?
首先,問問自己是否可以使用啞數組而不是優先級隊列。 當然,現在找到O(N)中的最小元素而不是O(log n),但實現是最簡單的(本身就是一個優點)。此外,如果圖形密集,並且即使圖形稀疏,使用數組效果也會一樣高,這取決於圖形的大小。
如果你確實需要一個優先級隊列,那麼你將不得不找到一個執行了reduceKey操作的隊列。如果你找不到它,我會說它自己實現它並不壞 - 它可能比試圖找到一個現有的實現然後試圖使其與其他代碼相適應更麻煩。
最後,我會不是建議使用真正的花式堆數據結構(如斐波那契堆)。雖然這些經常出現在教科書中作爲獲得最佳漸近線的方法,但實際上它們具有可怕的常數因子,與對數相比,這些常數因子是顯着的。
請問我有什麼不清楚。我會很樂意澄清... – batman