请教老师一个问题关于递归的栈溢出问题

来源: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回答

liuyubobobo

2018-04-19

是的。由于对于近乎有序的数据,不添加随机化的话,递归深度近乎和数据规模一样,数据规模过大,将导致栈溢出。


这种错误本身确实很难定位。但其实通过你的描述,你已经进行了很好的定位了:)定位一个程序的错误的关键,就是找到让程序发生错误的最小测试用例。你已经观察到了:程序发生错误的根本,似乎不是由于某些特定的测试用例的原因,或者说不是由于某些特定的边界情况,而是因为数据规模的变大。换句话说,数据规模没有那么大的时候,无论如何程序都是对的,数据规模大到一定程度,程序就崩溃了。在这种情况下,就会很自然的想到,问题应该不是程序的逻辑本身,而是调用的系统资源过度了。


另外,递归算法本身是占据额外的空间的。这一点我在这个课程没有过多强调,印象里在《玩转算法面试》中进行了强调。这个空间就是系统栈的空间。所以在对递归程序进行压力测试的时候,老司机都会有这根弦,会不会发生递归深度过多的情况。高效定位问题的错误,本身也是和经验相关。


如果你想明确确认是栈溢出导致的这个问题,需要汇编相关的知识了。或者在更高层的系统api上,比如基于windows的api捕获操作系统给出的异常,查看异常的具体信息。这些都远远超过我们这个课程的内容了:)


3
4
慕慕0829012
回复
liuyubobobo
好的٩( 'ω' )و get! Thanks♪(・ω・)ノ
2018-04-20
共4条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程