从堆中最小的log n tems创建排序数组

时间:2015-07-18 21:20:52

标签: algorithm data-structures

给定二进制堆,我需要在O(log n loglog n)中创建一个包含堆中最小log n项的排序数组。

当然我尝试了删除最小log n次的天真方法,但是需要O(log 2 (n))。我不知道如何改进。

感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:5)

只需对堆执行贪婪搜索,将其解释为常规二叉树。堆不变量意味着当您知道堆中最小的<section id="stats"> <div class="container"> <div class="row"> <div class="col-sm-8"> <h4>This is an infographic</h4> </div> <div class="col-sm-4"> <p>This is some supporting text</p> </div> </div> </div> </section> 项时,k最小的项必须是其子项之一。您可以为下一个最小的项构建所有候选项的第二个堆,并且该堆永远不会超过k+1,因此插入和删除需要O(log(n)),并且您需要插入O(log(log(n))个第二堆中的删除。这适用于在O(log(n))时间内查找堆中最小的k项,无论O(k*log(k))是什么。

以下是Python中的示例代码:

k

答案 1 :(得分:0)

以下“伪代码”在O(mlogn)中运行,其中m是堆中的项目数。这个数字肯定会影响运行时间,但我想你只关心变化与你想要存储的物品数量。

std::vector<heapItem*> myVect;
for each heap-item* p
{ 
  bool inserted = false;
  for(auto it= myVect.begin(); (it!=myVect.end()) && !inserted; ++it)
  { 
    if(p->itemSize > (*it).itemSize)
    {
      myVect.insert(it, p);
      inserted=true;
    }
  }
  if((myVect.size() < logn) && !inserted)
     myVect.push_back(p);
  else if(myVect.size() > logn)
     myVect.resize(logn);
}