堆栈溢出,你有什么办法?

E你不是我 2013-11-02 10:30:40
如何处理程序中函数之间的反复调用(或对象间的相互引用)而导致的segfault?
有时,比如就简单说排序算法中得Quicksort,当排序数数量少时,程序可以正常运行,但当数量较多时,程序就无法运行,那该如何处理?
有木有懂得大型公司,比如谷歌,腾讯.是如何处理这种大量数据的?
...全文
602 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-11-15
  • 打赏
  • 举报
回复
外部排序用归并,内部排序,用快速排序
千树之影 2013-11-06
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
[quote=引用 楼主 u011995873 的回复:] 如何处理程序中函数之间的反复调用(或对象间的相互引用)而导致的segfault? 有时,比如就简单说排序算法中得Quicksort,当排序数数量少时,程序可以正常运行,但当数量较多时,程序就无法运行,那该如何处理? 有木有懂得大型公司,比如谷歌,腾讯.是如何处理这种大量数据的?
qsort之类的程序一般使用递归的方法实现是非常容易使得栈溢出的,因为函数要完成需要N层的栈调用,解决办法就是消除递归,理论上循环实现和递归实现是可以互相转换的[/quote] 想要qsort()溢出,这个宇宙的数据量还远远不够哦
千树之影 2013-11-06
  • 打赏
  • 举报
回复
引用 20 楼 WhiteBird99 的回复:
不使用递归, 手动做栈?
qsort就是自己做栈的。
千树之影 2013-11-06
  • 打赏
  • 举报
回复
引用 16 楼 mLee79 的回复:
平凡实现的qsort在特定数据分布的时候, 递归深度会到 O(N), 挂了就很正常, 你只要做一点点改变, 每次只把比较长的分组递归, 较短的一部分做尾递归优化, 就可以保证递归深度不会超过 O(logN)..
qsort就是做过优化的,而且是自己建的栈结构。对于2^64个元素排序,需要的栈大小不过62而已。要想把1M的栈弄溢出,整个宇宙的数据量加起来都不够。
E你不是我 2013-11-06
  • 打赏
  • 举报
回复
引用 23 楼 baipv008 的回复:
[quote=引用 3 楼 worldy 的回复:] [quote=引用 楼主 u011995873 的回复:] 如何处理程序中函数之间的反复调用(或对象间的相互引用)而导致的segfault? 有时,比如就简单说排序算法中得Quicksort,当排序数数量少时,程序可以正常运行,但当数量较多时,程序就无法运行,那该如何处理? 有木有懂得大型公司,比如谷歌,腾讯.是如何处理这种大量数据的?
qsort之类的程序一般使用递归的方法实现是非常容易使得栈溢出的,因为函数要完成需要N层的栈调用,解决办法就是消除递归,理论上循环实现和递归实现是可以互相转换的[/quote] 想要qsort()溢出,这个宇宙的数据量还远远不够哦[/quote]额,不会吧。
秃头披风侠 2013-11-04
  • 打赏
  • 举报
回复
不使用递归, 手动做栈?
Adol1111 2013-11-04
  • 打赏
  • 举报
回复
qsort用的就是递归,数据多了必定会堆栈溢出。要么用迭代代替递归,要么用尾递归。尾递归如果在Debug的时候别忘了开优化选项,不然和递归是一样的。 if-else循环等等,的确有影响效率,但如果做过测试,即使百万次的判断也不会有明显感觉
赵4老师 2013-11-04
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\qsort.c
千树之影 2013-11-04
  • 打赏
  • 举报
回复
qsort()是非递归实现的,哪来的堆栈溢出问题?
mLee79 2013-11-03
  • 打赏
  • 举报
回复
平凡实现的qsort在特定数据分布的时候, 递归深度会到 O(N), 挂了就很正常, 你只要做一点点改变, 每次只把比较长的分组递归, 较短的一部分做尾递归优化, 就可以保证递归深度不会超过 O(logN)..
lunat 2013-11-03
  • 打赏
  • 举报
回复
赞同,使用尾递归,编译器优化后,可循环使用堆栈帧,不会导致溢出。
引用 14 楼 wangdahu888 的回复:
改成尾递归呀,保准不堆栈溢出!!!
  • 打赏
  • 举报
回复
改成尾递归呀,保准不堆栈溢出!!!
E你不是我 2013-11-03
  • 打赏
  • 举报
回复
求高手解决如何防止堆栈溢出的办法!!!
E你不是我 2013-11-03
  • 打赏
  • 举报
回复
引用 11 楼 taodm 的回复:
好吧,你的电脑弱爆到了令我震惊的程度了。 我的机器上,10^8也是秒出排序结果啊。 引用 6 楼 taodm 的回复: 楼主真遇到过qsort导致溢出的场合?一台普通的PC上,当待排序元素达到10^6以上时,传统的递归快排就会导致栈溢出异常.
引用 11 楼 taodm 的回复:
好吧,你的电脑弱爆到了令我震惊的程度了。 我的机器上,10^8也是秒出排序结果啊。 引用 6 楼 taodm 的回复: 楼主真遇到过qsort导致溢出的场合?一台普通的PC上,当待排序元素达到10^6以上时,传统的递归快排就会导致栈溢出异常.
你仅仅就是完成排序吗?
taodm 2013-11-02
  • 打赏
  • 举报
回复
好吧,你的电脑弱爆到了令我震惊的程度了。
我的机器上,10^8也是秒出排序结果啊。

引用 6 楼 taodm 的回复:
楼主真遇到过qsort导致溢出的场合?一台普通的PC上,当待排序元素达到10^6以上时,传统的递归快排就会导致栈溢出异常.
worldy 2013-11-02
  • 打赏
  • 举报
回复
引用 5 楼 u011995873 的回复:
[quote=引用 3 楼 worldy 的回复:] [quote=引用 楼主 u011995873 的回复:] 如何处理程序中函数之间的反复调用(或对象间的相互引用)而导致的segfault? 有时,比如就简单说排序算法中得Quicksort,当排序数数量少时,程序可以正常运行,但当数量较多时,程序就无法运行,那该如何处理? 有木有懂得大型公司,比如谷歌,腾讯.是如何处理这种大量数据的?
qsort之类的程序一般使用递归的方法实现是非常容易使得栈溢出的,因为函数要完成需要N层的栈调用,解决办法就是消除递归,理论上循环实现和递归实现是可以互相转换的[/quote]递归还是会反复调用自身啊,至于用循环,有时还得配上if,挺麻烦的,而且会影响程序速度的吧?[/quote] 循环比递归快,因为循环不需要函数调用的开销
E你不是我 2013-11-02
  • 打赏
  • 举报
回复
有木有知道“模拟栈操作”?求解释。
E你不是我 2013-11-02
  • 打赏
  • 举报
回复
引用 6 楼 taodm 的回复:
楼主真遇到过qsort导致溢出的场合?
一台普通的PC上,当待排序元素达到10^6以上时,传统的递归快排就会导致栈溢出异常.
E你不是我 2013-11-02
  • 打赏
  • 举报
回复
有木有知道外排序的? 其实google chrome的速度快,是它占用大量内存与硬盘空间,我们是否也可以借用硬盘空间来造虚拟内存呢?
加载更多回复(6)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧