Grokking algorithms(第六章)breadth-first search

本文围绕图和广度优先搜索算法展开。介绍了图由节点和边组成,有有向图和无向图之分。以找芒果售卖商为例阐述广度优先搜索算法,该算法按先一度连接再二度连接顺序搜寻以找最短路径。还提及队列特点,最后给出算法实现的代码及例子。

What is a graph?


图的结构如下图所示

图由node和edge组成,一个node可利用edge与其他node连结,连结的node称为当前node的neighbors, 

下图中,rama为alex的neighbor,而adit不是alex的neighbor

Breadth-frst search
 

以芒果售卖为例子,你需要在你的朋友中找到芒果售卖商,你找你的朋友,bob,Alice,Claire,看看他们是否售卖芒果,如下图所示,很有可能你的朋友们都不售卖芒果

这时候改变思路, 不仅联系你的朋友,还联系你朋友的朋友,范围非常广

 

算法流程为:联系你的一个朋友Alice,假如他售卖芒果就结束,else:把所有alice的朋友的名字增加进搜索列表 

Finding the shortest path

Breadth-frst search算法会给你两个结果

 现在定义frst-degree connections 和second-degree connections,以芒果售卖为例

first-degree connections:和你直接关联的朋友

second-degree connections: 你朋友的朋友

在算法搜寻过程中,先搜寻first-degree connections,然后在搜寻second-degree connections,如下图所示,先搜寻BOB,再搜寻ANUJ

搜索顺序写成表的形式,就像下面这样 

 一定要以先first-degree 再second-degree的顺序来进行搜寻,否则求出的路径不会是最短路径。

Queues

queue(队列):不能随机读取队列中的任意元素,只有两种操作,enqueue和dequeue,如下图所示

queue的特点是FIFO,first in , first out

stack的特点是LILO,last in, last out (详情见第3章的递归)

Implementing the graph

 可以用哈希表,也就是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”] = []

因为哈希表不care顺序,所以以下的表达也是成立的

 如上图所示,Anuj这个节点,有一个箭头指向他,然而,这个节点却没有箭头指向其他地方,这种单项关系叫有向图(directed graph),因此Anuj是rob的邻居,然而,rob却不是Anuj的邻居。无向图(undirected graph)没有箭头,因此两个节点都是各自的邻居,如下图所示,下图是等价

Implementing the algorithm

 执行细节,如下图所示

代码实现,把'you'的邻居都增加进queue中

from collections import deque
search_queue = deque()
search_queue += graph[“you”]

 搜寻过程的伪代码如下所示:

在添加邻居的时候,需要检查这位邻居以前有没有被添加过,否则会造成死循环

最终代码如下所示

例子

上图,做的顺序可以是

也可以是

在举一个例子

 

因为dressed依赖于shower,因此,只要dressed在shower后面就可以,dressed和brush teeth没有依赖关系,所以排列的位置可以任意。 

树 的定义:没有edge point back(edge不会返回到上一个节点),是一种特殊的图

 本章要点

 

 

 

内容概要:本文档是一份针对2025-2026年Java后端大厂面试的高频考点全面梳理,涵盖Java基础、集合框架、并发编程、JVM、Spring全家桶、MySQL、Redis、消息队列、分布式与微服务等核心技术模块。内容不仅包括经典概念辨析(如String与StringBuilder区别、HashMap底层结构),还深入源码机制与设计原理(如Spring三级缓存解决循环依赖、AOP动态代理实现),并结合实际场景探讨问题排查与技术选型(如GC调优、缓存穿透解决方案)。特别强调从“背八股”向源码理解、线上排障和设计权衡的能力转变,体现当前面试趋势的深度化与实战化。; 适合人群:具备1-3年工作经验,准备冲击中高级Java岗位的研发人员,尤其适合希望系统提升面试竞争力、深入理解主流技术底层原理的开发者。; 使用场景及目标:①应对大厂Java后端技术面试,掌握高频考点与最新趋势;②深入理解核心技术的设计动机与实现细节,如ConcurrentHashMap的线程安全机制、分布式ID生成方案对比;③提升实际问题分析与解决能力,如Full GC排查、事务失效定位等。; 阅读建议:此资源以面试为导向,兼具广度与深度,建议结合自身项目经验进行对照学习,注重理解“为什么”而非仅仅记忆结论,对关键知识点应动手验证(如ThreadLocal内存泄漏实验),并在模拟面试中强化表达逻辑。
代码下载链接: https://pan.quark.cn/s/8df2b016201b 555 芯片的引脚布局、功能特性、引脚示意图以及引脚说明是关键信息。555 芯片作为一种集成电路,具有多样化的功能特性,在定时器、定时延时控制、调光、调温、调压、调速等多种控制及计量检测领域有着广泛的应用。接下来将展示 555 芯片的引脚示意图和引脚说明: 1. 555 芯片引脚示意图:555 芯片包含 8 个引脚,具体如下: * 1 脚:地线端 * 2 脚:触发输入端 * 3 脚:输出端 * 4 脚:复位端 * 5 脚:控制端 * 6 脚:阈值端 * 7 脚:放电端 * 8 脚:电源端 2. 555 芯片引脚说明: * 1 脚:地线端,用于连接电路的负极部分。 * 2 脚:触发输入端,用于接收外部信号的输入,进而控制输出端的状态。 * 3 脚:输出端,输出高电平或低电平信号,其状态受触发器控制。 * 4 脚:复位端,当输入低电平时,输出端会输出低电平信号。 * 5 脚:控制端,用于调节输出端的状态,能够改变上下触发电平的数值。 * 6 脚:阈值端,作为上比较器的输入端,当输入高电平时,输出端会输出低电平信号。 * 7 脚:放电端,是内部放电管的输出端,其输出电平状态受触发器控制。 * 8 脚:电源端,用于连接电源的正极部分。 3. 555 芯片工作原理:555 芯片的工作原理是通过上比较器和下比较器来控制输出端的状态。上比较器的输入端位于 6 脚,而下比较器的输入端位于 2 脚。根据输入端的电平状态,输出端会输出高电平或低电平信号。 4. 555 芯片应用领域:555 芯片在各种电子产品中有着广泛的应用,例如在定时器、定时延时控制、调光、调温、调压、调速等领域。它还可以用于...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值