算法图解-广度优先搜索 6/11

7 狄克斯特拉算法(带权的最短路径,地图路线中的算法)有点没看明白,下期整理。

6 广度优先搜索

广度优先搜索(breadth-first search,BFS)解决等权重中路径选择的问题,类似于有多条公交线路可选时,如何找到站数(只管站数,不管站间权重)最少的路线。

算法的核心过程:基于图,一级一级的做遍历:

  • step1 从出发点开始,检查一站以内(出发点的相邻点,)可以到达的地方,是否包含终点;
  • step2 把一站到达的点的相邻点加入验证(即两站可达点,二级关系),是否包含终点;
  • 重复step2 直到发现终点,或者相邻站点为空。

可用于解决以下问题:

  • 编写国际跳棋 AI,计算最少走多少步就可获胜;
  • 编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将 READED 改为 READER 需要编辑一个地方;
  • 根据你的人际关系网络找到关系最近的医生。

6.1 先了解下图

(话说本科毕业论文就是用广义多项式可以描述一个图)

图,节点和边(线)组成,分有向图、无向图。

一个有向图示例

6.2 广度优先搜索

广度优先搜索是一种用于图的查找算法,可帮助回答两类问题:
第一类问题:从节点 A 出发,有前往节点 B 的路径吗?
第二类问题:从节点 A 出发,前往节点 B 的哪条路径最短?

示例问题:从社交网络朋友圈中发现一个芒果销售商?

  1. 可以在自己的好友中找;(一度关系)——>否——>2
  2. 好友中没有,就在好友的好友中找 ——>否——>2 重复,直到朋友网络为空。
'朋友圈'

这个过程中,在数据上实现时,先是将一度关系列入待检查数据,如果没有,则将二度关系依次列入待检查数据,并在一度关系检查完后再开始检查二度关系,这种数据结构称为队列。

6.3 队列

队列类似于栈,你不能随机地访问队列中的元素。队列只支持两种操作:入队和出队。

image.png

队列是一种先进先出(First In First Out,FIFO)的数据结构,而栈是一种后进先出(Last In First Out,LIFO)的数据结构。

image.png

6.4 广度优先搜索实现

首先要用数据表现出这种‘相邻’,或者说好友关系。——>正好可以用 散列表

上面的 ‘朋友圈’图,在python中即可以用字典来表示:

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"] = []

重复一遍算法原理:

image.png

有了数据之后,创建一个队列:

from collections import deque
search_queue = deque()  ←------------创建一个队列
search_queue += graph["you"]  ←------将你的邻居都加入到这个搜索队列中

然后循环检查:

while search_queue:  ←------只要队列不为空
    person = search_queue.popleft()  ←------就取出其中的第一个人
    if person_is_seller(person):  ←------检查这个人是否是芒果销售商
        print person + " is a mango seller!"  ←------是芒果销售商
        return True
    else:
        search_queue += graph[person]  ←------不是芒果销售商。将这个人的朋友都加入搜索队列
return False  ←------如果到达了这里,就说明队列中没人是芒果销售商

6.5 避免重复检查

二度关系中可能有人同时和一度关系中的两个以及相关,这时可能出现两次入队的情况,容易造成循环检查。

解决办法是建立一个已检查清单,若已检查,则不再重复检查。

6.6 运行时间

广度优先搜索是沿图的边逐一进行的,故运行时间首先是 边数;
在运行过程中还创建了一个待检查清单,该清单最大数量即是所有节点,所以,广度优先搜索的运行时间为 O(人数 + 边数),这通常写作 O(V + E).

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容