Heap在插入和删除方面很有效,但对于搜索操作,它需要进行O(n)比较。 为了改进搜索,我们修改堆并创建双子堆(beap),其中每个节点都有两个父节点。其余所有方面都与heap相同。在beap中搜索需要进行O(sqrt(2n))比较。
有人可以解释一下,我们如何通过对beap进行一些修改来进一步减少搜索任意节点所花费的时间。
提前致谢。
答案 0 :(得分:1)
1979年Research Report中描述了“双亲堆”。
这表明有两种改进O(sqrt(2n))搜索时间的方法:
通过对每个级别进行排序,并坚持级别i的所有节点都小于级别i + 1的所有节点...以便搜索可以通过二进制切割辅助,给出可敬的O(log (N))。毫不奇怪,插入变得更加复杂,仍然是O(sqrt(N))。
通过增加分支因子,使工作为O(立方根(N))
[但是,注意到问题的措辞,你已经找到了研究报告,所以我担心我不会告诉你很多。]
我是'堆'结构的忠实粉丝,是一个非常大的粉丝......但我认为理解它的局限是明智的。您的堆是运行优先级队列的一种非常好的方式。你的堆排序是一个很好的排序,有一个保证的上限 - 但平均而言不如快速排序那么好。对于其他任何事情......有更好的数据结构。
AVL树将为您提供O(log(n))搜索,插入和删除。哪个比O(sqrt(2n))更好(双关语)。更复杂的双父堆将进行O(log(n))搜索,但插入和删除仍然是O(sqrt(n))。如果你想要一个不需要节点指针的结构(比如堆)我肯定可以用这种方式创建一个AVL树。
对于n = 1000000(百万),O(log2(n))是~20而O(sqrt(2n))是~1414 ......很难对双父堆感到兴奋: - (
在我看来,这是一个有趣的想法,时间永远不会到来。 (或者,正如AA米尔恩在The Engineer中所说的那样 - 我们在这里“有一种好的刹车......”。)