在做HDU Quoit Design时,一开始直接暴力求解,submit,果然Time Limit Exceeded。在百度了之后,看到大神们都是使用分治的方法来求解这个最近点对问题。参考了别人的思路,原文链接:http://blog.youkuaiyun.com/sd6264456/article/details/9318861。里面有很详细的分析和源代码,对解这题很有帮助。多理解掌握分治算法也有帮助。
在仔细阅读了该文章之后,我自己动手写了解题的代码。在测试了几个简单的用例成功之后,自信满满的submit,结果出乎意料Wrong Answer!
随后我仔细分析调试自己的代码,甚至对比着该文中的代码进行分析,始终没发现问题所在。
随后,我没办法增加了测试用例的复杂度,使得点的数量增加,这次终于不一样,编译器弹出Stack overflow的错误。这是栈溢出啊,可是在哪里溢出的呢?一般的栈溢出都是递归没有出口,使得无限递归下去,导致栈溢出。可是我的递归出口很明显啊,不会是没出口啊。
那为什么无限递归会导致栈溢出呢?因为无限递归下去,栈的存储有限,就会有溢出的时候。那我的递归是不是也使得栈的存储空间爆满?
我的代码中,在递归函数里面定义了一个占用内存很大数组,这是一个局部变量,每次进入递归都要分配一次内存空间,着就使得栈溢出。然后我将这行数组定义语句移到了递归之后,虽然还是在递归函数里面,但是只有当所有的递归都返回之后才可能执行到这条语句,即这个内存分配语句只在第一递归的时候会执行。
再次测试复制的用例,结果还是stack overflow,一脸mengbi。难道在递归的时候,那次递归函数的执行,都会分配所有可能需要用到的空间?
最后,实在没办法,把这个数组定义为全局变量。submit,Accepted。
收获就是,以后写递归,一定要记住内存空间的分配语句,如果不是必须的局部变量,不论在递归中会不会执行到,都应该放到递归函数外面!
分治法求最近点对中关于递归的收获
最新推荐文章于 2024-06-21 17:34:36 发布