• 1.有向图

    图也是一种常用到的数据结构,图分有向图和无向图。其中有向图,同时,树其实是一种特殊的有向图。

    有下面一个问题,我们需要出售芒果,需要联系朋友们找芒果商。

    image-20201211161130021

    在构建图算法的时候需要注意,我们需要标记某个元素是不是已经被查找过了,不然的话可能会造成死循环。比如下面的情况,你的朋友是peggy,peggy的朋友又是你,如果不标记的话,就会无限循环查找你们两个。

    image-20201211161538559

    下面的算法中还使用到了广度优先搜索,广度优先搜索包含两个方面

    1.确定A-B之间是否存在路径
    2.如果有路径,寻找A-B之间的最短路径
    

    所以对于我们的需求来说,我们会优先找离自己最近的一圈朋友,也就是下图圈起来的三个,会被优先搜索,他们的朋友会依次插入到我们搜索的列表中,此时我们又使用到了queue,即队列,先进先出,我们的三个朋友要先在队列中,而后面的朋友需要依次加入这个队列

    image-20201211161917247

    # 以下算法为在自己的朋友中找芒果商,寻找名字中结尾m的人,他是芒果商
    
    from collections import deque
    
    # 构建关系结构,图的关系结构是由字典和数组构成的,字典的key表示人,value表示他的朋友们,如果列表为空则没有朋友
    graph = {} 
    graph["you"] = ["alice", "bob", "claire"]  # 初始队列
    graph["bob"] = ["anuj", "peggy"]
    graph["alice"] = ["peggy"]
    graph["claire"] = ["thom", "jonny"]
    graph["anuj"] = []
    graph["peggy"] = []
    graph["thom"] = []
    graph["jonny"] = []
    
    
    def person_is_seller(name):  # 找芒果商
        return name[-1] == 'm'
    
    
    def search(name):
        search_queue = deque()
        search_queue += graph[name]
        searched = []  # 定义一个存放已经查询过的人的列表,防止循环查询
        while search_queue:
            person = search_queue.popleft()  # 出栈一个人,找到他的朋友们
            if not person in searched:
                if person_is_seller(person):
                    print(person + " is a mango seller!")
                    return True
            else:
                search_queue += graph[person]
                searched.append(person)
        print('not find')
        return False
    
    search("you")
    

    2.无向图

    以下的两种图是等价的,无向图没有箭头,直接相连的节点互为邻居。

    image-20201211162539279

    3.简单的树

    下面的这种图,也被称为树,树是一种特殊的图

    image-20201211162459389

    4.总结

    1 广度优先搜索指出是否有从A到B的路径。
    2 如果有,广度优先搜索将找出最短路径。
    3 面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题。
    4 有向图中的边为箭头,箭头的方向指定了关系的方向,例如,rama→adit表示rama欠adit钱。
    5 无向图中的边不带箭头,其中的关系是双向的,例如,ross - rachel表示“ross与rachel约会,而rachel也与ross约会”。
    6 你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列。
    7 对于检查过的人,务必不要再去检查,否则可能导致无限循环。
    
  • 相关阅读:
    STM32 ~ 查看系统时钟
    Allegro从.brd文件中导出器件封装
    Cadence原理图与Allegro交互
    Cadence关闭StartPage的方法
    emWin 移植
    python闭包
    python多线程之threading
    3.1决策树算法应用
    3.1决策树算法
    MyEclipse10 配置python的pyDev
  • 原文地址:https://www.cnblogs.com/chiyun/p/14121060.html
Copyright © 2020-2023  润新知