[英]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
執行兩個操作:
destroy
方法來銷毀元素 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.