- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
min-max 堆可用于实现双端优先级队列,因为它的 find-min
和 find-max
操作时间恒定。我们还可以在 O(log2 n) 时间内检索最小-最大堆中的最小和最大元素。但有时,我们可能还想删除最小-最大堆中的任何节点,这可以在 O(log2 n) 中完成,根据 paper which introduced min-max heaps :
...
The structure can also be generalized to support the operation
Find(k)
(determine the kth smallest value in the structure) in constant time and the operationDelete(k)
(delete the kth smallest value in the structure) in logarithmic time, for any fixed value (or set of values) ofk
....
我如何准确地删除最小-最大堆上的第 k 个元素?
最佳答案
我不认为自己是算法和数据结构领域的“专家”,但我对二叉堆有详细的了解,包括最小-最大堆。例如,请参阅我关于二进制堆的博客系列,从 http://blog.mischel.com/2013/09/29/a-better-way-to-do-it-the-heap/ 开始.我有一个最小-最大实现,我会在某个时候写下来。
Your solution to the problem是正确的:当您删除任意节点时,您确实必须向上冒泡或向下筛选以重新调整堆。
删除最小-最大堆中的任意节点与最大堆或最小堆中的相同操作没有根本区别。例如,考虑删除最小堆中的任意节点。从这个最小堆开始:
0
4 1
5 6 2 3
现在,如果您删除节点 5,您将拥有:
0
4 1
6 2 3
您将堆中的最后一个节点 3 放在 5 所在的位置:
0
4 1
3 6 2
在这种情况下,您不必向下筛选,因为它已经是一片叶子,但它不合适,因为它比其父级小。您必须将其冒泡以获得:
0
3 1
4 6 2
同样的规则适用于最小-最大堆。您将要删除的元素替换为堆中的最后一项,并减少计数。然后,您必须检查它是否需要起泡或过筛。唯一棘手的部分是逻辑根据项目是处于最低级别还是最高级别而有所不同。
在您的示例中,第一个操作(将 55 替换为 31)产生的堆无效,因为 31 小于 54。因此您必须将其向上冒泡到堆中。
另一件事:删除任意节点确实是一个 log2(n) 操作。然而,找到要删除的节点是一个 O(n) 操作,除非您有一些其他数据结构来跟踪节点在堆中的位置。因此,一般来说,删除任意节点被认为是 O(n)。
关于algorithm - 如何删除最小-最大堆上的第 k 个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392864/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我们可以说 O(K + (N-K)logK)相当于O(K + N logK)对于 1 < = K <= N ? 最佳答案 简短的回答是它们不等价,这取决于k 的值。如果k等于N,那么第一个复杂度是O(
我有以下解决方案,但我从其他评论者那里听说它是 O(N * K * K),而不是 O(N * K)其中 N 是 K 列表的(最大)长度,K 是列表的数量。例如,给定列表 [1, 2, 3] 和 [4,
我试图理解这些语法结构之间的语义差异。 if ((i% k) == (l % k) == 0) 和 if ((i % k) == 0 && (l % k) == 0) 最佳答案 您的特定表达式((i
我有时会使用一维数组: A = np.array([1, 2, 3, 4]) 或 2D 阵列(使用 scipy.io.wavfile 读取单声道或立体声信号): A = np.array([[1, 2
在文档聚类过程中,作为数据预处理步骤,我首先应用奇异向量分解得到U、S和Vt 然后通过选择适当数量的特征值,我截断了 Vt,这让我从阅读的内容中得到了很好的文档-文档相关性 here .现在我正在对矩
我问的是关于 Top K 算法的问题。我认为 O(n + k log n) 应该更快,因为……例如,如果您尝试插入 k = 300 和 n = 100000000,我们可以看到 O(n + k log
这个问题与另一个问题R:sample()密切相关。 。我想在 R 中找到一种方法来列出 k 个数字的所有排列,总和为 k,其中每个数字都是从 0:k 中选择的。如果k=7,我可以从0,1,...,7中
我目前正在评估基于隐式反馈的推荐系统。我对排名任务的评估指标有点困惑。具体来说,我希望通过精确度和召回率来进行评估。 Precision@k has the advantage of not requ
我在 Python 中工作,需要找到一种算法来生成所有可能的 n 维 k,k,...,k 数组,每个数组都沿轴有一行 1。因此,该函数接受两个数字 - n 和 k,并且应该返回一个数组列表,其中包含沿
我们有 N 对。每对包含两个数字。我们必须找到最大数 K,这样如果我们从给定的 N 对中取 J (1 2,如果我们选择三对 (1,2),我们只有两个不同的数字,即 1 和 2。 从一个开始检查每个可能
鉴于以下问题,我不能完全确定我当前的解决方案: 问题: 给定一个包含 n 元素的最大堆,它存储在数组 A 中,是否可以打印所有最大的 K 元素在 O(K*log(K)) 中? 我的回答: 是的,是的,
我明白了: val vector: RDD[(String, Array[String])] = [("a", {v1,v2,..}),("b", {u1,u2,..})] 想转换成: RDD[(St
我有 X 个正数,索引为 x_i。每个 x_i 需要进入 K 组之一(其中 K 是预先确定的)。令 S_j 为 K_j 中所有 x_i 的总和。我需要分配所有 x_i 以使所有 S_j 的方差最小化。
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在研究寻找原始数的算法,看到下面的语句,我不明白为什么。 while (k*k <= n) 优于 while (k <= Math.sqrt(n)) 是因为函数调用吗?该调用函数使用更多资源。 更
我想找到一种尽可能快的方法来将两个小 bool 矩阵相乘,其中小意味着 8x8、9x9 ... 16x16。这个例程会被大量使用,所以需要非常高效,所以请不要建议直截了当的解决方案应该足够快。 对于
有没有一种惯用的方法来获取 Set和 Function ,并获得 Map实时取景? (即 Map 由 Set 和 Function 组合支持,例如,如果将元素添加到 Set ,则相应的条目也存在于 M
这个问题在这里已经有了答案: Can a local variable's memory be accessed outside its scope? (20 个答案) returning addr
给定一个矩阵:- k = [1 2 3 ; 4 5 6 ; 7 8 NaN]; 如果我想用 0 替换一个数字,比如 2,我可以使用这个:k(k==2) =
我是一名优秀的程序员,十分优秀!