make_heap有什么意义?

时间:2009-06-03 21:36:51

标签: c++ stl language-design

有人可以告诉我像std::make_heap这样的STL堆函数模板吗?为什么有人会使用它们?有实际用途吗?

7 个答案:

答案 0 :(得分:42)

算法和数据结构中的一个类可以很好地回答你的直接问题。堆在计算机科学中的算法中被广泛使用。要引用下面链接的make_heap函数,“堆是一个树,其中每个节点链接到不大于其自身值的值。”虽然堆有很多应用程序,但是当您想要有效地跟踪N个值的排序列表时,我最常使用的是搜索问题。

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

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

STL堆函数背后的想法是,它们允许您从几个不同的底层STL容器中创建堆数据结构,包括std :: vector。如果您想要传递容器以在程序中的其他位置使用,这可能非常有用。它也有点好看,因为如果你选择使用除std :: vector之外的其他东西,你可以选择堆的底层容器。您真正需要的是以下内容:

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

这意味着您可以将许多不同的容器放入堆中。比较器在方法签名中也是可选的,您可以阅读有关make_heap函数的STL页面中可以尝试的不同内容的更多信息。

链接:

答案 1 :(得分:20)

如果你想从列表中输出priority queue,那么你可以使用make_heap:

  

在内部,堆是一棵树   每个节点链接到不大的值   比它自己的价值。在生成的堆中   通过make_heap,具体位置   树中的元素而不是   由记忆消耗决定   链接由其绝对决定   在序列中的位置,*先   永远是最高价值的   堆。

     

堆允许添加或删除元素   从它在对数时间使用   函数push_heap和pop_heap,   它保留了它的堆属性。

答案 2 :(得分:7)

您应该使用std::make_heap()以及std::push_heap()std::pop_heap()来维护矢量或数组之上的二进制堆;后两个函数保持堆不变。您还可以使用std::heap_sort()对这样的堆进行排序。虽然您可以使用std::priority_queue作为优先级队列,但它不会让您进入它的内部,这可能是您想要做的。此外,std::make_heap()std::heap_sort()共同构成了一种在C ++中执行heapsort的非常简单的方法。

答案 3 :(得分:7)

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

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

我自己只使用了一次堆操作,因为我需要使用一个向量作为优先级队列一段时间然后对它进行排序。您很可能永远不需要std::make_heap

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

答案 4 :(得分:5)

构造[二进制]堆基本上有两种方法:创建一个空堆并一次一个地插入每个元素,或者获取一系列值并将它们堆化。

堆上的每个推送操作都需要O(logn)时间,因此如果要将N个项目推送到堆上,则需要O(NlogN)时间。但是,从值数组构建二进制堆只需要O(N)时间。

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

答案 5 :(得分:4)

除了上述内容之外,STL的排序算法是introsort,它是quicksort和heapsort的混合体(如果前者表现不佳,它会从快速排序到heapsort故障转移)。 make_heap创建一个堆结构,这是运行heapsort所必需的,这是introsort所必需的。

答案 6 :(得分:2)

它们用于构建和维护Heap data structure