簡體   English   中英

在頂部插入時,雙端隊列是否提供O(1)復雜性

[英]Does deque provide O(1) complexity when inserting on top

我瀏覽了這篇文章,指出雙端隊列在頂部和底部提供有效插入,但是這里的這篇文章指出,雙端隊列的時間復雜度是O(n)。我認為如果雙端隊列在頂部具有有效插入和底部插入時,它將具有O(1),而向量僅應在底部插入時具有O(1)。 如果有人可以澄清這一點,我將不勝感激

從C ++標准:

23.3.3.4雙端修飾符[deque.modifiners]

[...]
void push_front(const T& x);
void push_front(T&& x);
void push_back(const T& x);
void push_back(T&& x);

[...]

3復雜度:復雜度是線性的,要插入的元素數量加上到雙端隊列開始和結束的距離中的較小者。 在雙端隊列的開始或末尾插入單個元素總是花費固定的時間,並導致對T的構造函數的單個調用。

重點礦

C ++ 98,第23.2.1節(模板類雙端隊列)

“雙端隊列...支持在開始或結束時進行恆定時間的插入和擦除操作;在中間的插入和擦除操作采用線性時間。也就是說,雙端隊列特別針對在開始和結束時推送和彈出元素進行了優化與向量一樣,存儲管理是自動處理的。”

是的:兩端都插入O(1)。

std :: deque的cppreference條目具有以下復雜性:

雙端隊列常見操作的復雜性(效率)如下:

  • 隨機存取-常數O(1)
  • 在末尾插入或刪除元素-攤銷常數O(1)
  • 元素的插入或移除-線性O(n)

這與C ++標准草案23.3.3.1節“ 類模板雙端隊列概述 ”一致(其中強調 ):

雙端隊列是一個序列容器,它像矢量(23.3.6)一樣,支持隨機訪問迭代器。 此外,它還支持在開始或結束時進行恆定時間的插入和擦除操作。 在中間插入和擦除需要線性時間。 也就是說, 雙端隊列已針對在開頭和結尾處推送和彈出元素進行了特別優化 與向量一樣,存儲管理是自動處理的。

對於std :: vector cppreference說:

向量上常用運算的復雜度(效率)如下:

  • 隨機存取-常數O(1)
  • 最后插入或刪除元素-攤銷常數O(1)
  • 元素的插入或移除-距向量O(n)的末端的距離呈線性

這與標准草案第23.3.6.1節“ 類模板矢量概述”一致

向量是支持隨機訪問迭代器的序列容器。 另外, 它在末尾支持(攤銷)恆定時間插入和擦除操作。 在中間插入和擦除需要線性時間。 存儲管理是自動處理的,盡管可以提供一些提示以提高效率。[...]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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