博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DFS ( 深度优先/回溯算法 ) 一
阅读量:7070 次
发布时间:2019-06-28

本文共 1366 字,大约阅读时间需要 4 分钟。

    深度优先搜索算法英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索或的。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。(Wiki)

   DFS在搜索过程常常伴随许多优化策略,增加剪枝函数,或者和动态规划结合。

   让我们用一道看似简单的例子理解DFS。 = =

 

/***  将一个整数n分为k个加数相加,不能重复。e.g. n=7 k=2 -> (1,6) (2,5) (3,4)  // (4,3)等为重复项**  求有多少种分法,并打印每种分法**  0
<=200 1
<=7*/ #include
using namespace std;int sum = 0;int finalExp[8];void numDivision(int num,int parts,int curr = 1,int level = 1){ if ( parts == 1 ){ //搜寻结点到达末尾的条件 sum++; //获得一种分法 int s = 0; int i; for ( i = 1; i < level; i++ ){ s += finalExp[i]; cout << finalExp[i] << " + "; } cout << num << " = " << num+s << endl; return ; } for ( int i = curr; i <= num/parts; i++ ){ finalExp[level] = i; //储存结果 numDivision(num-i,parts-1,i,level+1); //核心回溯递归 }}int main(){ numDivision(7,3); cout << sum << endl; return 0;} // Achieve

 

    例子显示的正是多数DFS通用的框架。

                int arr[]   // 解集

                dfs() {

                         if (){  //搜寻是否到达末尾

                              //解集操作

                          }

                        if(){     //或者为 for() , while()

                                dfs()  //判断后回溯递归

                         }

               }

      难点在于分析问题时,如何获取搜寻结点的终结条件,应怎样改变递归的参数.....

      回溯算法如百科所言是一种用于遍历或搜索树的算法。我们可以将问题分解绘成树状结构。

      

     DFS的简单演示时间结束~  希望对你有帮助。

 

转载于:https://www.cnblogs.com/win-D-y/p/5618482.html

你可能感兴趣的文章
(转)使用Python和OpenCV检测图像中的物体并将物体裁剪下来
查看>>
ASP.NET中MD5的加密方式很简单
查看>>
Day01
查看>>
[转载]在.Net Framework中获得系统环境信息(转)
查看>>
SpringMVC10数据验证
查看>>
socketIO原理图
查看>>
在VS2010上使用C#调用非托管C++生成的DLL文件
查看>>
2018亚洲区预选赛北京赛站网络赛 D.80 Days 尺取
查看>>
【09-14】eclipse学习笔记
查看>>
管理数据块空间
查看>>
JQuery this和$(this)的区别及获取$(this)子元素对象的方法
查看>>
端口(百科)
查看>>
主键自增与不自增的主键返回
查看>>
ubuntu 截图快捷键设置
查看>>
css经典布局学习
查看>>
PYTHON2.Git.1
查看>>
Trace 2018徐州icpc网络赛 思维+二分
查看>>
Rocketmq消息持久化
查看>>
[脚本] 一个用于BMP到EPS转换的BAT脚本实现(需要安装bmeps)
查看>>
最优二叉搜索树 java实现 学习 备忘
查看>>