当前课程知识点:数据结构(上) > 第六章 图 > (b1)邻接矩阵 > 06B1-9 综合评价
好了
现在到了可以对邻接矩阵表示法
做一概括和总结的时候了
我们可以看到
这种方法非常的直观
也非常易于理解和实现
所以相应地 也具有很多
独特的优点
比如我们已经看到的
它的适用范围非常地广泛
无论是有向图
无向图 还是混合图
以及是否是带权图
包括是否拥有自环
都可以通过邻接矩阵表示
而且尤其适用于所谓的稠密图
因为这里既然已经为所有潜在的边
都预留了一个实际的单元
所以我们自然希望
每一个单元都真实地对应于一条边
从而能够充分利用整体的空间
另外 从操作效率上讲
邻接矩阵也有很多诱人之处
很多操作 包括判断是否有连边
以及获取各个顶点的度数等等
都可以在常数的时间内完成
最后得益于我们此前
所实现的向量结构
良好的空间控制策略
以及通过封装以后
对空间溢出等特殊情况的
透明处理
我们所实现的邻接矩阵
具有非常好的扩展性
当然邻接矩阵表示法的缺点
也是显而易见的
最主要的一点
就体现在它的空间性能
我们注意到无论图中
实际所含的边数有多少
这种表示法所消耗的空间量
总是固定为最大值n平方
而与实际的边数无关
当然 如果我们的实际边数
能够达到这种规模
那自不在话下
如果这个数要远远地小于n平方呢?
就必然意味着
有巨大的浪费
那么在实际应用中情况又如何呢?
真的会出现这么多条边吗?
我们可以说明边数实际上往往
并不会达到这么多
而是会远远地小于最大的n平方
这样一个界
我们来考虑一类特定
但又不失一般性的图
也就是所谓的平面图
所谓的planar graphs
也就是那些可以嵌入于平面的图
简单地说 所谓嵌入于平面
也就是将图绘制在一个平面上
比如你的一张足够大的纸上
当然这里有一个条件
不相邻的边不能相交
因此这个是平面图
这个依然是平面图
而这个 因为这两条
不相邻的边是相交的
而且也没有办法回避这种情况
所以它并非平面图
同样地 这样一幅图
也不能够在不相邻的边
互不相交的前提下
绘制于平面上
所以也不属于平面图
实际上 平面图所具有的本质特征
可以由欧拉公式来表示
也就是说 对于任何一个平面图来说
其中0维的元素
也就是顶点的数目
以及1维的元素 也就是边的总数
以及2维的元素 也就是区域面片的总数
以及连通域的总数
必然会满足这样一个
简明的恒等式
从欧拉公式出发
我们不难证明这样一个结论
也就是说 对于平面图而言
从渐近的意义上讲
边的总数不可能超过顶点的总数
如此说来 对于这类图
我们预备了n平方的空间
但实际上有效的
只不过是O(n)量级的比例
大致来说
整个空间的利用率
是n分之一
随着n的增加
这样一个比例会很快地趋近于0
这也意味着极其低下的空间利用率
关于这一结论的详细证明方法
可以参考教材
所配套习题解析中的6-3题
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验