ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【搜索算法】简要学习了解了下一些搜索算法

2022-07-01 12:33:42  阅读:167  来源: 互联网

标签:简要 狄克 路径 搜索算法 学习 算法 搜索 贝尔曼 顶点


1、广度优先搜索和深度优先搜索

  • 广度优先

    广度优先搜索的特征为从起点开始,由近及远进行广泛的搜索。因此,目标顶点离起点越近,搜索结束得越快。(候补顶点采用,FIFO先进先出)

  • 深度优先

    深度优先搜索的特征是沿着一条路径不断往下,进行深度搜索。(候补顶点采用栈,LIFO后进先出)

广度优先搜索选择的是最早成为候补的顶点,因为顶点离起点越近就越早成为候补,所以会从离起点近的地方开始按顺序搜索;而深度优先搜索选择的则是最新成为候补的顶点,所以会一路往下,沿着新发现的路径不断深入搜索。

2、贝尔曼-福特算法和狄克斯特拉算法

  • 贝尔曼-福特(Bellman-Ford)算法

    贝尔曼-福特算法是一种在图中求解最短路径问题的算法。最短路径问题就是在加权图指定了起点和终点的前提下,寻找从起点到终点的路径中权重总和最小的那条路径。

    将图的顶点数设为n、边数设为m,该算法经过n轮更新操作后就会停止,而在每轮更新操作中都需要对各个边进行1次确认,因此1轮更新所花费的时间就是O(m),整体的时间复杂度就是O(mn)。

    计算最短路径时,边的权重代表的通常都是时间、距离或者路费等,因此基本都是非负数。不过,即便权重为负,贝尔曼-福特算法也可以正常运行。但是如果在一个闭环中边的权重总和是负数,那么只要不断遍历这个闭环,路径的权重就能不断减少,也就是说根本不存在最短路径。遇到这种对顶点进行n次更新操作后仍能继续更新的情况,就可以直接认定它“不存在最短路径”。

  • 狄克斯特拉算法

    狄克斯特拉算法(Dijkstra)算法也是求解最短路径问题的算法,使用它可以求得从起点到终点的路径中权重总和最小的那条路径。

    相比贝尔曼-福特算法,狄克斯特拉算法多了一步选择顶点的操作,这使得它在最短路径上更为高效。

    将图的顶点设为n、边数设为m,那么如果事先不进行任何处理,该算法的时间复杂度就是O(n^2)。不对,对数据结构进行优化,时间复杂度就会变为O(m+nlogn)。

    当权重有负数的时候,狄克斯特拉算法可能会有问题。

不存在负数权重时,更适合使用效率较高的狄克斯特拉算法,而存在负数权重时,即便较为耗时,也应该使用可以得到正确答案的贝尔曼-福特算法

3、A*算法

A*算法预先会估算一个值,并利用这个值来省去一些无用的计算,如果能得到一些启发信息,即各个顶点到终点的大致距离,就可以使用A*。

如果距离估算值越接近当前顶点到终点的实际值,A*算法的搜索效率也就越高。反之,距离估算值与实际值相差较大,算法的效率可能比狄克斯特拉算法还要低,距离相差再大点,可能无法得到正确的答案。
当距离估算值小于实际距离时,是一定可以得到正确答案的,如果没有设置合适的距离估算值,效率会变差。

相关概念性内容来自于《我的第一本算法书》,该书有详细的图例解释。

标签:简要,狄克,路径,搜索算法,学习,算法,搜索,贝尔曼,顶点
来源: https://www.cnblogs.com/Balcher/p/16434161.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有