python grakking-algorithm-note Unit6 7 8

第 6 章及第7章 广度优先搜索 U8 贪心算法
本章概览:
学会“到X的最短路径是什么”等问题。
学习有向图和无向图。
学习拓扑排序,这种排序算法指出了节点之间的依赖关系。

广度优先搜索 (breadth-first search,BFS)可以:
编写国际跳棋AI,计算最少走多少步就可获胜;
编写拼写检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词,如将READED改为READER需要编辑一个地方;
在这里插入图片描述

6.3.1 查找最短路径
再说一次,广度优先搜索可回答两类问题。
第一类问题:从节点A出发,有前往节点B的路径吗?(在你的人际关系网中,有芒果销售商吗?)
第二类问题:从节点A出发,前往节点B的哪条路径最短?(哪个芒果销售商与你的关系最近?)
刚才你看到了如何回答第一类问题,下面来尝试回答第二类问题——谁是关系最近的芒果销售商。
例如,朋友是一度关系,朋友的朋友是二度关系。

在你看来,一度关系胜过二度关系,二度关系胜过三度关系,以此类推。
因此,你应先在一度关系中搜索,确定其中没有芒果销售商后,才在二度关系中搜索。
广度优先搜索就是这样做的!
在广度优先搜索的执行过程中,搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再检查二度关系。
你也可以这样看,一度关系在二度关系之前加入查找名单。
你按顺序依次检查名单中的每个人,看看他是否是芒果销售商。这将先在一度关系中查找,再在二度关系中查找,因此找到的是关系最近的芒果销售商。
广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。
。因此,你需要按添加顺序进行检查。有一个可实现这种目的的数据结构,那就是队列 (queue
队列的工作原理与现实生活中的队列完全相同。假设你与朋友一起在公交车站排队,如果你排在他前面,你将先上车。队列的工作原理与此相同。
队列类似于栈,你不能随机地访问队列中的元素。
队列只支持两种操作:入队 和出队 。(First In First Out,FIFO)

6.4 实现图

首先,需要使用代码来实现图。图由多个节点组成。
每个节点都与邻近节点相连,如果表示类似于“你→Bob”这样的关系
呢?好在你知道的一种结构让你能够表示这种关系,它就是散列表
散列表让你能够将键映射到值。在这里,你要将节点映射到其所
有邻居。
graph = {}
graph[“you”] = [“alice”, “bob”, “claire”]
,“你”被映射到了一个数组,因此graph[“you”] 是一个数组,其中包含了“你”的所有邻居。
Anuj、Peggy、Thom和Jonny都没有邻居,这是因为虽然有指向他们的箭头,但没有从他们出发指向其他人的箭头。这被称为有向图 (directed graph),其中的关系是单向的。因此,Anuj是Bob的邻居,但Bob不是
Anuj的邻居。
无向图 (undirected graph)没有箭头,直接相连的节点为邻居。

在这里插入图片描述
在这里插入图片描述

summary:广度优先搜索指出是否有从A到B的路径。
如果有,广度优先搜索将找出最短路径。
面临类似于寻找最短路径的问题时,先使用图来创建模型,再使用广度优先搜索来解问题。
有向图中的边为箭头,箭头的方向指定了关系的方向,例如,
rama→adit表示rama欠adit钱。
无向图中的边不带箭头,其中的关系是双向的,例如,ross - rachel表示“ross与rachel会,而rachel也与ross约会”。

队列是先进先出(FIFO)的。
栈是后进先出(LIFO)的。
你需要按加入顺序检查列表中的人,否则找到的不是最短路径,so搜索列表必须是队列。
对于检查过的人,务必不要再去检查,否则可能导致无限循环

第七章 狄克斯特拉算法

概览:
1.介绍加权图——提高或降低某些边的权重。
2.介绍狄克斯特拉算法,让你能够找出加权图中前往X的最短路径。
3.介绍图中的环,它导致狄克斯特拉算法不管用。
在这里插入图片描述

在这里插入图片描述
前一章,你使用了广度优先搜索来查找两点之间的最短路径,那时“最短路径”的意思是段数最少。
在狄克斯特拉算法中,你给每段都分配了一个数字或权重,因此狄克斯特拉算法找出的是总权重最小的路径。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

P***–P230没有看!!!!!!

小结:
广度优先搜索用于在非加权图中查找最短路径。
狄克斯特拉算法用于在加权图中查找最短路径。
仅当权重为正时狄克斯特拉算法才管用。
如果图中包含负权边,请使用贝尔曼-福德算法。

U8 :贪婪算法

每步都采取最优的做法。在这个示例中,你每次都选择结束最早的课。
用专业术语说,就是你每步都选择局部最优解 ,最终得到的就是全局最优解。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值