make_heap有什么意义?

有人可以告诉我的STL堆函数像make_heap的重点? 为什么有人会使用它们? 有实际用途吗?

如果你想从列表中创build一个优先队列 ,那么你可以使用make_heap:

在内部,堆是一个树,每个节点链接到不大于其自己的值的值。 在make_heap生成的堆中,元素在树中的具体位置而不是由耗费内存的链接决定,取决于它在序列中的绝对位置,其中*首先始终是堆中的最高值。

堆允许使用函数push_heap和pop_heap在对数时间内添加或删除元素,这些函数保留堆属性。

你的直接问题可以由一个algorithm和数据结构的类来回答。 堆在计算机科学的algorithm中被广泛使用。 为了引用下面链接的make_heap函数,“堆是一个树,每个节点链接的值不大于它自己的值。 虽然堆有很多应用程序,但我最常用的应用程序是在search问题中,以便有效地跟踪N个值的sorting列表。

当我第一次遇到STL堆函数时,我有类似的困惑。 我的问题虽然有点不同。 我想知道“为什么stl :: vector不是和std堆在同一类的数据结构中? 我认为它应该像这样工作:

 std::heap< int > my_heap; my_heap.heap_insert( 7 ); my_heap.heap_insert( 3 ); 

STL堆函数背后的思想是允许你从几个不同的底层STL容器中构build一个堆数据结构,包括std :: vector。 如果你想在你的程序中的其他地方使用容器,这可能是非常有用的。 这也有点不错,因为如果你select使用std :: vector以外的东西,你可以select堆的底层容器。 你真正需要的是以下几点:

 template <class RandomAccessIterator> void make_heap ( RandomAccessIterator first, RandomAccessIterator last ); 

这意味着你可以将很多不同的容器放入一个堆中。方法签名中的比较器也是可选的,你可以阅读更多关于你可以在STL页面为make_heap函数尝试的不同的东西。

链接:

  • 堆数据结构
  • make_heap函数

std::make_heap应该几乎从来没有在实践中使用。 虽然堆对于优先级队列是有用的,但这并不能解释为什么要手动维护结构。 std::priority_queue有一个更有用的接口,如果你所需要的只是一个优先级队列。

如果直接使用make_heap及其兄弟,则每次更改基础容器时都必须确保使用它们。 我看过他们使用过两三次, 每次使用都不正确。

我只有一次直接使用堆操作,因为我需要使用一个向量作为优先级队列一段时间,然后对其进行sorting。 你很可能永远不需要std::make_heap

如果你需要一个能够更改元素的优先级队列,你可以使用std::set 。 您可以分别使用*s.begin()*s.rbegin()获取最小或最大的元素,并通过删除旧值并插入新元素来更新元素。

你应该使用std::make_heap()以及std::push_heap()std::pop_heap()来维护一个二进制堆在一个向量或数组之上; 后两个函数保持堆不变。 你也可以使用std::heap_sort()来sorting这样一个堆。 虽然你可以使用std::priority_queue作为优先级队列,但是它并不能让你理解它的内部,这也许是你想要做的。 另外, std::make_heap()std::heap_sort()一起构成了一个在C ++中进行heapsort的非常简单的方法。

除此之外,STL的sortingalgorithm是introsort ,它是quicksort和heapsort的混合体(如果前者做得不好,它会从quicksort转移到heapsort)。 make_heap创build一个堆结构,这是运行heapsort所需的,这是introsort所需要的。

基本上有两种方法来构造一个[二进制]堆:创build一个空的堆,并且每次插入一个元素,或者获取一个值的范围并对它们进行堆积。

堆上的每个push操作都需要O(logn)的时间,所以如果你将N个物品推入一个堆,它将花费O(NlogN)的时间。 但是,从一个数组中构build二进制堆只需要O(N)时间。

因此,将每个元素插入一个数组(或其他支持随机访问迭代器的容器),然后在数组上调用make_heap()比在插入时维护堆结构更有意义。

它们被用来构build和维护堆数据结构