首页 > 代码库 > 【算法日记】广度优先算法

【算法日记】广度优先算法

广度优先算法是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。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:图分有向图和无向图两种,节点之间关系是单向的是有向图。直接用直线的是五向图。有兴趣的可以多了解下。上面的例子用的是有向图

 

【算法日记】广度优先算法