当前课程知识点:数据结构(上) > 第二章 向量(上) > (b)可扩充向量 > 02B-1 可扩充向量
欢迎回到数据结构的课堂
在上一讲中
我们首先介绍了ADT的规范
并且基于这种规范
给出了向量的接口定义
我们也实现了
作为一个数据结构而言
最最基本的构造与析构接口
与所有的数据结构一样
向量也可以认为是
一组数据项的集合
换而言之
它首先必须能够
自适应地在规模上
适应其中所包含的
元素个数的变化
这也就是为什么这一节
要集中讨论它的可扩充性能
向量天生
并不具有这种性能
我们需要采取一些策略
而且需要采取聪明的策略
的确 就目前的设计方案而言
我们的向量并不具备
可扩充的性能
究其原因在于
它采用的 实际上是所谓的
静态空间管理的策略
具体来说
它实际上在内部
只不过是设置了一个
私有的数组
这个数组所占有的
那段连续的地址空间
会被用来存放若干个
对外界而言可见的
或者是有效的元素
而这些元素的总数 或者说它们
所占用的逻辑空间的数
我们用_size来表示
而整个物理空间的大小
是由_capacity来确定的
这里的问题是
_capacity一旦确定
按照目前的方案
它就将一成不变
而这样一种策略
显然存在明显的不足
这种不足
体现在两个方面
第一 是有可能会出现
所谓的上溢overflow
也就是说
随着有效元素(个数)的增加
总有一天有这样的可能
使得整个这个element
所占用的物理空间
已经不足以存放
需要存放的元素组
尽管在这个时候
在系统的其它的部分
仍然有足够多的空间
可以用于存放这些元素
但是
限于_capacity是固定的
我们不能直接做到这一点
另一种情况呢
虽然不是很严重
但是 也是会造成一定的
空间的效率低下
我们称之为下溢
underflow
具体来说 就是
有可能我们开辟了一个
比较大的空间
但是在整个
这个数据结构的生命期内
真正存放于其中的数据
却寥寥无几
从而使得我们有一个指标
叫作装填因子
会非常非常的小
这个装填因子
其实就是 我们的有效元素个数
也就是_size 去除以
可用于存放元素的空间总数
也就是_capacity
我们也可以理解成是
这个空间的利用率
它有可能不到一半
甚至远远地低于一半
那么在这种时候
空间效率非常低下
很遗憾
如果我们坚持采用这样一种
固定容量的策略
我们在实际的一般应用环境中
很难在事先就预测到
我们需要用多少空间
也就是说 这种空间不足
以及空间浪费的情况
都有可能发生 甚至经常发生
那么有没有什么好的办法
可以使得向量
可以自适应地 根据实际需要
来动态地调整自己的容量呢?
而且这种调整的过程
既能保证足够
同时又不致使得
因为开辟的空间过多
而导致空间效率的低下
我们说是可以的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验