我知道这听起来很愚蠢,但如果我们认为我们很幸运并且每次都能获得O(NlogN)的平均时间复杂度以进行快速排序,那么无论数组的大小如何,我们都不会得到分割错误因为即使我们正在进行无数的递归调用并且我们正在为调用堆栈分配空间,我们也从未真正耗尽整个调用堆栈保留内存,因为我们在logn时间内将其分解并在线性时间内进行梳理。
当然,这是我对一个带回家问题的想法,我的教授让我们在课堂上遇到分段错误时要考虑这个问题。如果我们假设它始终具有平均运行时间复杂度,我认为从不发生分段故障我错了吗?
以下是问题:
如果我们的计算机系统堆为2GB,并且应用程序的调用堆栈大小为1MB。并假设每次递归调用quicksort都需要将256个字节分配给调用堆栈。是否有可能导致堆栈溢出?
编辑:
这假设我们的算法将以平均时间复杂度运行,并且问题中记录了计算机规范。很抱歉没有足够具体。
EDIT2:
我们的输入大小将等于或小于2gb,这是我们的堆大小。
答案 0 :(得分:2)
如果没有考虑输入的元素数量,则无法计算。在这种情况下,堆栈溢出错误将是“元素数量”和“堆栈大小”的函数。其中你缺少一个。
答案 1 :(得分:0)
当输入相对较大时,使用递归方法的程序最有可能进入堆栈溢出。另一方面,迭代方法非常高效且安全。如上所述,您的问题的答案取决于您的输入有多大。但是,要了解递归程序与迭代程序相比可以多快地损坏堆栈,您可以查看以下链接:http://www.codeproject.com/Articles/21194/Iterative-vs-Recursive-Approaches
正如一般建议一样,在程序的关键部分使用递归并不是一个好主意。