2010-06-30 46 views
21

我想知道爲什麼堆概念實現爲算法(make_heap,pop_heap, push_heap,sort_heap)而不是容器。我特別感興趣的是某些人的解決方案也可以解釋爲什麼setmap是容器而不是類似的算法集合(make_set add_set rm_set等)。爲什麼C++中的堆實現爲算法而不是容器?

+4

爲了記錄在案,有一堆基於容器:'priority_queue'。 – avakar 2010-06-30 18:33:56

+0

爲什麼不能?對於堆,您可以使用任何隨機訪問序列。不要強迫你使用特殊的容器是好的。人們應該嘗試去分離事物。不,集合和地圖在使用序列時效果不佳。爲這些使用實際的二叉樹要容易得多。 – sellibitze 2010-06-30 19:06:35

+0

由於有些人似乎很困惑:kts指的是數據結構[http://en.wikipedia.org/wiki/Heap_(data_structure)],而不是免費的商店。 – 2010-06-30 21:18:02

回答

10

STL確實提供了std :: priority_queue形式的堆。 make_heap等功能在那裏,因爲它們在數據結構本身的領域之外使用(例如排序),並允許在定製結構之上構建堆(比如堆棧數組爲「保持前10位」容器)。通過類推,你可以使用一個std :: set存儲一個排序列表,或者你可以在std :: adjacent_find上使用std :: sort作爲一個向量; std :: sort是更通用的,並且對底層數據結構做了很少的假設。

(作爲一個說明,在std :: priority_queue實施實際上並沒有提供它自己的存儲;默認情況下它會創建一個std ::向量作爲其後備存儲)

1

那麼,堆不是一個真正的通用容器,就像集合或地圖一樣。通常,您使用堆來實現其他抽象數據類型。 (最明顯的是優先隊列。)我懷疑這是不同治療的原因。

5

一個明顯的原因是你可以將元素排列成裏面的另一個容器
因此,您可以撥打make_heap()vectordeque甚至C數組。

4

堆是一個特定的數據結構。標準容器具有複雜性要求,但未指定如何實施。這是一個很好但很重要的區別。你可以在幾個不同的容器上使用make_heap,包括你自己寫的一個容器。但setmap不僅僅是一種安排數據的方式。

換句話說,標準容器不僅僅是它的基礎數據結構。

4

堆*幾乎總是使用數組作爲基礎數據結構實現的。因此,它可以被認爲是對陣列數據結構進行操作的一組算法。這是STL在實現堆時所採用的路徑 - 它可以用於任何具有隨機訪問迭代器(標準數組,矢量,雙端隊列等)的數據結構。

您還會注意到STL priority_queue需要一個容器(默認情況下它是一個向量)。這實質上就是你的堆容器 - 它在你的底層數據結構上實現了一堆,併爲所有典型的堆操作提供了一個包裝容器。

*特別是二進制堆。其他形式的堆(二項式,斐波納契等)不是。

相關問題