繁体   English   中英

最小堆中第k个最小元素的复杂度分析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM