不要迷信非递归算法
2009-07-07 13:07
253 查看
关于什么是递归和为什么递归效率低下,可参照《数据结构》。
我想告诉您的是:编写Java代码时,不要迷信非递归算法。
递归的好处是:把大规模的问题分解成小规模的问题,直至浅显易懂、可立即求解。
写Java代码时,递归有可能比非递归更快。可能是因递归调用经由JVM内部实现时,JVM对它进行了算法优化。如果您有更好的解释,请告诉我(weilai2@163.com)
为此,我做过测试,以下是测试数据:
树的结点类型是TreeNode0(自定义的),10万次遍历(CPU双核2.66G) , 2009-1-1
当有22 个结点时,树最深处有5 层,递归遍历耗时0.188秒, 非递归遍历耗时0.625秒。
当有40 个结点时,树最深处有4 层,递归遍历耗时0.35 秒, 非递归遍历耗时1.13 秒。
当有133个结点时,树最深处有13层,递归遍历耗时1.031秒, 非递归遍历耗时3.625秒。
当有790个结点时,树最深处有62层,递归遍历耗时6.56 秒, 非递归遍历耗时11.62秒。
end.
我想告诉您的是:编写Java代码时,不要迷信非递归算法。
递归的好处是:把大规模的问题分解成小规模的问题,直至浅显易懂、可立即求解。
写Java代码时,递归有可能比非递归更快。可能是因递归调用经由JVM内部实现时,JVM对它进行了算法优化。如果您有更好的解释,请告诉我(weilai2@163.com)
为此,我做过测试,以下是测试数据:
树的结点类型是TreeNode0(自定义的),10万次遍历(CPU双核2.66G) , 2009-1-1
当有22 个结点时,树最深处有5 层,递归遍历耗时0.188秒, 非递归遍历耗时0.625秒。
当有40 个结点时,树最深处有4 层,递归遍历耗时0.35 秒, 非递归遍历耗时1.13 秒。
当有133个结点时,树最深处有13层,递归遍历耗时1.031秒, 非递归遍历耗时3.625秒。
当有790个结点时,树最深处有62层,递归遍历耗时6.56 秒, 非递归遍历耗时11.62秒。
主要的测试代码如下: /**traverse recursively. 递归实现. */ public static <T extends TreeNode0<T>> List<T> traverse_recursive(T root, NodeFilter<T> filter, List<T> returnList) { if (filter == null || filter.test(root)) { list.add(root); } Stack<T> sons = root.sons; if (sons != null) { for (int i = sons.size() - 1; i >= 0; i--) { T son = sons.get(i); traverse_recursive(son, filter, returnList); } } return returnList; } /**depth first traversal.非递归实现.*/ public static <T extends TreeNode0<T>> List<T> traverse_DFT(T root, NodeFilter<T> filter) { Stack<T> st = new Stack<T>(); st.push(root); List<T> list = new ArrayList<T>(); while (!st.isEmpty()) { T dad = st.pop(); if (filter == null || filter.test(dad)) { list.add(dad); } Stack<T> sons = dad.sons; if (sons != null) { for (int i = sons.size() - 1; i >= 0; i--) { T son = sons.get(i); st.push(son); } } } return list; }
end.
相关文章推荐
- 不要迷信API(单链表的另一种算法)——完成端口通讯服务器(IOCP Socket Server)设计(三)
- A Minimal Application in Assembly:不要迷信洋人
- 项目经理,不要迷信制度!
- 不要迷信钽电容!
- 千万不要迷信规律:大反例合集
- 不要迷信神话
- 不要迷信敏捷软件开发中的敏捷管理工具
- 王晓初:不要迷信LTE
- 不要盲目迷信多线程
- 不要迷信神话
- 不要迷信博客营销
- 项目经理,不要迷信制度!
- 不要过度迷信小型机
- 不要迷信python
- 不要迷信weblogic
- 不要迷信API(单链表的另一种算法)——完成端口通讯服务器(IOCP Socket Server)设计(三)
- 马化腾式失败:不要迷信腾讯
- 在学校不要迷信于某一项技术
- 不要迷信数据