当前课程知识点:数据结构(上) > 第二章 向量(上) > (b)可扩充向量 > 02B-3 递增式扩容
实际上 情况并不那么简单
我们不妨以其中的
一种典型的策略来做一个对比
来看这样一种
似乎非常可行的策略
具体来说 就是每当发现
当前的内部数组即将发生上溢
我们并不是对它进行容量的加倍
而只是在原来的容量的基础上
追加一个固定的数额
因为这样已经够用了
所以貌似还不错
我们甚至可以
只需修改此前那个算法中的一行
就可以简明地实现这种策略
具体来说 就是将
原来的_capacity乘2
变成_capacity
追加一个固定的数额
我们管它叫作INCREMENT
或者简记作大I
那么这种策略可行不可行呢?
我们说最终效率说了算
我们要来看看它的效率
对于这种策略而言
它的一种其实还不见得
是不容易出现的情况
但是确实是最坏的情况
我们来看看
在初始容量为空的一个向量中
如果我们连续地执行
足够多次插入操作
比如说n次操作
而且n足够大以致于
如果按刚才的
INCREMEMT 大I来分组的话
它至少可以分成m组
那么不难理解
在第一个元素插入的时候
它就需要扩容
也就是说 追加大I这么多容量
接下来 在插入
第I+1个元素的时候
也需要扩容
并且把它扩成两倍的I
再接下来 2I+1个元素
插入的时候
它就需要扩容到3I
一直这么下去
也就是说 每经过I次插入操作
它都需要进行一次扩容
那么在这n个元素
插入这个向量的整个过程中
我们消耗在扩容方面的时间
累计有多少呢?
我们刚才看了
总共大概要做m次扩容
每次扩容所需要的时间成本
大致是I 2I 3I一直到mI(注:应该是(m-1)I)
如果你愿意去把它累加起来也可以
那么如果你记得
我原来教过你的诀窍
那么就更自然了
因为我们说过
这是一个算数级数
它的总和和它的末项
是成平方关系的
而它的末项 从阶次来看
是和 n 是等阶的
注意 这里的我们的 I 是一个常数
所以是等阶的
所以总体而言
我们消耗在扩容方面的时间
累计将多达 n 平方
如果我们将这些
扩容的时间成本
分摊到这(n次插入操作)
我们就会发现
每一次(插入操作)
我们都需要花费O(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)深度优先搜索--作业
-第六章 图--本章测验