数据结构第一章:向量

本文介绍了数据结构中的向量,特别是动态管理向量空间的策略,包括扩容和选择合适的扩容策略。讨论了平均分析和分摊分析在复杂度分析中的应用,并概述了无序向量的常见操作,如插入、删除和查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(a)向量vector接口与实现

数据类型与数据结构的区别

在这里插入图片描述

(b)动态管理向量空间

1,向量的空间是静态的

在这里插入图片描述
会发生上溢与下溢

2,(动态空间管理)当即将发生上溢时,可以模仿蝉褪去原来的壳,扩容

在这里插入图片描述

实现代码
template <typename T>
void vector<T>::expand(){
	if(_size <_capacity)return;
	_capacity = max(_capacity,DEFAULT_CAPACITY)//不低于最小容量
	T* oldElem = _elem;_elem = new T[_capacity <<=1];//保存旧的,新的创建空间两倍(左移1扩大两倍)
	forint i=0;i<_size;i++)
		_elem[i] = oldElem[i]//复制元向量内容
	delete[] oldElem;//释放原空间
	
}

得益于向量封装,访问向量空间,都是通过elem来标识起点,所以不存在复制后指针找不到的问题

3,选用何种扩容策略

但容量加倍是否合理呢?

T* oldElem = _elem;_elem = new T[_capacity +=INCREMENT];/ /追加固定大小的容量

在这里插入图片描述

实际每次固定尺寸扩容,时间成本大大增加(每隔I都要扩容)

在这里插入图片描述

每次扩容两倍,指数级扩容,时间大大减少,如下图

在空间上一定取舍,时间上获得巨大收益
在这里插入图片描述

* 平均分析和分摊分析(复杂度分析方法)

平均分析将各种可能的操作概率加权平均,割裂了操作间的关联独立存在
而分摊分析则对数据结构连续地多次操作,将所需总体成本分摊至单次操作
在这里插入图片描述

(c)无序向量

之前学过的,定义向量数据结构的类型的方法

统一得到模板式创建数据类型结构,方便之后组合融合使用
template  <typename T> vector{……}
vector  <int>  myvector{……}【vector of intgter】
			float
			char
			……
vector<BinTree> forest【这个时取的名字】

无序向量

1,循秩访问元素

在这里插入图片描述
在这里插入图片描述

2,插入元素

关键在于自后向前后移操作
在这里插入图片描述

3,区间删除

将介于某个区间的所有元素删除,关键在于自前向后前移操作
在这里插入图片描述

4,单元素删除

基于3区间删除,进行单元素删除,不反过来基于单元素进行区间删除,主要是效率太低
在这里插入图片描述

5,查找元素操作

调用如下,print(hi)即可
在这里插入图片描述

5,无序向量唯一化

普通法:每次检查前i个和第i+1个是否重复(向前比较,向后提取),加上i遍历–O(n^2)
在这里插入图片描述
在这里插入图片描述

6,遍历

在这里插入图片描述

有序向量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么无序向量转化为有序向量后,相关算法就可以优化了?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值