07 / 非线性结构、查找与排序 · 小节 1
树、二叉树与遍历
画树并按规定顺序遍历,理解搜索树的条件。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:算法、复杂度与递归 栈与队列:不同的出场顺序 · 符号回看
从一个问题开始
文件夹有层级,为什么用一条链描述不自然?
先序遍历:根、左、右
先访问根B。
再访问左子树A。
回到右子树先访问其根D。
最后访问D的左子树C,序列B A D C。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
树连接父子关系,无环;根没有父节点,叶子无子节点。二叉树每节点最多两个有区别的孩子,左和右不能随便交换。完全二叉树除最后层外满,最后层向左连续;不是所有二叉树都适合紧凑数组存储。遍历:先序根左右,中序左根右,后序左右根;层序使用队列。二叉搜索树BST要求每个节点左子树键较小、右子树较大,重复键策略须约定;中序结果有序。
为什么成立 · 关键推导
递归遍历先处理空树:直接返回;其余按所选顺序访问根和两个子树。搜索按比较选择一个分支,复杂度O(h),h是树高;平衡时O(log n),退化成链时O(n)。不是出现“树”就自动对数复杂度。
入门例题 / 1
根B,左A,右D且D左C:先序B A D C,中序A B C D,后序A C D B,层序B A D C。每次先写规则再走图。
典型应用与变式 / 2
把1、2、3、4顺序插入普通BST会形成右链,查4需走4个节点。平衡树通过维护高度等信息避免这种退化,但本节不要求实现全部平衡操作。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
知道中序序列就能唯一恢复二叉树吗?
需要一点提示
不同形状能有同一中序。
查看过程、答案与错因
不能;互异标签的中序配合先序或后序通常可重建,只有中序不够。
计算与执行过程
根2、左1、右3,写三种深度遍历。
需要一点提示
根访问的时机不同。
查看过程、答案与错因
先序2,1,3;中序1,2,3;后序1,3,2。
条件与错误辨析
BST中序含重复值一定违反定义吗?
需要一点提示
先问重复键存放规则。
查看过程、答案与错因
不一定。有的实现合并计数,有的规定放某侧;题目必须统一规则,不能默认所有实现都禁止重复。
继续实践 · 工具与示范
先按图示和正文用纸笔追踪,再阅读以下伪代码。箭头←为赋值,“若”为条件,“当”为循环;不是可直接编译的C。
preorder(node):
若 node 为空:返回
访问 node
preorder(node.left)
preorder(node.right)
将访问根移到两次递归之间是中序;移到之后是后序。带走这一句
遍历是访问规则,搜索树是大小约束,两者别混淆。
07 / 非线性结构、查找与排序 · 小节 2
哈夫曼树:让常见符号更短
一步步合并最小权重,检验编码能否无歧义解码。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
从一个问题开始
四个字母频率不同,用一样长的编码会浪费什么?
每次合并当前最小两项
初始权重1、2、3、4。
1与2合并为3,剩3、3、4。
3与3合并为6,剩4、6。
4与6合并为10。WPL=3+6+10=19。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
叶子权重代表频率,路径长度是根到叶的边数。带权路径长度WPL=Σ权重×长度。哈夫曼算法反复选择当前最小的两棵树合并,新根权重为两者之和,直到只剩一棵。左边0右边1可得前缀码:没有一个符号编码是另一个的前缀,因此可即时逐段解码。同权时合并次序可能不唯一,但最优WPL相同。
为什么成立 · 关键推导
频率越高,短路径节省越多;贪心选择把最低频符号放到最深相邻叶,再将其视为一个合并符号递归处理。WPL也等于每次合并产生的新权重之和,可用于独立核算。
入门例题 / 1
权重1、2、3、4:1+2=3;3+3=6;4+6=10。WPL=3+6+10=19。可给4编码0、原3编码10、1编码110、2编码111,核算4×1+3×2+1×3+2×3=19。
典型应用与变式 / 2
码{0,10,110,111}中串010111可拆0|10|111。码{0,01,1}不是前缀码,因为0是01的前缀,串01可拆成01或0|1,产生歧义。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
哈夫曼编码必须唯一吗?
需要一点提示
左右分配0和1也能交换。
查看过程、答案与错因
不唯一。同权合并和左右方向可变,码字不同但可保持同样WPL。
计算与执行过程
权重2、3、7的WPL是多少?
需要一点提示
先合并最小两个。
查看过程、答案与错因
2+3=5,再5+7=12,总WPL17;叶深2、2、1核算4+6+7=17。
条件与错误辨析
每次只选一个最小权重与最大权重合并还能保证最优吗?
需要一点提示
算法要求两最小。
查看过程、答案与错因
不能。贪心依据被破坏;不能因为仍生成前缀树就称其最优。
继续实践 · 工具与示范
先按图示和正文用纸笔追踪,再阅读以下伪代码。箭头←为赋值,“若”为条件,“当”为循环;不是可直接编译的C。
把所有正频率叶放入最小优先队列Q
当 Q 至少有2项:
a ← 取最小项;b ← 再取最小项
新根权重 ← a.weight+b.weight
新根左右孩子 ← a,b
新根放回Q
仅一个符号时,实际码流需约定长度/码字以支持解码。带走这一句
前缀条件保证能解码,最小合并保证加权长度最优。
07 / 非线性结构、查找与排序 · 小节 3
图的表示、遍历与拓扑次序
把关系转成图,按明确规则执行遍历。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:哈夫曼树:让常见符号更短 · 符号回看
从一个问题开始
校园道路与课程先修关系都能画成点和线,但方向意味着什么?
图遍历:发现时标记
从A开始,邻居按字母访问。
B、C加入队列,避免再次入队。
从B发现D,C再遇D时跳过。BFS得到A B C D。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
图G=(V,E),V是顶点,E是边。有向边有起止,无向边表示双向关系;权重表示长度或成本。邻接矩阵用V×V空间,查边快;邻接表只记录实际邻居,适合稀疏图。DFS深度优先沿一条路深入,使用递归或栈;BFS广度优先逐层扩张,使用队列,能求无权图最少边数路径。
遍历必须记visited防止环导致重复;非连通图要从每个尚未访问的点再开始。拓扑序只适用于有向无环图DAG,将入度0节点反复输出并删其出边;存在多个可选点时次序不唯一。
为什么成立 · 关键推导
先声明邻居访问顺序(本课按字母)。BFS节点入队时即标记可避免重复入队。DFS递归进入时标记。拓扑排序若输出数少于顶点数,则剩余部分有环,不能强行补成一个合法顺序。
入门例题 / 1
无向边AB、AC、BD、CD,从A按字母访问。BFS:A入队,发现B、C,再从B发现D,结果A B C D;DFS为A B D C。
典型应用与变式 / 2
先修边A→C、B→C、C→D。初始A、B入度0,输出A B C D合法,B A C D也合法;若再加D→A,形成环A→C→D→A,无法完成拓扑序。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
BFS一定求最小权重路径吗?
需要一点提示
无权的层数与带权距离不同。
查看过程、答案与错因
不一定;BFS适用于无权或相同正权边的最少边数问题,任意权重需相应算法。
计算与执行过程
无向链A—B—C,邻接矩阵按ABC怎么写?
需要一点提示
无自环对角为0,对称。
查看过程、答案与错因
。无向边在矩阵两侧各出现一次。
条件与错误辨析
DFS只从一个起点运行可遍历任意图所有节点吗?
需要一点提示
考虑另一个不连通分量。
查看过程、答案与错因
不能。要外层遍历所有点,对未访问点再启动DFS。
继续实践 · 工具与示范
先按图示和正文用纸笔追踪,再阅读以下伪代码。箭头←为赋值,“若”为条件,“当”为循环;不是可直接编译的C。
BFS(start):
start 标为已发现并入队
当队列非空:
u ← 出队;访问u
对u的邻居v(按题目约定次序):
若v未发现:标记v并入队
非连通图外层还须遍历所有未发现顶点。带走这一句
图算法的结果依赖方向、权重和访问顺序,先把约定写清。
07 / 非线性结构、查找与排序 · 小节 4
最短路径与最小生成树
区分一条最快路线与连接所有地点的最低总成本。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:图的表示、遍历与拓扑次序 · 符号回看
从一个问题开始
导航找A到D最短路,与铺网线连接全部楼,为什么不是同一题?
距离由路径累加,不能只看最后一条边
无向边AB1、AC4、BC2、BD5、CD1;起点A距离0。
确定B后,A到C由4改为1+2=3,A到D暂为1+5=6。
确定C后,A到D改善为3+1=4。路径A→B→C→D。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
单源最短路最小化起点到各点的路径总权;Dijkstra每次确定未确定点中暂定距离最小者,再松弛其出边,要求边权非负。松弛是检查d[v]>d[u]+w(u,v)并更新。Floyd依次允许每个点作中转,更新d[i][j]=min(d[i][j],d[i][k]+d[k][j]);可处理负边但不能存在相关负环,时间O(V³)。
无向连通图的最小生成树MST连通全部点、无环、边数V−1,总权最小。Prim从已有点集选最小跨界边,Kruskal按边权递增选不成环的边。非连通图只能得到生成森林。
为什么成立 · 关键推导
最短路径保持的是“到固定起点的距离”;MST选择的是连接割两侧的边。前者得到的树未必总边权最小。Dijkstra若存在负边,已确定距离可能被后来路径改小,贪心证明失效。
入门例题 / 1
无向边AB=1、AC=4、BC=2、BD=5、CD=1。从A:初始B1,C4,D∞;确定B后C3,D6;确定C后D4。最短A到D为A-B-C-D,长4。
典型应用与变式 / 2
同图Kruskal先AB1、CD1,再BC2连接两个分量,选3条边,总4。若选AC4、BD5虽可连通,却成本更高。重权相同可能出现多棵MST。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
最小生成树是否最小化每对节点的路径?
需要一点提示
目标函数是什么?
查看过程、答案与错因
不是,它最小化选中边总权,不保证每对路径最短。
计算与执行过程
有向边A→B=2、A→C=5、B→C=1,Dijkstra求A到C。
需要一点提示
确定B后松弛C。
查看过程、答案与错因
初值C5,经B得到2+1=3,故最短3,路径A→B→C。
条件与错误辨析
一条负边就一定导致Floyd不可用吗?
需要一点提示
区分负边与负环。
查看过程、答案与错因
不一定;无负环可计算最短路径。存在可达负环时,相关最短距离可能无下界。
继续实践 · 工具与示范
先按图示和正文用纸笔追踪,再阅读以下伪代码。箭头←为赋值,“若”为条件,“当”为循环;不是可直接编译的C。
Dijkstra(start):
d[start] ← 0;其他d ← ∞;已确定集合S ← 空
重复:
选S外有限d最小的u;若不存在则停止
u加入S
对u的出边(u,v,w):
若d[u]+w<d[v]:更新d[v]与前驱
前提:所有边权非负;未可达点保持∞。带走这一句
先问要最短一条路,还是最低成本连起所有点。
07 / 非线性结构、查找与排序 · 小节 5
顺序查找、二分与散列
执行查找并写明成立条件,处理冲突与删除。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:最短路径与最小生成树 · 符号回看
从一个问题开始
有序书架可不断对半,杂乱书堆为什么不行?
把这件事讲清楚
顺序查找逐项比,最坏O(n)。二分需按同一键有序且支持高效随机访问,维护闭区间[l,r],mid=l+floor((r−l)/2);相等返回,否则排除至少一半,最坏O(log n)。空区间l>r即失败。重复值若要求最左位置,需要相等时继续向左缩,不可直接任意返回。
散列函数将键映到槽。冲突是不同键映到同槽,不能完全避免。链地址把冲突放链中;开放定址按探测序列找空槽,删除需墓碑等处理,不能随便清空破坏查找链。装填因子α=元素数/槽数,越满通常冲突越多,平均O(1)有散列质量与负载假设。
为什么成立 · 关键推导
二分每次保持:若目标存在,则仍在候选区间内。散列先算槽,再按同样探测规则查找,直至找到或遇真正未使用位置;满表必须有探测次数上限,避免无限循环。
入门例题 / 1
有序[2,5,8,11,15]查11:l0 r4 mid2值8,移l3;mid3值11成功。无序[11,2,8,5,15]不能照此排除左半。
典型应用与变式 / 2
7个槽,h(k)=k mod7,插10、17、24,线性探测占3、4、5。查24依次看3、4、5。删17若把4直接当从未使用,查24可能错误停止,应保留墓碑。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
二分对链表一定有O(log n)总时间吗?
需要一点提示
取得中间节点需要走多久?
查看过程、答案与错因
不一定。比较次数可少,但定位中点可能线性,不能忽略存储结构访问成本。
计算与执行过程
[1,3,5,7]闭区间二分查2的比较顺序?
需要一点提示
mid向下取整。
查看过程、答案与错因
比较3,再1,之后l=1,r=0,失败;两次比较。
条件与错误辨析
散列函数不能无冲突,就没有价值吗?
需要一点提示
冲突可管理,平均性能仍可好。
查看过程、答案与错因
不是。合理分布、冲突处理与扩容仍可高效;不能宣称任意输入最坏O(1)。
继续实践 · 工具与示范
先按图示和正文用纸笔追踪,再阅读以下伪代码。箭头←为赋值,“若”为条件,“当”为循环;不是可直接编译的C。
binary(a,n,key):
l ← 0;r ← n−1
当 l≤r:
mid ← l+floor((r−l)/2)
若a[mid]=key:返回mid
若a[mid]<key:l ← mid+1
否则:r ← mid−1
返回未找到
前提:a非降序且可随机访问;返回任一匹配位置。带走这一句
查找速度来自可利用的结构与条件。
07 / 非线性结构、查找与排序 · 小节 6
排序过程、稳定性与取舍
手动走一轮排序,按输入特点比较算法。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:顺序查找、二分与散列 · 符号回看
从一个问题开始
成绩相同的人要保留报名先后,选排序方法时要多看哪个指标?
插入排序:扩大有序前缀
初始只有首项3视为已排序。
取1,把3右移,前缀变为1、3。
取2,把3右移,插入中间得到1、2、3。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
稳定排序保持相同键元素原先的相对顺序。直接插入把当前元素插到已排好前缀;冒泡比较邻项并交换;简单选择每轮找最小换到前面。三者通常O(n²),插入在近乎有序时可高效。快速排序按枢轴分区再递归,平均O(n log n)、最坏O(n²);归并把有序段合并,O(n log n)、数组实现常用O(n)额外空间;堆排维护大根堆,每轮根换到末端再调整,O(n log n)。
希尔排序以递减间隔作插入,复杂度依间隔序列,通常不稳定。基数排序按位或字符分配,要求每趟稳定,适合可分解的键,时间常写O(d(n+r)),d为位数、r为基数。常见稳定实现:插入、冒泡、归并、基数;选择、快排、堆排、希尔一般不稳定。
为什么成立 · 关键推导
先写算法版本再追踪。插入若只移动严格大于当前键的项,可保留同键顺序;归并相等时先取左侧才稳定。快排最坏常来自极端不平衡分区,随机化降低遇到这种输入的风险,但不是取消最坏界。
入门例题 / 1
[3,1,2]插入:初始已排[3];把1前插得[1,3,2];取2移3得[1,2,3]。归并则拆为[3]与[1,2],排序后逐个比较首项合并。
典型应用与变式 / 2
带身份[2a,2b,1]简单选择首轮把1与2a交换,成[1,2b,2a],相等2的顺序颠倒,证明不稳定。只看数字[1,2,2]会看不出这个问题。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
排序正确就一定稳定吗?
需要一点提示
相同值背后还有身份。
查看过程、答案与错因
不一定。正确只要求键有序,稳定还要求同键原相对顺序保持。
计算与执行过程
[4,2,3,1]冒泡从左到右一趟,每次大于就交换,结果?
需要一点提示
大数逐步向右。
查看过程、答案与错因
4与2换→[2,4,3,1],再换3→[2,3,4,1],再换1→[2,3,1,4]。一趟只保证最大值就位。
条件与错误辨析
用归并相等时先取右边,稳定性如何?
需要一点提示
跨两半的同键会谁先输出?
查看过程、答案与错因
可能失稳。左半原先靠前却后输出;相等时先左可保持稳定。
继续实践 · 工具与示范
先按图示和正文用纸笔追踪,再阅读以下伪代码。箭头←为赋值,“若”为条件,“当”为循环;不是可直接编译的C。
insertion(a,n):
对i=1到n−1:
value ← a[i];j ← i
当j>0且a[j−1]>value:
a[j] ← a[j−1];j ← j−1
a[j] ← value
严格大于才右移,可保持同键顺序。带走这一句
比较排序不仅看时间,还看稳定性、空间和输入特征。
07 / 非线性结构、查找与排序 · 小节 7
快速排序与归并:分开,再合起来
按指定版本手算分区与归并,不混用不同伪代码。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:排序过程、稳定性与取舍 · 符号回看
从一个问题开始
两种算法都分而治之,为什么一个主要忙于分区,一个主要忙于合并?
快速排序:末项枢轴的一轮分区
[3,1,2],末项2是枢轴;i从0开始。
3大于2,不移动;1小于等于2,换到前段。
把枢轴换到i=1,得到[1,2,3],两侧仍按规则递归。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
快速排序选枢轴,把较小值放一侧、较大值放另一侧,再递归两段。不同分区法中枢轴位置与递归边界不同,题目必须声明版本。本节用末元素为枢轴的Lomuto分区,扫描时把≤枢轴的元素交换到前段,最后放置枢轴;长度0或1不再分。
归并排序先按位置分两半,分别有序后用双指针合并。比较两边首个尚未输出项,相等先左保证稳定;一边耗尽就复制另一边剩余。它与“只把两个数组拼接”不同。典型数组归并O(n log n)时间、O(n)辅助空间;快排递归空间依分区平衡,最坏可O(n)。
为什么成立 · 关键推导
伪代码(闭区间):partition(a,l,r):p←a[r];i←l;对j=l到r−1,若a[j]≤p则交换a[i],a[j]并i加1;交换a[i],a[r];返回i。quick先判断l<r,再递归[l,i−1]与[i+1,r]。合并时每输出一项,仅移动它来源侧指针。
入门例题 / 1
[3,1,2]用末项2:i=0;j0的3不动;j1的1≤2,交换得[1,3,2]、i=1;最后换枢轴得[1,2,3],位置1确定。两侧各一项,不再递归。
典型应用与变式 / 2
合并[1a,3]与[1b,2]:同键先左1a,再右1b,再2,再3,结果[1a,1b,2,3]。选择左优先让原来跨两半的相等元素保序。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
快排一次分区后两侧内部也有序吗?
需要一点提示
分区只保证相对枢轴的关系。
查看过程、答案与错因
不一定。两侧还需递归;只有枢轴在此版本中到达最终位置。
计算与执行过程
[4,2,3,1]末项为枢轴,做一轮上述分区。
需要一点提示
前三项均大于1。
查看过程、答案与错因
扫描没有交换前段,最后a[0]与a[3]换,得到[1,2,3,4],枢轴位置0。本例碰巧全有序不代表所有输入如此。
条件与错误辨析
全部值相等时这个快排版本表现怎样?
需要一点提示
每项都≤枢轴,分区是否平衡?
查看过程、答案与错因
枢轴每轮落最右,子问题为n−1,最坏O(n²)。可考虑三路分区;不能只说平均O(n log n)而忽略重复值。
带走这一句
分治题先写清分区约定,递归边界才不会错。
07 / 非线性结构、查找与排序 · 小节 8
堆、希尔与基数:不同的排序机制
执行堆顶下沉、间隔插入与按位稳定分配。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:快速排序与归并:分开,再合起来 · 符号回看
从一个问题开始
每轮找最大值都重扫全部元素,有没有结构帮忙?
堆排序:只调整仍有效的前缀
[4,2,3,1]是大根堆,但整个数组尚未有序。
最大值4与末项换位;4退出有效区。
在前3项中选更大孩子3上移,恢复堆序。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
大根堆是满足父键不小于孩子的完全二叉树;0起始数组中i的孩子为2i+1与2i+2(若下标<n)。堆序只约束父子,不保证数组整体有序。自底向上对最后一个非叶节点到根下沉,可O(n)建堆;排序每次根换到有效区末尾,缩小有效区,再向下调整,整体O(n log n)。
希尔先以大间隔把跨距元素做插入,逐步缩小间隔,最后gap=1,表现依间隔序列。LSD基数排序从最低位向高位稳定分桶,各趟必须保持同桶原顺序,最后才整体有序;适合这里示范的非负整数,负数处理需另定规则。
为什么成立 · 关键推导
下沉时选择更大孩子与父比较,若孩子更大则交换并继续,否则停止。LSD每趟按0—9桶顺序收集。不能将“桶内随便排”与稳定分配混用;高位相同时,低位已得到的次序必须保存。
入门例题 / 1
大根堆[4,2,3,1]根与末项换,得[1,2,3|4]。有效长度3,较大孩子3与根换,得[3,2,1|4]。再换根与有效末,得[1,2|3,4],下沉为[2,1|3,4],最后完成[1,2,3,4]。
典型应用与变式 / 2
[21,13,12]按个位稳定分桶得[21,12,13],再按十位收集得[12,13,21]。希尔示例[4,3,2,1]先gap2,对(4,2)、(3,1)各插入得[2,1,4,3],再gap1插入完成[1,2,3,4]。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
堆顶最大能推出堆数组从大到小吗?
需要一点提示
兄弟间是否有序?
查看过程、答案与错因
不能。例如[4,2,3,1]是大根堆但2<3,数组并非递减。
计算与执行过程
大根堆[5,3,4,1,2]移出最大后,根换末并下沉一次是什么?
需要一点提示
只在前4项调整。
查看过程、答案与错因
换后[2,3,4,1|5],选更大孩子4交换得[4,3,2,1|5]。
条件与错误辨析
基数排序十位同桶若反转原顺序会怎样?
需要一点提示
个位排序的信息能保住吗?
查看过程、答案与错因
可能错误。12、13同十位桶若被反转成13、12,就破坏最终升序;稳定性在此是正确性的条件。
带走这一句
堆利用父子约束,希尔利用间隔,基数利用稳定的位次处理。
07 / 非线性结构、查找与排序 · 小节 9
用中转点与割边完成图算法
亲手更新距离矩阵并检查生成树的跨界边。
大纲要求的教学展开 · 技术讲解 · 本节来源与考点
前置知识:堆、希尔与基数:不同的排序机制 · 符号回看
从一个问题开始
最短路为什么可能被一个新允许的中转点缩短?
距离由路径累加,不能只看最后一条边
无向边AB1、AC4、BC2、BD5、CD1;起点A距离0。
确定B后,A到C由4改为1+2=3,A到D暂为1+5=6。
确定C后,A到D改善为3+1=4。路径A→B→C→D。
原创教学示意 · 手动播放,可随时暂停;折叠或离开小节时停止。
把这件事讲清楚
Floyd以k为外层,把允许的中转点从空集逐步扩成{0,…,k}。每对i,j比较原距离与i→k→j,更新较小者。无边记∞,自身距离0;∞加数仍视作∞。如果计算后d[i][i]<0,说明存在负环的迹象,相关路径不能当作有限最短路。
Prim维护已连入树的顶点集S,从一端在S、另一端不在S的边中选最小者,加入新顶点。它选的是跨界边权,不是起点到新点的累计路径长。连通性不足时会无法继续,应报告森林/非连通,不凭空加边。
为什么成立 · 关键推导
Floyd伪代码:对k,再对i,再对j:若两段可达且d[i][k]+d[k][j]<d[i][j]则更新,并同步记录路径信息。Prim伪代码:从起点S开始;重复选最小跨界边,记录边并扩S;找不到而仍有外点则停止报告不连通。
入门例题 / 1
有向A→B2、B→C1、A→C5。初始A行[0,2,5];允许B作中转后A→C更新为2+1=3;其他未改善项保持。把k循环乱放会破坏“允许中转集合”这一推导。
典型应用与变式 / 2
无向AB1、AC4、BC2、BD5、CD1。Prim从A先AB1,S={A,B},候选AC4,BC2,BD5选BC2;S加入C后选CD1。总4,边与Kruskal可一致但选择过程不同。
停一下,自己试一试
先独立作答;卡住时看提示,完成后再对照解析。
概念判断
Prim可以直接用于任意有向图求同样定义的MST吗?
需要一点提示
本节生成树定义是无向的。
查看过程、答案与错因
不可以直接套用。必须先核对图类型与问题定义,有向最小树形图是另一类问题。
计算与执行过程
A→B=4,B→C=−2,A→C=5,无负环,允许B中转后A→C多少?
需要一点提示
负边可参与Floyd。
查看过程、答案与错因
4+(−2)=2,小于5,更新为2;存在负边不自动意味着不存在最短路。
条件与错误辨析
Prim已选S={A,B},边AB1还能再作为候选吗?
需要一点提示
是否跨割?
查看过程、答案与错因
不能。两端都在S,加入会形成内部冗余甚至环;候选必须恰有一端在S。
带走这一句
距离矩阵看中转集合,生成树看跨界条件。
章末 / 把知识接起来
综合训练
原创综合训练
边AB1、AC4、BC2、CD1、BD5均无向,从A求到D最短路与MST总权。对[2a,2b,1]做简单选择一轮判断稳定性。
需要一点提示
最短路逐点松弛,MST选边避免环;排序保留身份字母。
查看过程、答案与错因
最短A-B-C-D=4;MST选AB、CD、BC总4,两者本题数值相同不代表目标相同。选择排序交换首元素2a与1得到[1,2b,2a],不稳定。