请教老师一个问题关于递归的栈溢出问题
来源:3-5 快速排序法 - Quick Sort
慕慕0829012
2018-04-18
就是快速排序的最开始那个没有优化的版本,在我的windows机器上,如果是随机的数据则10万的数据都运行OK,但是8万个近乎有序数据(有100个数据顺序是乱的),然后运行就会直接报错,猜测应该是栈溢出了,报错直接返回“Process returned -1073741571 (0xC00000FD) execution time : 3.969 s”,请问老师这种问题如何定位呀,使用的IDE是CodeBlock
1回答
-
是的。由于对于近乎有序的数据,不添加随机化的话,递归深度近乎和数据规模一样,数据规模过大,将导致栈溢出。
这种错误本身确实很难定位。但其实通过你的描述,你已经进行了很好的定位了:)定位一个程序的错误的关键,就是找到让程序发生错误的最小测试用例。你已经观察到了:程序发生错误的根本,似乎不是由于某些特定的测试用例的原因,或者说不是由于某些特定的边界情况,而是因为数据规模的变大。换句话说,数据规模没有那么大的时候,无论如何程序都是对的,数据规模大到一定程度,程序就崩溃了。在这种情况下,就会很自然的想到,问题应该不是程序的逻辑本身,而是调用的系统资源过度了。
另外,递归算法本身是占据额外的空间的。这一点我在这个课程没有过多强调,印象里在《玩转算法面试》中进行了强调。这个空间就是系统栈的空间。所以在对递归程序进行压力测试的时候,老司机都会有这根弦,会不会发生递归深度过多的情况。高效定位问题的错误,本身也是和经验相关。
如果你想明确确认是栈溢出导致的这个问题,需要汇编相关的知识了。或者在更高层的系统api上,比如基于windows的api捕获操作系统给出的异常,查看异常的具体信息。这些都远远超过我们这个课程的内容了:)
342018-04-20
相似问题