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

时间:2015-07-08 11:28:40

标签: algorithm 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)。 这是对的吗?

1 个答案:

答案 0 :(得分:2)

您的代码,事实上,它的整个方法 - 完全错误,IIUC。

在经典的min-heap中,你唯一知道的是从根到子节点的每条路径都是不减少的。没有其他约束,特别是路径之间没有约束。

第一个 2 k 元素中 k -th最小元素可以 where 。如果你只是使用整个堆的数组内置&amp;使用经典堆算法维护,任何解决方案都必须Ω(min(n,2 k ))。下面的任何内容都需要对阵列结构,附加数据结构或两者的额外要求。