7得票2回答
二叉堆与d叉堆的区别

我已经阅读了二叉堆在删除最小值操作方面更快,而d元堆在降低优先级操作方面更快(尽管我不知道为什么),但是我也看到过4元堆相对于二叉堆在这两个操作方面都更快。 那么在什么情况下使用二叉堆?什么情况下使用d元堆?如何决定d元堆中的d值呢?

40得票9回答
纯函数式编程语言中高效堆的实现

作为Haskell练习,我正尝试实现堆排序。在命令式语言中,堆通常是以数组形式实现的,但在纯函数式语言中,这种方式会非常低效。因此,我研究了二叉堆,但是到目前为止,我找到的所有资料都是从命令式视角描述它们,所呈现的算法难以转换为函数式环境。如何在像Haskell这样的纯函数式语言中高效地实现堆...

29得票2回答
std::make_heap如何实现,同时最多只进行3N次比较?

我查阅了C++0x标准并发现其中规定make_heap函数所需的比较次数不应超过3*N。 也就是说,对于无序集合进行堆化操作的时间复杂度可以达到O(N)。 /* @brief Construct a heap over a range using comparison functor...

18得票2回答
如何确定堆的第k大元素是否大于x

考虑一个包含n个数字的二叉堆(根节点存储最大数)。给定正整数k < n和一个数x。您需要确定堆的第k个最大元素是否大于x。您的算法必须在O(k)时间内完成。您可以使用额外O(k)的存储空间。

9得票1回答
为什么堆比二叉树更适合表示优先队列?

在最大堆中,查找最大项很容易且时间复杂度为O(1),但是要删除它则需要O(log(n))的复杂度。因此,如果从堆中插入和删除都是O(log(n)),那么用堆表示优先队列有什么优势,而不是用二叉树呢?

14得票2回答
如何创建一个二叉堆,使其弹出最小值而不是最大值?

我可以使用std::collections::BinaryHeap来迭代一个结构体集合,通过pop方法按从大到小的顺序排列,但我的目标是按从小到大的顺序遍历整个集合。 我已经成功地通过反转Ord实现来实现了这一点:impl Ord for Item { fn cmp(&amp;sel...

64得票5回答
如何从priority_queue中删除非顶部元素?

在我的程序中,我需要从一个优先队列中删除一个不在顶部的元素。这可以做到吗?如果不能,请提供一种方法来实现,除了创建自己的堆之外。

8得票1回答
在二叉堆上实现一个迭代器

我正在寻找一种在二叉堆(最大或最小)上实现迭代器的方法。 也就是说,通过使用它的nextNode()函数第i次,可以获取堆中第i个(较大或较小)的元素。需要注意的是,此操作实际上并没有提取堆的根! 我的初步想法是: 1. 实际上提取i个元素,将它们推入堆栈中,然后在获取第i个值后重新将它...

18得票6回答
寻找二叉堆的最后一个元素

引用维基百科: 使用传统的二叉树数据结构实现二叉堆是完全可接受的。在添加元素时,当查找二叉堆上最后一层的相邻元素时,存在一个问题,这个问题可以通过算法方法来解决... 您有关于这种算法如何工作的任何想法吗? 我找不到任何关于此问题的信息,因为大多数二叉堆都是使用数组实现的。 非常感...

12得票4回答
二叉堆 vs 二项式堆 vs 斐波那契堆,关于优先队列性能的比较。

请问有人能解释一下,我应该如何决定在标题中提到的堆实现中使用哪一个? 我希望得到一个回答,指导我在根据问题需要选择结构的性能方面选择实现。目前,我正在进行优先队列,但我想知道不仅在此情况下最适合的实现方式,还要了解基本原理,使我可以在任何其他情况下选择实现方式... 另一个需要考虑的东西是...