排序数组或排序链表支持O(1)
减少或增加键(假设没有/最少重复,请参阅第 4 段)。这是因为,如果您考虑一下,您最多需要交换 2 个元素来进行减键或增键操作。
不是实践中最好的数据结构(尽管它们有自己的位置),但仍然是一个答案。
唯一的限制是您需要一个指向该节点的指针才能开始,因为它已经O(log n)
分别O(n)
用于查找该节点。
如果有重复,则移动可能O(n)
对两者都采取最坏的情况(如果大多数值相同),这是非常糟糕的。但是,对于链表,应该可以O(1)
通过具有某种链表的链表来获得,其中大链表中的每个节点代表一个特定的值,并且从那里的每个链表代表所有节点等于那个值。
我关于为什么 BBST 或跳过列表不起作用的原始答案:
(没有删除,因为浪费似乎很可惜)
对于 BBST 或跳过列表来说,最坏的情况小于O(log n)
移动单个元素是不可能的,尽管据我所知,它至少与 re-insert 一样有效。平均情况可能小于O(log n)
.
我们正在寻找它 -查找只是为了找到您想要移动的元素的位置,O(log n)
显然您需要这样做。
如果您出于某种奇怪的原因已经拥有该职位:
为什么最坏情况的移动不能少于O(log n)
BST:考虑当试图移动根并且下一个元素位于树的高度时(例如,右孩子有一个左孩子,一个左孩子有一个左孩子左孩子...下降到树的高度)。你需要O(log n)
找到它。
为什么最坏情况下的移动不能少于O(log n)
跳过列表:考虑一个存在于O(log n)
列表中的项目,然后是一个存在于O(log n)
这些列表中的项目(如果可能的话,从图片中可以看出,我对跳过列表有点基本)。您显然需要交换O(log n)
列表中的适用项目。
如果您已经拥有该职位,则可能存在一个有效的有序结构,但可能不适用于任何基于树的结构(因为上面提出的论点),据我所知,大多数有效的有序结构结构。