在O(logn)中添加,删除和插入元素

时间:2015-05-04 07:21:45

标签: python algorithm data-structures

我们被要求创建一个在最坏情况下在O(logn)

中运行的算法

算法由3个函数组成:getmin();getmax();add();

第一个弹出堆栈中的最小元素,然后返回它; getmax弹出堆栈中最大的元素并返回它; 在库中添加put元素。

我正想着一棵RB树;但我意识到我自己很难实现(从零开始)。

还有其他树或数据结构实现起来不那么复杂,而且运行在O(logn)?

我只能使用基本的python操作(即只列表,..)

1 个答案:

答案 0 :(得分:2)

我建议Treap。在我看来,它是最容易实现的平衡二进制搜索树,因为你只需要2个基本旋转。

  

要搜索给定的键值,请在二叉搜索树中应用标准二进制搜索算法,忽略优先级。

     

要在treap中插入新密钥x,请为x生成随机优先级y。在树中二进制搜索x,并在叶子位置创建一个新节点,其中二进制搜索确定x的节点应该存在。然后,只要x不是树的根并且具有比其父z更大的优先级数,就执行树旋转以反转x和z之间的父子关系。

     

要从treap中删除节点x,如果x是树的叶子,只需将其删除即可。如果x有一个子z,则从树中删除x并使z成为x的父项的子项(如果x没有父项,则使z成为树的根)。最后,如果x有两个子节点,则将其在树中的位置与其直接后继z的位置按排序顺序交换,从而导致之前的一个案例。在最后一种情况下,交换可能会违反z的堆排序属性,因此可能需要执行额外的轮换才能恢复此属性。

获得最小值和最大值可以通过从根向左移动最小值来完成,并且最大限度地向右移动。