搜索算法系列之 DFS

简介: 搜索算法系列之 DFS

搜索系列之DFS

算法介绍

DFS(Depth-First-Search),即深度优先搜索 。是一种用于遍历或搜索的算法,这个算法会尽可能深的搜索树的分支。即在搜索到一个新节点时,立即对该节点进行遍历,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。重复此过程直到从源节点出发的所有节点均被访问。

DFS 是图论中经典的算法,因为发现此算法,John Edward Hopcroft 和  Robert Endre Tarjan 于 1986年共同获得了图灵奖。

实现方式

基于栈

因为在搜索到一个新的节点时,需要立即对该新节点进行遍历,因此遍历需要用先进后出的栈来实现。

说白了,就两点:

一条道走到黑:先选择当前节点的一个子节点进行深入,然后对子节点再进行深度优先搜索。

撞到南墙再回头:一直搜索到叶节点,然后向上回溯,再对另一个子节点进行深度优先搜索。

例如遍历以下这棵树

假设我们先遍历左孩子,再遍历右孩子。

我们首先定义出树节点Node:

classTreeNode{

 intval;

 TreeNodelChild;  

 TreeNoderChild;

   TreeNode(intvalue){

       val=value;

   }

}

我们创建一个栈用来存放Node节点:

Stack<Node>stack=newStack<Node>;

  1. 我们首先将根节点root放入到栈中:

  1. 然后我们出栈栈顶元素并访问之,再判断其是否存在右左孩子,若存在则将其压入栈中。

(注:我们先压入右孩子,再压入左孩子,这样出栈的时候就保证了先遍历到左孩子再是右孩子)

  1. 紧接着我们又出栈栈顶元素,重复循环步骤 2。

    基于栈完整代码:

classSolution{

 publicvoiddfs(TreeNoderoot){

       if(root==null) returnnull;

       Stack<TreeNode>stack=newStack();

       stack.push(root);

       while(!stack.isEmpty()){

           TreeNodecurrNode=stack.pop();

           System.out.println(currNode.val);  

           if(currNode.rChild!=null){

             stack.push(currNode.rChild);  

           }

           if(currNode.lChild!=null){

               stack.push(currNode.lChild);

           }                  

       }

 }

}

递归

我们知道函数的调用就是栈结构,所以也可以通过递归实现。

同样上边的例子,其实就是树的前序遍历:

classSolution{

 publicvoiddfs(BTreeroot){

       if(root==null) returnnull;

       System.out.println(root.val);

       dfs(root.lChild);

       dfs(root.rChild);    

   }

}


目录
相关文章
|
13天前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战
Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现SSA智能麻雀搜索算法优化支持向量机回归模型(SVR算法)项目实战
Python实现SSA智能麻雀搜索算法优化支持向量机回归模型(SVR算法)项目实战
|
4天前
|
机器学习/深度学习 数据采集 算法
Python实现SSA智能麻雀搜索算法优化支持向量机分类模型(SVC算法)项目实战
Python实现SSA智能麻雀搜索算法优化支持向量机分类模型(SVC算法)项目实战
|
5天前
|
机器学习/深度学习 人工智能 分布式计算
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
机器学习中的超参数调优是提升模型性能的关键步骤,包括网格搜索、随机搜索、贝叶斯优化和遗传算法等方法。网格搜索通过穷举所有可能的超参数组合找到最优,但计算成本高;随机搜索则在预设范围内随机采样,降低计算成本;贝叶斯优化使用代理模型智能选择超参数,效率高且适应性强;遗传算法模拟生物进化,全局搜索能力强。此外,还有多目标优化、异步并行优化等高级技术,以及Hyperopt、Optuna等优化库来提升调优效率。实践中,应结合模型类型、数据规模和计算资源选择合适的调优策略。
10 0
算法金 | 最难的来了:超参数网格搜索、贝叶斯优化、遗传算法、模型特异化、Hyperopt、Optuna、多目标优化、异步并行优化
|
10天前
|
算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
5天前
|
机器学习/深度学习 数据采集 自然语言处理
Python实现支持向量机SVM分类模型(SVC算法)并应用网格搜索算法调优项目实战
Python实现支持向量机SVM分类模型(SVC算法)并应用网格搜索算法调优项目实战
|
5天前
|
机器学习/深度学习 数据采集 算法
Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战
Python实现人工神经网络回归模型(MLPRegressor算法)并基于网格搜索(GridSearchCV)进行优化项目实战
|
17天前
|
机器学习/深度学习 算法
机器学习中的超参数优化涉及手动尝试、网格搜索、随机搜索、贝叶斯优化、梯度优化、进化算法等策略
【6月更文挑战第28天】**机器学习中的超参数优化涉及手动尝试、网格搜索、随机搜索、贝叶斯优化、梯度优化、进化算法等策略。工具如scikit-optimize、Optuna助力优化,迁移学习和元学习提供起点,集成方法则通过多模型融合提升性能。资源与时间考虑至关重要,交叉验证和提前停止能有效防止过拟合。**
26 0