深度优先遍历和广度优先遍历思考
2015-07-03 11:38
363 查看
原地址
在说两种算法之前先说说什么叫“搜索”:
可能很多人对搜索的想法有点不对,很多人认为搜索是对已知的一棵树或者是已知的图进行搜索,所以我们常常把搜索和遍历给搞混了,但是其实搜索针对的并不是已知的,这并不代表搜索不能用于已知的,搜索一般用于未知的树,或者未知的图,而我们仅仅是知道这个树或图的产生规则。这个时候才会产生深度优先搜索和广度优先搜索。
然后说一下深度优先搜索和广度优先搜索的区别以及适用范围:
广度优先搜索:广度优先搜索是按照树的层次进行的搜索,如果此层没有搜索完成的情况下不会进行下一层的搜索。
深度优先搜索:深度优先搜索是按照树的深度进行搜索的,所以又叫纵向搜索,在每一层只扩展一个节点,直到为树的规定深度或叶子节点为止。这个便称为深度优先搜索。
我先来说说两种算法的不同点。广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索。因为由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。
适用范围:这点很重要,因为知道两者的适用范围对于编程人员很有好处,至少可以少走弯路。(这些都是开个人观点,有缺少的欢迎补充)
广度优先搜索适用范围:在未知树深度情况下,用这种算法很保险和安全。在树体系相对小不庞大的时候,广度优先也会更好些。
深度优先搜索适用范围:刚才说了深度优先搜索又自己的缺陷,但是并不代表深度优先搜索没有自己的价值。在树深度已知情况下,并且树体系相当庞大时,深度优先搜索往往会比广度优先搜索优秀,因为比如8*8的马踏棋盘中,如果用广度搜索,必须要记录所有节点的信息,这个存储量一般电脑是达不到的。然而如果用深度优先搜索的时候却能在一个棋盘被判定出来后释放之前的节点内存。
当让具体情况还是根据具体的实际问题而定,并没有哪种绝对的好。所以,理解这两种算法的本质是关键。
最后我说说关于找最优解的问题,这种问题如果不依靠其他的辅助算法来说,其实对于广度优先搜索和深度优先搜索来说是一样的,说白了找最优解就是个遍历过程,所以没有哪种算法找最优解更好。但是如果有辅助的启发式算法或者别的算法就另当别论了。
在说两种算法之前先说说什么叫“搜索”:
可能很多人对搜索的想法有点不对,很多人认为搜索是对已知的一棵树或者是已知的图进行搜索,所以我们常常把搜索和遍历给搞混了,但是其实搜索针对的并不是已知的,这并不代表搜索不能用于已知的,搜索一般用于未知的树,或者未知的图,而我们仅仅是知道这个树或图的产生规则。这个时候才会产生深度优先搜索和广度优先搜索。
然后说一下深度优先搜索和广度优先搜索的区别以及适用范围:
广度优先搜索:广度优先搜索是按照树的层次进行的搜索,如果此层没有搜索完成的情况下不会进行下一层的搜索。
深度优先搜索:深度优先搜索是按照树的深度进行搜索的,所以又叫纵向搜索,在每一层只扩展一个节点,直到为树的规定深度或叶子节点为止。这个便称为深度优先搜索。
我先来说说两种算法的不同点。广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索。因为由于一个有解的问题树可能含有无穷分枝,深度优先搜索如果误入无穷分枝(即深度无限),则不可能找到目标节点。所以,深度优先搜索策略是不完备的。
适用范围:这点很重要,因为知道两者的适用范围对于编程人员很有好处,至少可以少走弯路。(这些都是开个人观点,有缺少的欢迎补充)
广度优先搜索适用范围:在未知树深度情况下,用这种算法很保险和安全。在树体系相对小不庞大的时候,广度优先也会更好些。
深度优先搜索适用范围:刚才说了深度优先搜索又自己的缺陷,但是并不代表深度优先搜索没有自己的价值。在树深度已知情况下,并且树体系相当庞大时,深度优先搜索往往会比广度优先搜索优秀,因为比如8*8的马踏棋盘中,如果用广度搜索,必须要记录所有节点的信息,这个存储量一般电脑是达不到的。然而如果用深度优先搜索的时候却能在一个棋盘被判定出来后释放之前的节点内存。
当让具体情况还是根据具体的实际问题而定,并没有哪种绝对的好。所以,理解这两种算法的本质是关键。
最后我说说关于找最优解的问题,这种问题如果不依靠其他的辅助算法来说,其实对于广度优先搜索和深度优先搜索来说是一样的,说白了找最优解就是个遍历过程,所以没有哪种算法找最优解更好。但是如果有辅助的启发式算法或者别的算法就另当别论了。
相关文章推荐
- Java 从数据库里读取数据,并将数据赋予某变量
- JavaScript事件驱动机制&定时器机制
- unity中IOS和Android真机Profiler
- 数组中重复元素最多的数
- HDU 1004 — Let the Balloon Rise
- Mapper过程中Combiner的作用
- ibatis新手入门
- 【C语言】写一个函数,实现字符串内单词逆序
- JavaScript事件驱动机制&定时器机制
- js中关于数据类型的转换
- Swift 闭包(六)
- 求教贴,一个可能很白痴的问题,有时间又很闲的大神给解决下
- 在Windows下用C++扩展PHP
- GRE写作必备句型
- 静坐常思己过,闲谈莫论人非
- 【Effective Objective-C 2.0读书笔记】第四章:协议和分类
- 设计模式读书笔记:Prototype(原型)
- Android四大基本组件介绍与生命周期
- 元器件选型(一)ESD、TVS参考资料
- hibernate总结