[英]Is erase() in std::vector linear time operation?
頁面http://www.cplusplus.com/reference/vector/vector/erase/說
刪除元素(破壞)的元素數量加上最后一個元素刪除(移動)后的元素數量成線性關系。
因此,如果我要刪除某個元素,例如,從長度為n
(n> j)的向量中使用索引j
,它是常量還是線性(O(n))?
或者,如果我在p
Jth
元素之后有p
元素,那么它的階數為O(p)
-對嗎?
從向量中刪除N
元素將花費O(N)
的時間復雜度,因為應用程序必須迭代M
元素,並調用每個元素的析構函數,然后將其余元素復制到通過破壞已擦除元素而創建的間隙中。
因此,如果我們有一個包含N
元素的向量,並且從范圍(p,q]
刪除這些元素,則破壞范圍將需要O(qp)
時間復雜度,您可以說是O(1)
,因為p
和q
是常數,那么您將不得不復制/移動范圍(q,N]
。由於Nq
是線性的,所以時間復雜度為O(N)
。
我們在一起得到O(N) + O(1) = O(N)
當然,如果刪除以數組結尾結尾的范圍,則復雜度為O(1)
因為沒有要復制/移動的元素。
通過您提供的鏈接:
與刪除(破壞)的元素數量加上最后一個元素刪除(移動)后的元素數量成線性關系
這意味着從std::vector
刪除N = 1個元素時。 在您的情況下,將對析構函數進行N次調用,該調用等於1。 然后,您將進行等於(nj-1)
M個移動操作。 因此它不是線性的。
因此std :: vector :: erase的復雜度是: O(Deleted_Items_Count) + O(Moved_Items_Count)
。
在您的情況下: 1*Destructor_Time + (nj-1)*Moving_Time
為了在固定時間內從向量中擦除項目,您可以從向量的尾部擦除它們(例如std::vector::pop_back
)
因此,如果您要進行恆定時間的擦除而沒有排序的重要性:
auto linear_erase=[](auto& v, const size_t index){
std::swap(v[index], v.back());
v.pop_back();
};
我在SO上了解到該標准是最佳參考。
從23.3.11.1/1 [vector.overview]:
向量是序列容器,最后支持(攤銷)恆定時間插入和擦除操作。 在中間插入和擦除需要線性時間。
因此,在這種情況下, erase
既不是恆定時間也不是線性時間。
這主要取決於您執行的操作類型:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.