2009-09-03 53 views
4

我在閱讀Nicolai Josuttis關於C++ STL算法的書。對於許多算法,如stable_sort(),他提到如果有足夠的內存可用,算法的複雜度爲n * log(n),否則爲n * log(n)* log(n)。我的問題是內存使用情況如何影響複雜性? STL如何檢測這種情況?內存使用對算法複雜性的影響

回答

12

看着gcc的STL,你會發現inplace_mergestl_algo.h。這是合併排序的傳統合並實現,使用與輸入相同大小的緩衝區O(N)。該緩衝區是通過_Temporary_buffer,從stl_tempbuf.h分配的。這將調用get_temporary_buffer,最終調用新的。如果拋出一個異常,異常會被捕獲,並且緩衝區爲NULL - 這是「內存不足」的情況。在這種情況下,合併與__merge_without_buffer一起工作,即O(N lg N)。由於合併排序的遞歸深度爲O(lg N),所以在「傳統」mergesort(帶緩衝區)的情況下獲得O(N lg N),而在沒有緩衝區的版本中獲得O(N lg N lg N) 。

+2

+1。該標準保證了25.3.4/7中足夠大的內存和不足夠的內存的複雜性,所以所有實現都必須以某種方式確定是否有足夠的內存。雖然他們沒有必要捕捉'new'拋出的異常,這似乎是一個明智的做法。 :) – 2009-09-03 05:54:50