簡體   English   中英

在std :: vector線性時間操作中是否為delete()?

[英]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) ,因為pq是常數,那么您將不得不復制/移動范圍(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM