簡體   English   中英

清楚函數的時間復雜度是什么std :: map根據大O?

[英]What is the time complexity for a clear function is std::map according to big O?

清除函數的時間復雜度是std :: map是多少?
我是否正確地說它是O(1)?

標准在[associative.reqmts] / 8 表102中說

a.clear() <=> a.erase(a.begin(), a.end())中線性a.size()

所以它實際上是強制性的O(N)。


編輯:總結各個位。

要刪除節點, map執行兩個操作:

  1. 調用allocator destroy方法來銷毀元素
  2. 調用allocator deallocate方法來釋放節點占用的內存

前者可以在代碼中省略(檢查is_trivially_destructible ),實際上它通常在vector完成。 不幸的是,后者更加棘手,並且不存在特征,因此我們必須依賴優化器。

不幸的是,即使通過內聯優化可以徹底清除destroy ,並deallocate節點,恐怕將無法認識到樹遍歷現在是無用和優化的路程了。 因此,你最終會在樹的Θ(N)遍歷中結束,並且每一步都沒有完成任務......

cplusplus參考站點聲稱它在容器大小上具有線性復雜性,因為必須調用每個元素的析構函數。

因為它是一個模板,所以在編譯時可能會知道類型的無操作中的破壞(例如std::map<int> ),因此需要銷毀成員並不是推斷必要的最差的良好基礎 - 表現。 仍然,編譯器必須訪問二叉樹的每個節點,釋放堆內存,並且節點的數量線性地與元素的數量相關( erase()僅使迭代器/引用/指向無效元素的insert()無效, insert()並不會使所有證據與1:1關系無效。

所以,它是線性的,但是由於需要清理堆使用,即使不需要元素析構函數....

(有趣的是,這意味着std::map<> -like關聯容器 - 或者std::map<>本身帶有一個聰明的自定義分配器 - 可以為具有普通無操作析構函數的元素設置O(1)內存是從專用內存池中分配的,可以在O(1)中“丟棄”。)

據我所知,所有清理操作的復雜性都是O(n),因為你需要逐個去除這些對象。

暫無
暫無

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

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