感谢RunOrVeith撰写原始问题(Check if x is bigger than k-th smallest number in a min-heap )和杜克林提供答案。它有助于我更好地理解分析。
但是,关于这个主题,我还有另一个基本问题。
以下实现来自Skiena的教科书。我了解两个停止条件 1.当计数达到零时,我们发现小于x的k个数字和 2.没有更多要比较的节点。
我听到一个关于为什么算法正确的论点是,无论n的大小如何,搜索都将在我们查看2k个节点后立即终止,并且在找到足够多的小于x和如果我们找不到它们,那是因为我们找到了足够多的较大的物体,从而阻止了这种可能性。这个想法似乎是正确的,但是我不能用数学的方式提出这个想法,有人可以帮忙吗?
有人可以提供一些建议吗?
int pq_young_child(int n)
{
return 2 * n;
}
int heap_compare(priority_queue *q, int i, int count, int x)
{
if ((count <= 0) || (i > q->n)) return(count);
if (q->q[i] < x) {
count = heap_compare(q, pq_young_child(i), count-1, x);
count = heap_compare(q, pq_young_child(i)+1, count, x);
}
return(count);
}