删除collections.deque
的元素的时间复杂度是多少?
E.g:
deq = collections.deque([1, 2, 3])
del deq[1]
时间复杂度为O(n),其中n是到最近端点的距离。 deque的总大小无关紧要。
>>> d = deque('abcdefghijklmnop')
>>> del d[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”将全部向左移动一个。该算法足够智能,可以朝最接近的终点工作。
当n是到最近端点的距离时,时间复杂度为O(n)。 deque的总大小无关紧要。
索引访问在两端均为O(1),但在中间速度减慢至O(n)。要进行快速随机访问,请使用列表。