算法与数据结构--向量

来源:互联网 发布:mac 迅雷 下载速度 编辑:程序博客网 时间:2024/06/06 17:01

首先先弄清定义: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

0 0