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

C++ 内存使用对算法复杂性的影响,c++,stl,complexity-theory,C++,Stl,Complexity Theory,我正在读Nicolai Josuttis关于C++STL算法的书。对于许多算法,例如stable_sort(),他提到如果有足够的内存可用,算法的复杂性是n*log(n),否则它就是n*log(n)*log(n)。我的问题是内存使用如何影响复杂性?STL是如何检测到这种情况的?查看gcc的STL,您将在中找到inplace\u merge。这是合并排序的传统合并实现,使用与输入大小相同的缓冲区,使用O(N)。此缓冲区是通过来自的\u Temporary\u buffer分配的。这将调用get\u

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

查看gcc的STL,您将在中找到
inplace\u merge
。这是合并排序的传统合并实现,使用与输入大小相同的缓冲区,使用O(N)。此缓冲区是通过来自的
\u Temporary\u buffer
分配的。这将调用
get\u temporary\u buffer
,最终调用new。如果抛出异常,异常会被捕获,缓冲区为空-这就是“内存不足”的情况。在这种情况下,合并与不带缓冲区的
\uu merge\u一起工作,即O(N lg N)。由于合并排序的递归深度为O(lg N),因此在“传统”合并排序(带缓冲区)的情况下,您会得到O(N lg N),而在不带缓冲区的版本中,您会得到O(N lg N lg N)。

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