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

Nav*_*een 4 c++ complexity-theory stl

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

Mar*_*wis 12

纵观海湾合作委员会的STL,你会发现inplace_mergestl_algo.h.这是合并排序的传统合并实现,使用O(N),使用与输入大小相同的缓冲区.这个缓冲区是通过_Temporary_bufferfrom 分配的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) .

  • +1.该标准保证了25.3.4/7中足够内存和不足内存情况的复杂性,因此所有实现都必须以某种方式确定是否有足够的内存.虽然他们不一定要通过捕获"新"引发的异常来做到这一点,但这似乎是一种明智的做法.:) (2认同)