簡體   English   中英

在 while 循環中排序的列表 stl 的時間復雜度

[英]time complexity for list stl with sort in a while loop

以下代碼的時間復雜度是多少:

while(!list.empty()) {
    list.sort();
    a = list.front();
    list.pop_front(); 
    b = list.front();
    list.pop_front();
    /** do something calculations*/
}

每次調用list.sort()都有 O(N log N) 復雜度1 排序列表可能會更快——但話又說回來,它也可能會更慢(對於這種情況,標准不保證任何方向)。 它通常作為合並排序來實現,它通常不會受到預先存在的順序的太大影響(如果有的話)。

在這種情況下,你調用它 O(N) 次,所以你的整體復雜度是 O(N 2 log N)。

正如評論中已經指出的那樣,只要您只刪除列表前面的項目,列表就會保持排序,因此無需在每次迭代時重新排序。

此外,我會注意到,如果您只是從一開始就刪除元素,您可能需要考慮使用std::deque而不是std::list 盡管您將獲得相同的計算復雜度,但很有可能您會看到現實生活中從listdeque速度顯着提高。 在您的情況下,您可能無法用deque替換list (例如, deque不提供與list相同的迭代器穩定性),但在某些情況下可以做到。


  1. 如果您關心,標准 (§[list.ops]/32) 中的准確措辭是:“復雜性:大約N log N 次比較,其中N == size() 。”

暫無
暫無

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

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