向量是线性结构
Abstract Data Type
Data Structure
Vector模板类
copyFrom()
向量
可扩充向量
平均分析 vs. 分摊分析
(c) 无序向量
Template Vector { … };
T是指定Vector中的元素的类型
比如:Vector< int > myVector;
Vector myVector2;
Vector myVector3;
Vector forest;
为什么shrunk的条件是_size/_capacity < 1/4而不是1/2呢?仔细想想
保留下来的都是它之前没有出现过的
挖掘算法的不变性和单调性
不变性:在当前元素V[i]的前缀V[0,i)中,各元素彼此互异
初始i=1时自然成立;其余的一般情况,…
遍历
-
遍历向量,统一对各元素分别实施visit操作
如何指定visit操作?如何将其传递到向量内部? -
利用函数指针机制,只读或局部性修改
template
void Vector -
利用函数对象机制,可全局性修改
template template
void Vector::traverse(VST& visit) // 函数对象
{ for (int i = 0; i< _size; i++) visit (_elem[i]); }
遍历:实例
比如,为统一将向量中所有元素分别加一,只需…
首先,实现一个可使单个T类型元素加一的类
template // 假设T可直接递增或已重载操作符“++”
struct Increase { // 函数对象:通过重载操作符“()”实现
virtual void operator()(T & e) { e++; } // 加一
};
(d1) 有序向量:唯一化
无序:比对
有序 :比较
有序性及其甄别
低效算法
观察:在有序向量中,重复的元素必然相互紧邻构成一个区间
因此,每一区间只需保留单个元素即可
低效算法:复杂度
高效算法:
反思:低效的根源在于,同一元素可作为被删除元素的后继多次前移
(d2) 有序向量:二分查找
版本A:查找长度
如何更为精细地评估查找算法的性能?
考查关键码的比较次数,即查找长度(search length)
通常,需分别针对成功与失败查找,从最好、最坏、平均等角度评估
比如,成功、失败时的平均查找长度均大致为O(1.50·log n)
(d3) 有序向量:Fibonacci查找
(d4) 有序向量:二分查找(改进)
分析:
与版本B的差异:
1)待查找区间宽度缩短至0而非1时,算法才结束
2)转入右侧子向量时,左边界作mi+1
单调性,显而易见…
(d5) 有序向量:插值查找
原理与算法
假设:已知有序向量中各元素随机分布的[规律]
比如:均匀且独立的随机分布
(e) 气泡排序
(f) 归并排序