给定二进制堆,我需要在O(log n loglog n)中创建一个包含堆中最小log n项的排序数组。
当然我尝试了删除最小log n次的天真方法,但是需要O(log 2 (n))。我不知道如何改进。
感谢您的帮助,谢谢。
答案 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);
}