没有合适的资源?快使用搜索试试~ 我知道了~
首页数据结构向量解析:从数组到动态向量
数据结构向量解析:从数组到动态向量
需积分: 0 0 下载量 47 浏览量
更新于2024-06-30
收藏 2.58MB PDF 举报
"本章主要讨论了数据结构中的向量,它是数据项的线性结构,其中逻辑次序与物理存储位置一致。向量是一种基本的线性结构,与列表不同,列表中逻辑相邻的数据项可能在物理上不相邻。章节内容涵盖了向量的抽象数据类型接口、算法实现,特别是动态向量的维护技术。还包括了有序向量的查找与排序算法及其性能分析。此外,还介绍了复杂度下界的概念,并通过比较树模型探讨了基于比较的算法的复杂度下界。" 在程序设计中,数组是最基本的数据结构之一,它允许存储和访问一组具有线性次序的元素。数组在内存中连续存储,每个元素都有一个唯一的下标标识,通常从0开始。数组提供了快速访问的能力,因为可以通过下标直接计算出元素的地址。数组元素之间的关系清晰,前驱和后继的概念使得遍历和操作变得简单。 向量是数组的一种逻辑扩展,它保持了数组的线性特性,但更加强调逻辑顺序与物理位置的一致性。在向量中,每个元素的秩即为其逻辑位置,这使得向量的操作,如插入和删除,相比于列表可能更为高效。然而,为了实现动态向量,即能够在向量中间插入或删除元素,需要考虑如何高效地调整存储结构和更新秩信息。 章节中还会涉及有序向量,这对于查找和排序算法至关重要。常见的查找算法如二分查找,排序算法如冒泡排序、选择排序、插入排序以及更高效的快速排序和归并排序等,都会在有序向量上进行讨论。这些算法的性能分析通常基于比较次数和时间复杂度。 最后,章节会介绍复杂度下界的概念,这是分析算法效率的理论基础。通过比较树模型,可以确定基于比较的算法的最优性能界限,这对于理解和设计更有效的算法具有指导意义。这种方法可以统一评估和比较不同算法的潜在效率,帮助开发者在实际应用中做出明智的选择。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86325426/bg7.jpg)
第2章 向量 §2.4 劢态空间管理
33
需强调的是,由于向量内部含有动态分配的空间,默认的运算符"="不足以支持向量之间的
直接赋值。例如,6.3节将以二维向量形式实现图邻接表,其主向量中的每一元素本身都是一维
向量,故通过默认赋值运算符,并不能复制向量内部的数据区。
为适应此类赋值操作的需求,可如代码2.3所示,重载向量的赋值运算符。
1 template <typename T> Vector<T>& Vector<T>::operator= ( Vector<T> const& V ) { //重载
2 if ( _elem ) delete [] _elem; //释放原有内容
3 copyFrom ( V._elem, 0, V.size() ); //整体复刢
4 return *this; //迒回弼前对象癿引用,以便链式赋值
5 }
代码2.3 重轲向量赋值操作符
2.3.3 析构方法
与所有对象一样,不再需要的向量,应借助析构函数(destructor)及时清理(cleanup),
以释放其占用的系统资源。与构造函数不同,同一对象只能有一个析构函数,不得重载。
向量对象的析构过程,如代码2.1中的方法~Vector()所示:只需释放用于存放元素的内部
数组_elem[],将其占用的空间交还操作系统。_capacity和_size之类的内部变量无需做任何
处理,它们将作为向量对象自身的一部分被系统回收,此后既无需也无法被引用。
若不计系统用于空间回收的时间,整个析构过程只需O(1)时间。
同样地,向量中的元素可能不是程序语言直接支持的基本类型。比如,可能是指向动态分配
对象的指针或引用,故在向量析构之前应该提前释放对应的空间。出于简化的考虑,这里约定并
遵照“谁申请谁释放”的原则。究竟应释放掉向量各元素所指的对象,还是需要保留这些对象,
以便通过其它指针继续引用它们,应由上层调用者负责确定。
§2.4 动态空间管理
2.4.1 静态空间管理
内部数组所占物理空间的容量,若在向量的生命期内不允许调整,则称作静态空间管理策略。
很遗憾,该策略的空间效率难以保证。一方面,既然容量固定,总有可能在此后的某一时刻,无
法加入更多的新元素即导致所谓的上溢(overflow)。例如,若使用向量来记录网络访问
日志,则由于插入操作远多于删除操作,必然频繁溢出。注意,造成此类溢出的原因,并非系统
不能提供更多的空间。另一方面反过来,即便愿意为降低这种风险而预留出部分空间,也很难在
程序执行之前,明确界定一个合理的预留量。以上述copyFrom()方法为例,即便将容量取作初
始规模的两倍,也只能保证在此后足够长的一段时间内(而并非永远)不致溢出。
向量实际规模与其内部数组容量的比值(即_size/_capacity),亦称作装填因子(load
factor),它是衡量空间利用率的重要指标。从这一角度,上述难题可归纳为:
如何才能保证向量的装填因子既不致于超过1,也不致于太接近于0?
为此,需要改用动态空间管理策略。其中一种有效的方法,即使用所谓的可扩充向量。
![](https://csdnimg.cn/release/download_crawler_static/86325426/bg8.jpg)
§2.4 劢态空间管理 第2章 向量
34
2.4.2 可扩充向量
经过一段时间的生长,每当身体无法继续为其外壳所容纳,蝉就会蜕去外壳,同时换上一身
更大的外壳。扩充向量(extendable vector)的原理,与之相仿。若内部数组仍有空余,则
操作可照常执行。每经一次插入(删除),可用空间都会减少(增加)一个单元(图2.1(a))。
一旦可用空间耗尽(图(b)),就动态地扩大内部数组的容量。这里的难点及关键在于:
如何实现扩容?新的容量取作多少才算适宜?
首先解决前一问题。直接在原有物理空间的基础上追加空间?这并不现实。数组特有的定址
方式要求,物理空间必须地址连续,而我们却无法保证,其尾部总是预留了足够空间可供拓展。
图2.1 可扩充向量癿溢出处理
一种可行的方法,如图2.1(c~e)所示。我们需要另行申请一个容量更大的数组B[](图(c)),
并将原数组中的成员集体搬迁至新的空间(图(d)),此后方可顺利地插入新元素e而不致溢出
(图(e))。当然,原数组所占的空间,需要及时释放并归还操作系统。
2.4.3 扩容
基于以上策略的扩容算法expand(),可实现如代码2.4所示。
1 template <typename T> void Vector<T>::expand() { //向量空间丌足时扩容
2 if ( _size < _capacity ) return; //尚未满员时,丌必扩容
3 if ( _capacity < DEFAULT_CAPACITY ) _capacity = DEFAULT_CAPACITY; //丌低亍最小容量
4 T* oldElem = _elem; _elem = new T[_capacity <<= 1]; //容量加倍
5 for ( int i = 0; i < _size; i++ )
6 _elem[i] = oldElem[i]; //复刢原向量内容(T为基本类型,戒已重载赋值操作符'=')
7 delete [] oldElem; //释放原空间
8 }
代码2.4 向量内部数组劢态扩容算法expand()
实际上,在调用insert()接口插入新元素之前,都要先调用该算法,检查内部数组的可用
容量。一旦当前数据区已满(_size == _capacity),则将原数组替换为一个更大的数组。
请注意,新数组的地址由操作系统分配,与原数据区没有直接的关系。这种情况下,若直接
引用数组,往往会导致共同指向原数组的其它指针失效,成为野指针(wild pointer);而经
封装为向量之后,即可继续准确地引用各元素,从而有效地避免野指针的风险。
这里的关键在于,新数组的容量总是取作原数组的两倍这正是上述后一问题的答案。
剩余37页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)