algorithm - 查找最小堆是否有 k 个小于查询的元素

标签 algorithm heap time-complexity

我一直在挠头思考这个问题。我需要找到一个 O(k) 算法来确定最小堆是否有 k 个小于查询 q 的元素。

我试过这样的递归算法:

count = 0;
def kSmaller(H, q, k){
   if (root(H) == Null or root(H) >= q ) return;
   else {count++;
         if (count == k) return true;
         kSmaller(LeftChild(root(H), q, k)
         kSmaller(RightChild(root(H), q, k)
    }
}

但是在经历了一些最小堆示例之后,我不太明白如何在 O(k) 时间内终止而不是不必要地遍历每个元素。

谁能帮我理解如何处理这个问题?也许最好不要使用递归,而是将解决方案展平。

最佳答案

最小堆的排列方式是每个节点都小于它的两个子树中的所有节点。因此,您的代码将花费 O(k) 时间,因为当您看到大于或等于 q 值的节点时,您会切断递归。你可以画几个例子看看。如果最小堆有 p 个节点小于 q,那么你只需要 min(p,k) 时间,你看到了吗?

关于algorithm - 查找最小堆是否有 k 个小于查询的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35075794/

相关文章:

java - 堆数组 - 删除根

algorithm - 将任意 GUID 编码为可读的 ASCII (33-127) 的最有效方法是什么?

algorithm - 有效地重新平衡 2^n-1 个节点的树?

algorithm - 动态规划——油漆栅栏算法

c - 代码 θ(nLogn) 的时间复杂度如何?

c++ - 在优于 O(n) 的时间内找到链表中条目的索引

java - 涉及循环两个输入数组的解决方案: O(n + m) or O(n * m)

c# - 如何选择每周的最新日期时间? C#

java - 从集合构造 PriorityQueue 的时间复杂度是多少?

c++ - 数组大小调整中的内存错误