【算法日记】广度优先算法
广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。广度优先搜索让你能够找出两样东西之间最短的距离。在学习这个算法之前我们要了解图的概念
1.什么是图
如上图所示。图是有节点和边组成的。一个节点可能和很多节点直接相连,这些相邻的节点就被称作邻居
2.广度优先搜索
常常我们有这样一个问题,从一个起点开始要到一个终点,我们要找寻一条最短的路径
广度优先搜索可解决两个问题
从A到E有路径么?
从A到E的路径有那些?
A->B->E
A->D->E
A->C->D->E
假设每个节点间的距离是相等的。那么A到E的最短距离就是
A->B->E
A->D->E
广度优先搜索是这样做的。搜索范围从起点开始向外延伸。先检查一度关系,在检查二度关系,以此类推。直到遍历所有节点
3.算法实现
用字典保存图信息
route={ "A":["B","C","D"], # 起点 "B":["E"], "C":["D"], "D":["E"], "E":[] # 终点 }
def searchRoute(): """ 路线算法 """ route={ "A":["B","C","D"], # 起点 "B":["E"], "C":["D","F"], "D":["B","H"], "E":["H"], "F":["G"], "G":["H"], "H":[] # 终点 } path=[] start="A" end="H" def search(string): print string point=string[-1] print point print route[point] # # 如果有邻居存在 if route[point]: for each in route[point]: if each==end: path.append(string+each) break else: newPath=string+each search(newPath) if route[start]: for item in route[start]: new=start+item search(new) print path
最后出来的结果是数组包含A到E的所有路径
ps:图分有向图和无向图两种,节点之间关系是单向的是有向图。直接用直线的是五向图。有兴趣的可以多了解下。上面的例子用的是有向图