内存使用对算法复杂性的影响

时间:2009-09-03 04:49:45

标签: c++ stl complexity-theory

我正在阅读关于C ++ STL算法的Nicolai Josuttis书。对于许多算法,例如stable_sort(),他提到算法的复杂性n * log(n),如果有足够的内存可用,否则它是n * log(n)* log(n)。我的问题是内存使用情况如何影响复杂性? STL如何检测这种情况?

1 个答案:

答案 0 :(得分:12)

查看gcc的STL,您会在stl_algo.h中找到inplace_merge。这是合并排序的传统合并实现,使用O(N),使用与输入大小相同的缓冲区。此缓冲区是通过_Temporary_bufferstl_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)