优先级树是二叉树,每当v是u的子节点时,优先级(u)≥priority(v)

时间:2016-03-19 19:14:24

标签: algorithm math heap time-complexity priority-queue

优先级树是二叉树,每当v是u的子节点priority(u) ≥ priority(v)时。那 是的,它是一个堆,不一定是完整的树。

(a)让H1和H2成为树的两个堆。描述产生优先级的有效方法 包含H1和H2所有元素的树。该操作应该花费时间O(log(|H1| + |H2|)),其中|H|表示堆H中的元素数。

我尝试过几种不同的方法但却无法获得合适的时间复杂度。有人能指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:0)

免责声明:您对"优先树的定义"是一个简单的小堆。所以基本上你的问题只是将两个堆合并为一个。

一个简单的方法是:使用较小的根获取堆并将另一个堆合并到其中。从插入的堆的根开始并遵循任意路径,直到节点的值大于要插入的堆的根。将该节点替换为要插入的堆。现在您已经有了一个要插入的新堆(刚刚从堆中删除的堆)。从刚插入的节点开始,直到要插入的堆最终为空,继续上面的操作。

//if at least one heap is empty, the job is already done
if H1.isEmpty()
    return H2
if H2.isEmpty()
    return H1

//select heap to insert into and heap to be inserted
node insInto, toIns, prntInsInto
if H1.getRoot() > H2.getRoot()
    insInto = H2.getRoot()
    toIns = H1.getRout()
else
    insInto = H1.getRoot()
    toIns = H2.getRoot()

heap result = insInto
//merge
while toIns != null
    if insInto == null
       //we've run to the lower end of the heap to insert into
       //just append the heap to insert and youre done
       prntInsInto.setLeftChild(toIns)
       return result

    if insInto > toIns
       //replace node in heap into which is insert with the root of the heap to insert
       prntInsInto.replace(insInto , toIns)

       //removed subtree becomes new heap to insert
       //and inserted subtree becomes new heap into which is inserted
       node tmp = toIns
       toIns = insInto
       insInto = tmp

   //I selected the left child for the search, this is
   //completely random, you could even replace it with the
   //larger of the two children for better efficiency 
   prntInsInto = insInto
   insInto = insInto.leftChild()

return result

此算法使用以下事实:min-heaps可以递归定义为H = (N , L , R),其中N是堆的根,LR分别是O(log |H1| + log |H2|)左右儿童也是如此。

这个算法以最差演员O(|H1| + |H2|)运行。更快是不可能的。

编辑:
刚注意到评论说堆被存储为数组。在这种情况下,对数运行时根本不可能,因为必须遍历所有元素才能实现该运行时。因此,O(1)将是您在这种情况下可以做的最好的事情,因为上述算法依赖于这样一个事实:可以在.Down中操纵已经存在的数据结构,这不是为数组提供的。 / p>