当前课程知识点:数据结构(上) > 第六章 图 > (b1)邻接矩阵 > 06B1-6 顶点静态操作
按照这种实现方式
我们可以简明实现顶点操作中的
大部分基本操作
比如直接返回顶点所对应的信息
以及它的入度和出度
它的状态 它的时间标签
在遍历树中的父节点
以及在遍历过程中
动态维护的优先级树等等
当然 并非所有的顶点操作
都能如此直截了当地
一蹴而就地实现
比如在图的遍历过程中
需要反复地使用这样一个接口
也就是说 站在当前
顶点 i 的位置
我们需要逐一地罗列
也就是枚举出
与之邻接的所有顶点
我们称这些顶点为
当前顶点的邻居 neighbor
为此我们首先需要实现一个
名为nextNbr的接口
它的功能语义是
如果我们现在已经枚举到
顶点 i 的编号为 j 的这个邻居
那么它将返回
接下来的下一个邻居
我们知道 与顶点 i 潜在的
可以相邻的点
无非就是它在邻接矩阵中
所对应的那一行
这个行向量中的元素
取值或0或1
而所有那些数值为1的单元
才各自己对应于
与i邻接的一个顶点
那么如果我们现在已经枚举到
编号为j的这个邻居
我们如何找到下一个有效的邻居
因此我们不难理解
这个算法为什么要从j开始
不断地通过减减
逆向地向前进行搜索
每抵达下一个潜在的邻居
都要通过exists接口
判断对应的这条边是否存在
只要不存在
我们就继续通过 j 减减
指向下一个潜在的邻居
直到最终发现一个有效的邻居
至此我们只需将
新发现的这个邻居返回即可
而接下来 如果我们再次调用
nextNbr这个接口
自然也就返回下一个邻居
以及再下一个有效邻居
以及再下一个
和再下一个
请注意 最终的特殊情况
也就是当我们试图
越过这个向量的左边界0
也就是试图抵达-1的时候
我们将终止这样一个搜索的过程
这也就是为什么
在这个短路求值的逻辑表达式中
首先需要检查j是否已经越界
那么第一个有效的邻居
又该如何确定呢?
为此我们需要准备另一个例程
我们可以看到
其实这个firstNbr
也是调用了nextNbr而已
不同的在于 它将顶点n
作为上一个有效的邻居
没错 n 你并没有听错
尽管编号为n的顶点压根就不存在
依然不妨将它视作是一个假想的哨兵
而且等效地认为
它会和包括 i 在内的
任何顶点都相邻
从而简明而有效地
启动整个搜索和枚举的过程
那么整个这样
从第一个有效的邻居
一直枚举到
最终的一个的过程
累计需要花费多少时间呢?
我们可以看到
尽管各自nextNbr所对应
while循环的长度不尽相同
但是累计而言
其总数不过是整个行向量的长度
我们讲过 这个长度恰好就是n
因此整个算法所需要的运行时间
累计不过是线性
当然如果你对这个效率
还不甚满意
可以借助我们稍后介绍的
邻接表结构进行改进
你将会看到 在如此改进之后
整个过程累计所需要的时间
将线性正比于
当前顶点的出度
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验