如果一个算法:
a) 递归若干层,深度取决于 N,或
b) 分配的内存量取决于 N
那么它不是恒定的记忆。否则它可能是:形式上它是常量内存,如果算法使用的内存量有一个恒定的上限,无论输入的大小/值如何。输入占用的内存不包括在内,因此有时需要明确的是,您会谈论恒定的“额外”内存。
所以,这里有一个常量内存算法,用于在 C 中找到整数数组的最大值:
int max(int *start, int *end) {
int result = INT_MIN;
while (start != end) {
if (*start > result) result = *start;
++start;
}
return result;
}
这是一个非常量内存算法,因为它使用的堆栈空间与输入数组中的元素数量成正比。但是,如果编译器能够以某种方式将其优化为非递归等价物,它可能会变成常量内存(C 编译器通常不会打扰它,除非有时使用尾调用优化,这在这里不起作用):
int max(int *start, int *end) {
if (start == end) return INT_MIN;
int tail = max(start+1, end);
return (*start > tail) ? *start : tail;
}
这是一个常数空间排序算法(这次是在 C++ 中),它是 O(N!) 时间左右(可能是 O(N*N!)):
void sort(int *start, int *end) {
while (std::next_permutation(start,end));
}
这里是一个O(N)空间排序算法,时间为O(N^2):
void sort(int *start, int *end) {
std::vector<int> work;
for (int *current = start; current != end; ++current) {
work.insert(
std::upper_bound(work.begin(), work.end(), *current),
*current
);
}
std::copy(work.begin(), work.end(), start);
}