Jai*_*ano 20 algorithm recursion complexity-theory asymptotic-complexity
如果给出了编程问题中的上述条件并且我使用递归来解决它,那么我是否违反了约束条件?这可能是因为递归也使用堆栈?这样对吗?
per*_*eal 27
如果堆栈的深度(递归)是恒定的并且相对于输入的大小没有改变,那么递归解决方案可以是O(1)额外的空间.
一些编译器可以进行尾调用优化(TCO)并删除递归调用,如果它们是通过函数在任何给定代码路径中执行的最后一个语句.使用TCO,没有与调用堆栈相关的内存开销.
但是,请记住,可能会强制使用O(1)约束来强制您选择特定的(可能是非递归的)算法,因此即使您知道正在使用的编译器,依赖尾部调用优化也可能是不明智的.对您的代码进行了相关的转换.至少,如果您依赖它,您应该明确说明并证明您期望通过参考语言规范,编译器文档和/或反汇编来实现TCO.
axi*_*iom 26
extra allowed space is O(1)
意味着你的程序只能使用一定量的空间C.
按照big-O的定义,这意味着程序所需的空间不能取决于输入的大小,尽管C可以任意大.
因此,如果递归取决于输入a(通常是这种情况),则程序所需的空间不是O(1).
进一步澄清:
该程序总是利用1 Mb使用O(1)空间.
总是使用的程序1 Tb是使用O(1)空间b.
它使用一种程序N Mb,其中,N为输入,不使用O(1)的空间,(它使用O(N)空间).
长话短说,无论何时你阅读O(1),只需要在心理上用常数替换它.
一个.例如,foo(n)= foo(n - 1),这里维护函数调用所需的堆栈空间是O(n)
湾 当O符号上的材料评论被忽略的常量如何麻烦时,这就是他们所说的
关于其他答案告诉你必须使用的堆栈数量O(1),并且必须保持不变,无论输入的大小如何,如果你想以递归的方式解决问题,它只会给你两种可能性:
| 归档时间: |
|
| 查看次数: |
2280 次 |
| 最近记录: |