算法-数据结构入门(五)——《算法图解》

这节开始进入图的学习。下面介绍几个新概念:

散列表(字典):一种新的数据结构,形式是“键-值对”,可快速插入、查找

队列:一种新的数据结构,可以理解为排队买东西,队尾插入,队首弹出

图: 模拟一组连接,由节点和边组成

下面引入一个书上的例子:你要在你的关系圈中找一个人,假设这个人名字最后一个字母是'm',关系圈指的是你的朋友,你朋友的朋友,一直找下去,直到找到或关系圈结束。

思考:我们每个人都可以看做是一个节点,好友关系则为边,我们如何来用代码表示图呢,可以用散列表(字典):键为节点,值为节点的邻居。这样我们通过键可以拿到节点的所有邻居,并把这些邻居放入一个队列,然后遍历邻居,如果一个邻居不是要找的人,则把他的邻居也加入到这个队列里,直到这个队列为空或找到为止,其实这就是广度优先搜索。

模拟数据及代码如下:

from collections import deque
graph = {}
graph["you"] = ['alice','bob','clarire']
graph['bob'] = ['anuj','peggy']
graph['alice'] = ['peggy']
graph['clarire'] = ['thom','jonny']
graph['anuj'] = []
graph['peggy'] = []
graph['thom'] = []
graph['jonny'] = []

def search(name):
    search_deque = deque()
    search_deque += graph[name]
    while search_deque:
        person = search_deque.popleft()
        if person_is_findman(person):
            print person +  ' is the man that you find'
            return True
        else:
            search_deque += graph[person]
    return False
    
def person_is_findman(name):
    return name[-1] == 'm'
    
search('you')

分析一下广度优先搜索算法的时间复杂度:添加一个人进入队列O(1),n个人O(n),沿每条边前行,O(v),所以复杂度为O(n+v).

广度优先搜索的步骤或者可以说是最终可实现的:

1.可以查找到目标节点有没有路径,即能不能到达目标节点

2.到达目标节点的最短路径

你可能感兴趣的:(算法-数据结构入门)