【问题标题】:Why are heaps in c++ implemented as algorithms instead of containers?为什么 c++ 中的堆被实现为算法而不是容器?
【发布时间】:2011-03-10 06:49:46
【问题描述】:

我想知道为什么堆概念被实现为算法(make_heappop_heappush_heapsort_heap)而不是容器。我特别感兴趣的是一些人的解决方案也可以解释为什么setmap 是容器而不是类似的算法集合(make_set add_set rm_set 等)。

【问题讨论】:

  • 备案,有一个基于堆的容器:priority_queue
  • 为什么不呢?对于堆,您可以使用任何随机访问序列。不强迫您使用特殊容器是好的。人们应该尝试将事物解耦。不,集合和地图不能很好地使用序列。对这些使用实际的二叉树要容易得多。
  • 由于有些人似乎很困惑:kts指的是数据结构[en.wikipedia.org/wiki/Heap_(data_structure)],而不是free store。
  • @sellibitze:因为您可以轻松地将底层容器作为模板参数,例如heap<type, vector> h;
  • @Inverse:我同意,它不会是唯一的容器适配器。

标签: c++ algorithm stl heap


【解决方案1】:

STL 确实以 std::priority_queue 的形式提供了一个堆。 make_heap 等函数之所以存在,是因为它们在数据结构本身的领域之外使用(例如排序),并允许在自定义结构之上构建堆(例如用于“保持前 10 名”的堆栈数组)容器)。

以此类推,您可以使用 std::set 来存储排序列表,也可以使用 std::sort 对带有 std::adjacent_find 的向量进行排序; std::sort 用途更广泛,对底层数据结构的假设很少。

(请注意,std::priority_queue 实现实际上并不提供自己的存储;默认情况下,它创建一个 std::vector 作为其后备存储。)

【讨论】:

    【解决方案2】:

    一个明显的原因是您可以将元素排列为内部另一个容器的堆。
    因此,您可以在 vectordeque 甚至 C 数组上调用 make_heap()

    【讨论】:

      【解决方案3】:

      堆是一种特定的数据结构。标准容器具有复杂性要求,但没有指定如何实现它们。这是一个很好但很重要的区别。您可以在几个不同的容器上make_heap,包括您自己编写的一个。但是setmap 不仅仅意味着一种排列数据的方式。

      换句话说,标准容器不仅仅是其底层数据结构。

      【讨论】:

        【解决方案4】:

        堆* 几乎总是使用数组作为底层数据结构来实现。因此,它可以被认为是一组对数组数据结构进行操作的算法。这是 STL 在实现堆时采用的路径 - 它适用于任何具有随机访问迭代器(标准数组、向量、双端队列等)的数据结构。

        您还会注意到 STL priority_queue 需要一个容器(默认情况下是一个向量)。这本质上是您的堆容器 - 它在您的底层数据结构上实现了一个堆,并为所有典型的堆操作提供了一个包装容器。

        *特别是二进制堆。其他形式的堆(二项式、斐波那契等)则不是。

        【讨论】:

          【解决方案5】:

          嗯,堆并不是真正意义上的通用容器,与集合或映射具有相同的意义。通常,您使用堆来实现一些其他抽象数据类型。 (最明显的是优先队列。)我怀疑这是不同处理的原因。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-10
            • 2017-06-29
            • 2012-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-16
            • 2016-11-29
            相关资源
            最近更新 更多