由於前幾天的問題this,有幾件事情一直在困擾着我,關於std::deque::push_back/push_front
的複雜性要求與實際的std::deque
實現野生。std :: deque :: push_back/front的複雜性要求
上一個問題的結果是,這些操作都要求具有最差情況下的複雜性O(1)
。我驗證,這是確實是在c++11
的情況下:
從23.3.3.4雙端隊列改性劑,指的插入,推/佈設前/後
複雜性:複雜性是在插入元件的數量線性加上到deque開始和結束的距離中較小的一個。插入在雙端隊列的開頭或結尾的單個 元件或者總是需要一定的時間和 使得一個調用T.
這是通過用於索引的O(1)
複雜度要求的組合構造,經由operator[]
等
問題是,實現並不嚴格地滿足這些要求。
在這兩種msvc
和gcc
的std::deque
實施而言是被阻止的數據結構,由指針的動態陣列的至(固定大小)的塊,其中每個塊中存儲有數量的數據元素。
在最壞的情況下,push_back/front etc
可能需要分配一個額外的塊(這是很好的 - 固定大小的分配是O(1)
),但它也可能需要調整塊指針的動態數組大小 - 這是不好的,因爲這是O(m)
其中m
是塊的數量,在一天結束時是O(n)
。
很明顯,這仍然是分期付款O(1)
的複雜性,因爲一般m << n
它將在實踐中相當快。但是,這似乎是一致性問題?
作爲進一步的觀點,我沒有看到如何設計一個嚴格滿足push_back/front etc
和的複雜度的數據結構。您可以有塊指針的鏈接列表,但這不會給您所需的operator[]
行爲。它可以做到嗎?
相關(但沒有真正的答案):http://stackoverflow.com/questions/6292332/what-really-is-a-deque-in-stl –
@NateKohl:是的確切 - 以及對這個問題的答案似乎證實你不能嚴格滿足所有的複雜性要求... –