深度优先搜索(DFS)递归与非递归实现逻辑详解
2018-01-07 18:25
591 查看
递归与非递归:
数据结构对于学习编程的人来说是非常重要的,我们在现实生活碰到的各种烦难问题可以用递归来实现,一个递归思想就把问题给简单化了,但是我们都知道递归是非常耗时的,一旦数据量庞大起来,递归次数多了,这个时间是非常恐怖的。所以一般我们都会把一些递归问题给非递归化,来达到某一定的效率。通常递归转化为非递归用到了栈和队列,今天就详解用栈来实现转化的逻辑处理,并且以(01背包为主讲例子).DFS:深度优先搜索,相当于树的先序搜索。在这我们现以数据结构中经典的先序遍历的递归与非递归来打开主题.
其先序搜索为:1,2,4,5,3;
递归实现:
voidPreorderRecursive(Bitreeroot){ if(root){ visit(root); PreorderRecursive(root->lchild); PreorderRecursive(root->rchild); } }
相信递归这个每个人都弄得懂,这里就不BB了.
非递归借助栈来完成转化(考研的小伙伴们要弄懂):
voidPreorderNonRecursive(Bitreeroot){ stackstk; stk.push(root);//节点入栈 while(!stk.empty()){ p=stk.top();//栈顶元素出栈并且访问该节点 visit(p); stk.pop(); if(p.rchild)stk.push(stk.rchild);//右边节点入栈 if(p.lchild)stk.push(stk.lchild); } }
第一步:1号节点入栈。
第二步:当栈不为空的时候弹出栈顶元素并且访问该节点,当栈为空的时候转第五步。
第三步:弹出的栈顶元素的右和左节点入栈(如果存在的话).
第四步:转到步骤二。
第五步:结束。
相信这个很容易理解。那么我们今天就直扑主题了。
01背包问题。
已知有n个物品他们的重量分别为weight[i]={i1,i2,....,in},价值分别为value[i]={i1,i2,..in};
背包的承重为m.求其最大能装下的价值和.
首先我们来考虑递归算法。递归逻辑非常简单.
我们以这个简单例子分析:
weight[]={2,2,6};
value[]={6,3,5};
n=3;
m=6;//最大承重量
构造我们的回溯树:
黄色线条表示回溯,先考虑一个背包情况,记录最大值,回溯根节点,判断2个背包,以此回溯。并记录下回溯记录情况,以及选中背包情况.
懂得了上面的回溯树的构造之后,我们就可以将其改写成非递归。以下是伪代码
其实好多递归程序不能改写成非递归,重要的是你的树是怎样去构造他。
最后支持原创,转载请注明转载出处
相关文章推荐
- 图的深度优先搜索(DFS)简介与实现(递归与非递归方法)
- 图的深度优先搜索(DFS)简介与实现(递归与非递归方法)
- 算法导论-第22章-基本的图算法-22.3 深度优先搜索-22.3-7-使用栈来代替递归实现DFS
- 回溯算法 DFS深度优先搜索 (递归与非递归实现)
- 【数据结构笔记】4:非递归实现深度优先搜索(DFS)
- C#基于纯数学方法递归实现货币数字转换中文功能详解
- 深度优先搜索(DFS)详解
- 【数据结构】C++实现整理_图的BFS与DFS(递归非递归)
- 基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
- BFS和DFS详解以及java实现
- 非递归方法实现 二叉树的 DFS(Pre Order), Post Order
- 图论 深度优先搜索 广度优先搜索的非递归实现
- 关于递归实现过程的详解
- leetcode 526. Beautiful Arrangement 递归实现全排列 + 经典深度优先遍历DFS做法
- php实例分享之通过递归实现删除目录下的所有文件详解
- 全排列实现(递归实现深度优先搜索)
- 深度优先搜索(DFS)详解
- 图的广度优先搜索(BFS)、深度优先搜索(DFS)(邻接矩阵法和邻接表法java实现)
- [数据结构]图的DFS用栈消除递归的C语言简单实现
- 详解用TensorFlow实现逻辑回归算法