首先先弄清定义:ADT(Abstract Data Type)与DS(Data Structure)
抽象数据类型:只需要知道外部逻辑与操作,而不需要内部定义细节的数据类型++
数据结构:某种特定的语言来实现ADT的一整套算法 ,内部的实现
实际上,向量只是数组的一种抽象与泛化,由一组元素按线性次序封装而成
向量中的一些ADT操作:
insert(para1,para2),put(para1,para2),get(para1),remove(para1),size()
disorder(),find(),search(),uniquify(),sort()
vector模板类
typedef int Rank ; // 秩
#define DEFAULT_CAPACITY 3 //默认初始容量(实际可能更大)
template <typename T> class Vector {private:Rank _size;int _capacity; T* _elem;//规模,容量,数据区
protected:/内部函数/
public:/各种外部结构(构造,析构,读写,遍历)/
}
关于可扩充向量:
采用静态空间管理时,_capacity<_size 出现上溢,装填因子_size/_capacity<<50%出现下溢,根本无法预测空间的需求量。
采用动态空间管理时,出现上溢时,使用allocated适当地扩大内部数组的容量,而后released释放之前的内存空间,可用扩容算法实现
得益于向量的封装,尽管扩容之后数据区的物理地址有所改变,却不会出现野指针
几种增容的策略:
递增增容:每次都追加固定大小的容量,分摊成本o(n),装填因子 ->100%
加倍增容:容量加倍,分摊成本o(1),装填因子>50%,刚出现扩容的时候就是50%
--------------------------------------------------------------------------------------------------------------------------
平均分析与分摊分析的最大区别:平均分析是独立的处理,割裂了操作之间的相关性与连贯性,而分摊复杂度是连续地
实施多次操作,然后将所需总体成本分摊至单次操作
--------------------------------------------------------------------------------------------------------------
向量(有序与无序向量的区别)的一些操作算法:
循序访问,插入,区间删除,单元素删除,查找(有序向量的二分查找或Fibonacci查找),唯一化,遍历
对于二分查找,选取的lambda=0.5,Fibonacci查找,lambda=0.618