binary-heap相关内容
我查看了 C++0x 标准,发现 make_heap 的比较次数不应超过 3*N. 即heapify 一个无序集合可以在 O(N) 中完成 /* @brief 使用比较函子在一个范围内构造一个堆. 这是为什么? 来源没有给我任何线索(g++ 4.4.3) while (true) + __parent == 0 不是线索,而是对 O(N) 行为的猜测 template空白m
..
我需要知道二叉堆和二叉堆之间的主要区别,不管它们的结构差异是什么,二叉堆只能有两个子堆(树表示),二叉堆可以有任意数量的子堆. 我实际上只是想知道以第一个孩子在一个节点上第二个有两个三分之一有四个等等的方式组织二叉树结构有什么特别之处? 如果,如果我们使用一些普通的树作为没有两个孩子限制的堆,然后应用联合过程,让一个堆成为其他堆的左孩子呢? 解决方案 二叉堆和二叉堆的主要区别在
..
斐波那契堆和二元堆在现实世界中的应用是什么?如果你能分享一些你用它解决问题的例子,那就太好了. 编辑:还添加了二进制堆.很想知道. 解决方案 您在现实生活中很少会用到.我相信斐波那契堆的目的是改善 Dijkstra 算法的渐近运行时间.对于非常非常大的输入,它可能会给您带来改进,但在大多数情况下,您只需要一个简单的二叉堆. 来自维基: 虽然a的总运行时间开始的操作序列空结
..
引用维基百科: 完全可以接受使用传统二叉树数据结构实现一个二叉堆.有寻找相邻的问题最后一层的元素添加元素时的二元堆可以解决算法上... 关于这种算法如何工作的任何想法? 我无法找到有关此问题的任何信息,因为大多数二进制堆都是使用数组实现的. 感谢任何帮助. 最近,我注册了一个 OpenID 帐户,但无法编辑我的初始帖子或评论答案.这就是我通过这个答案做出回应的原因.对
..
我已经为此苦苦挣扎了几个小时,我似乎也找不到答案.(关于Binary Heap的文章很多,但我没有这个特殊问题). 问题是: 对于具有1492个节点的二进制堆,高度为2的节点数为_ 187 _. 我了解到,在1492个节点的情况下,二进制堆的深度为log(1492)/log(2)= 10高度2应该有2 ^(10-2)个节点,应该是256 为什么答案是187? 谢谢
..
带有 Collection 的Java的PriorityQueue构造函数的复杂性是什么? 我使用了构造函数: PriorityQueue(Collection c) 复杂度是O(n)还是O(n * log(n))? 解决方案 从集合(甚至是未排序的集合)中初始化 PriorityQueue 的时间复杂度为O(n)。在内部,它使用称为 si
..
在我的程序中,我需要从不在顶部的优先级队列中删除一个元素。能做到吗?如果不是,请提出一个建议的方法,除了创建自己的堆。 解决方案 标准 priority_queue< ; T> 可以通过继承进行自定义。它具有受保护的成员 c 和 comp ,可以在子孙类中对其进行引用。 template class custom_priority_queue:公共
..
我可以使用std::collections::BinaryHeap以 greatst 到最低的顺序用pop遍历一个结构的集合,但是我的目标是遍历从最小到最大的集合. 我通过反转Ord实现而成功: impl Ord for Item { fn cmp(&self, other: &Self) -> Ordering { match self.offset {
..
我试图证明对于二进制堆,buildHeap最多进行元素之间的(2N-2)比较。 我很难证明这一主张。 解决方案 build-heap算法从中点开始并移动项目按要求减少。让我们考虑一堆127个项目(7个级别)。在最坏的情况下: 64个节点(叶级)根本不移动 32个节点向下移动一级 16个节点下移两个级别 8个节点下移三个级别 4个节点下移四个级别 2个节点下移五个级别
..
作为Haskell的练习,我试图实现heapsort。堆通常以命令式语言实现为一个数组,但这在纯功能语言中会非常低效。所以我研究过二进制堆,但到目前为止我发现的一切都是从一个强制性的观点来描述它们,并且所提出的算法很难转化为功能设置。如何有效地实现一个纯粹的函数式语言,如Haskell堆? 编辑:通过高效率我的意思是它应该仍然在O n * log n),但它不必击败C程序。另外,我想使用纯粹
..
我只是想学习二进制堆,并怀疑在二进制堆中进行删除操作。 我已经读过,我们可以从二进制堆中删除一个元素,我们需要重新处理它。 但是在以下链接中,它表示不可用: p> http://en.wikibooks.org/维基/数据结构/权衡 二进制搜索AVL树二进制堆(最小)二项式队列(最小) 查找O(log n)O(log n)不可用 删除元素O(log n O(log n)不可
..
这是我最近遇到的面试问题之一。 给定完整或几乎完整的二叉树的根地址,我们必须编写一个函数将树转换为最大堆。 这里没有涉及到数组。树已经建成。 例如, 1 / \ 2 5 / \ / \ 3 4 6 7 可以有任何可能的最大堆作为输出 - 7 / \ 3 6 / \ / \ 2 1 4 5 或
..
我需要知道二进制和二进制堆之间的主要区别,无论它们的结构差异如何,二进制堆只能有两个子代(树表示),二项式堆可以有任何数量的子代。 我实际上只是想知道如何组织二项式树结构,使得第一个孩子在一个节点上有二分之二有四个等等? 如果我们在没有两个孩子的限制的情况下使用一些正常的树,然后应用联盟过程,并且只剩下一堆剩下的另一个堆的左边的小孩? 解决方案 二进制堆和二叉树堆之间的关键区别
..
在(max)堆中,很容易在 O(1)时间中找到最大的项,但要实际删除它,需要复杂度 O(log(n))。 ,在二叉树上表示优先级队列的堆有什么优点? 解决方案 堆使用更少的内存。它们可以实现为数组,因此不存在用于存储指针的开销。 (二叉树可以被实现为一个数组,但是很可能有很多空的“间隙”,这会浪费更多的空间,比实现它们作为带有指针的节点)。 堆保证有log(n)的高度,因为
..
在我的程序中,我需要从不在顶部的优先级队列中删除一个元素。可以做到吗? 解决方案 标准 priority_queue 可以通过继承来定制。它具有可以在后代类中引用的受保护成员 c 和 comp 。 模板 class custom_priority_queue:public std :: priority_queue
..
在Weiss的数据结构和算法在Java中“,他解释道插入算法二叉堆正是如此 公共无效插入(ANYTYPE X) { 如果(currentSize == array.length -1) enlargeArray(array.length * 2 + 1); //渗滤液了 INT孔= ++ currentSize; 对于(数组[0] = X,则x.compareT
..
在实现为二叉树(其中每个节点存储一个指向它的父,左子和右子)的二进制最大堆,如果你有指向堆的根,你将如何实现一个插件操作?什么应该发生的是第一被插入在最后一行的最后一个元素节点。对于基于阵列的,你可以追加到数组,但树的基础的实施,你将如何找到正确的位置? 解决方案 如果你挂你新的顶点在你的树的任何叶子(左或右的继任者,无所谓),然后从这个新修的堆顶点顶端(即,关于每个其他顶点与继任者,将其交换
..
我已经创建了一个二元堆,从而重新presents优先级队列。这只是传统的众所周知的算法。这堆时间表不同的事件(排序关键是时间)的时间序列。 它支持2操作:插入和删除。堆的每个节点的关键是大于或等于它的每个孩子。然而,使用相同的密钥将事件并不preserve他们增加了,因为以后每次删除或插入的顺序被调用时,堆起来,堆向下突破的程序的顺序。 我的问题是:我应该在一个经典的算法改为preserve节
..
假设我们有n个元素的二进制堆和希望插入n多元素(不一定是另外一个后)。什么是为此所需的总时间? 我觉得这是THETA(N LOGN)作为一个插入需要LOGN。 解决方案 假设我们给出: 通过标准的二叉堆实施在优先级队列中的 ^ h (在数组实现) N 堆当前大小 我们有如下的插入属性: 在W(N)=最坏情况(N)=Θ(LG N)(西塔)。 - > W(N)=Ω(LG n)和W(N)=
..
我想我知道答案,最小的复杂性是 O(nlogn) 但有什么办法,我可以从堆的二叉搜索树中的 O(N)的复杂性? 解决方案 没有算法从堆为O建设BST(n)的时间。这样做的原因是,给定n个元素,你可以从他们的O(n)的时间建立一个堆。如果你有一个BST为一组值,你可以做一个序遍历对它们进行排序在O(n)时间。如果你可以从一个堆为O建立BST(n)的时间,然后你可以用有一个O(n)的排序算法
..