时间复杂度:删除deque的元素
Time complexity: deleting element of deque
删除collections.deque
的一个元素的时间复杂度是多少?
例如:
deq = collections.deque([1, 2, 3])
del deq[1]
总结
时间复杂度为 O(n),其中 n 是到最近端点的距离。 deque 的总大小无关紧要。
原因
deque的实现是一个固定长度块的双向链表。删除一个元素需要在删除点和最近的端点之间单独移动所有元素。
插图
考虑以下示例:
>>> d = deque('abcdefghijklmnop')
>>> del d[3]
为便于说明,假设以下数据布局的块大小为 3(实际块大小为 64):
ab ⇄ cde ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op # State before deletion
× # Step 1, delete "d"
ab ⇄ c-e ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op
→ # Step 2, move "c" to right
ab ⇄ -ce ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op
→ # Step 3, move "b" to right
a- ⇄ bce ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op
→ # Step 4, move "a" to right
a ⇄ bce ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op # Final state after deletion
可以看到,被删除的元素和结束点之间的数据元素都要向右移动一位。
如果 "k" 被删除,元素 "lmnop" 将全部向左移动一位。该算法足够聪明,可以朝着最近的终点努力。
删除collections.deque
的一个元素的时间复杂度是多少?
例如:
deq = collections.deque([1, 2, 3])
del deq[1]
总结
时间复杂度为 O(n),其中 n 是到最近端点的距离。 deque 的总大小无关紧要。
原因
deque的实现是一个固定长度块的双向链表。删除一个元素需要在删除点和最近的端点之间单独移动所有元素。
插图
考虑以下示例:
>>> d = deque('abcdefghijklmnop')
>>> del d[3]
为便于说明,假设以下数据布局的块大小为 3(实际块大小为 64):
ab ⇄ cde ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op # State before deletion
× # Step 1, delete "d"
ab ⇄ c-e ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op
→ # Step 2, move "c" to right
ab ⇄ -ce ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op
→ # Step 3, move "b" to right
a- ⇄ bce ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op
→ # Step 4, move "a" to right
a ⇄ bce ⇄ fgh ⇄ ijk ⇄ lmn ⇄ op # Final state after deletion
可以看到,被删除的元素和结束点之间的数据元素都要向右移动一位。
如果 "k" 被删除,元素 "lmnop" 将全部向左移动一位。该算法足够聪明,可以朝着最近的终点努力。