移位和移除头元素的最佳时间复杂度是多少?

时间:2011-08-13 18:47:09

标签: algorithm big-o

假设我有一个由三个元素{1,2,3}

组成的数据结构 如果我只想执行以下操作,那么什么样的数据结构和时间复杂度会给我带来最好的结果呢?

- 将最后一个元素移动到数据结构的“前” - 删除(现在)最后一个元素

我找到了这个页面:http://essays.hexapodia.net/datastructures/它说一个双链表对某些操作有O(1)?

但是,我需要每次都保留元素的顺序,以便我可以进行转换。如果我有{1,2,3}我想转移,得到3,1,2然后删除,留下3,1然后删除,留下1

如果我使用双链表,我的复杂性就是O(1)???

4 个答案:

答案 0 :(得分:5)

是的,删除和添加两端的元素是双链表中的O(1),它保持指向头部和尾部的指针。由于可以通过这两个操作实现移位,因此也是O(1)。

在循环链接列表中,您甚至可以通过

实现自己的移位操作(仍为O(1),但速度更快)
head = tail
if (tail != null) tail = tail.prev

答案 1 :(得分:1)

使用deque O(1)进行插入或删除。

答案 2 :(得分:1)

在我看来,如果旋转是你想要做的唯一一个操作,那么使用一个圆形数组(正常数组,其中头可以在尾部之后)

通过循环,您将节省 1.删​​除 2.插入

你所要做的就是改变头尾指针。

答案 3 :(得分:0)

双向链表的大多数实现都有指向头部和尾部的指针。因为你想把结尾移到前面,所以它通常是O(1),因为你有指向这些地方的指针。删除它们也很简单O(1),因为它只是将尾指针设置为其前一个链接。

但是,如果你没有尾指针并且链表不是循环的,那么删除和移位将不是O(1)。请务必检查实施情况。