我正在努力寻找最小堆中的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)
。
这是对的吗?
答案 0 :(得分:2)
您的代码,事实上,它的整个方法 - 完全错误,IIUC。
在经典的min-heap中,你唯一知道的是从根到子节点的每条路径都是不减少的。没有其他约束,特别是路径之间没有约束。
第一个 2 k 元素中 k -th最小元素可以 where 。如果你只是使用整个堆的数组内置&amp;使用经典堆算法维护,任何解决方案都必须Ω(min(n,2 k ))。下面的任何内容都需要对阵列结构,附加数据结构或两者的额外要求。