我知道关于“就地”算法的含义还有其他问题,但我的问题有点不同。我知道这意味着算法会更改原始输入数据,而不是为输出分配新空间。但我不确定辅助内存是否重要。即:
- 如果算法分配一些额外的内存来计算结果
- 如果一个算法有一个非常量的递归调用,它们占用了堆栈上的额外空间
就地通常意味着次线性的附加空间。这不一定是该术语含义的一部分。只是使用线性或更大空间的就地算法并不有趣。如果您要分配 O(n) 空间以在与输入相同的空间中计算输出,那么您可以同样轻松地在新内存中生成输出并保持相同的内存限制。就地计算的价值已经丧失。
维基百科走得更远,说额外的存储量是恒定的。但是,使用 log(n) 额外空间将输出写入输入的算法(例如合并排序)在我见过的用法中仍然存在。
我想不出任何不需要额外内存的就地算法。算法是否“就地”具有以下特征:
就地:通过将输入变异为输出,使用 o(f(n)) 额外空间对大小为 Θ(f(n)) 的输入执行算法。
以“插入排序”排序算法的就地实现为例。输入是一个占据 Θ(n) 空间的数字列表。在最坏的情况下运行需要 Θ(n 2 ) 时间,但只需要 O(1) 空间。如果您不进行就地排序,则至少需要使用 Ω(n) 空间,因为输出需要是 n 个数字的列表。