2014-04-25 46 views
0

我有一個排序的向量, 什麼是更好的: 使用lower_bound並插入元素在它的位置在向量中。 或只需將元素push_back到vector中,並在sort()需要時對其進行排序?插入的複雜性

+2

這取決於「何時需要」的頻率。 – molbdnilo

+0

我會在需要時進行排序。如果未分類元素的數量與矢量的大小相比較小,則對最後推回的元素使用插入排序。否則,對最後的元素使用std :: sort,然後使用就地合併。 – Nicolas

+0

我不確定爲什麼這個問題被標記爲[tag:C++ 11]。我在這個問題中沒有看到任何特別的[tag:C++] - 依賴,除了'lower_bound','insert','push_back'和'sort',這些都在'C++ 03'中。和「C++ 98」。其他的一切只是通用的算法分析。 –

回答

1

對於一次執行的單個操作,使用lower_boundinsert更便宜。 lower_boundO(log(n))insert將是(最差和平均情況)O(n),給出最終複雜度O(n)

如果您不需要進行排序,直到你完成插入之後的載體,它會便宜很多,只進行排序,因爲所有的push_back旨意是O(1)*O(n) = O(n)和最終排序將是O(n*log(n)),給你最終的複雜性爲O(n*log(n)),而多重lower_bound + insert會給你一個複雜的O(n)*O(n) = O(n**2)

如果您需要在整個插入過程中排序的元素,哪一個更便宜,這將非常依賴於您的使用模式(您需要多久分配一次元素)。通常情況下,您只需要在施工過程結束時進行排序的元素,這就是爲什麼最終排序可能是工具帶中非常強大的工具。如果這不是您的使用模式,您可能希望至少考慮使用關聯容器,如multi_setmulti_map

+0

謝謝。在我看來,lower_bound和insertion會提供更快的性能。 – anothertest