DSA: 向量

本文探讨了向量作为线性数据结构的基本概念,包括模板类实现、复制操作、平均分析与分摊分析。深入讲解了无序向量和有序向量(如唯一化、二分查找、Fibonacci查找、插值查找等)的高效算法。涉及递归、函数指针和函数对象在遍历中的应用,以及低效算法的优化策略。最后,涵盖了气泡排序和归并排序的实例。
摘要由CSDN通过智能技术生成

向量是线性结构

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) 归并排序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值