[英]complexity analysis of kth smallest element in min heap
我正在努力寻找最小堆中的第k
个最小元素。 我有一个为此的代码,其复杂度为O(k log k)
。 我试图将其提高到O(k)
。
下面是代码。
struct heap{
int *array;
int count;
int capacity;
};
int kthsmallestelement(struct heap *h,int i,int k){
if(i<0||i>=h->count)
return INT_MIN;
if(k==1)
return h->array[i];
k--;
int j=2*i+1;
int m=2*i+2;
if(h->array[j] < h->array[m])
{
int x=kthsmallestelement(h,j,k);
if(x==INT_MIN)
return kthsmallestelement(h,m,k);
return x;
}
else
{
int x=kthsmallestelement(h,m,k);
if(x==INT_MIN)
return kthsmallestelement(h,j,k);
return x;
}
}
我的代码遍历堆中的k
元素,因此复杂度为O(k)
。 这是正确的吗?
您的代码,实际上是其整个方法,完全错误,IIUC。
在经典的最小堆中,您唯一了解的是从根到子级的每条路径都不会减少。 没有其他约束,特别是路径之间没有约束。
因此,第k个最小元素可以在前2 k个元素中的任何位置 。 如果仅使用通过经典堆算法构建和维护的整个堆数组,则任何解决方案都将是Ω(min(n,2 k )) 。 低于此的任何内容都将对阵列的结构,附加的数据结构或这两者都具有附加要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.