我正在阅读关于C ++ STL算法的Nicolai Josuttis书。对于许多算法,例如stable_sort(),他提到算法的复杂性n * log(n),如果有足够的内存可用,否则它是n * log(n)* log(n)。我的问题是内存使用情况如何影响复杂性? STL如何检测这种情况?
答案 0 :(得分:12)
查看gcc的STL,您会在stl_algo.h
中找到inplace_merge
。这是合并排序的传统合并实现,使用O(N),使用与输入大小相同的缓冲区。此缓冲区是通过_Temporary_buffer
从stl_tempbuf.h
分配的。这将调用get_temporary_buffer
,最终调用new。如果抛出异常,则会捕获异常,并且缓冲区为NULL - 这是“内存不足”的情况。在这种情况下,合并与__merge_without_buffer
一起使用,即O(N lg N)。由于合并排序的递归深度为O(lg N),在“传统”mergesort(带缓冲区)的情况下得到O(N lg N),在没有缓冲区的版本中得到O(N lg N lg N)