2.5 有序向量的唯一化实现

有序向量的唯一化和无序向量不同,分为低效版和高效版。低效版代码如下:

template <typename T> int Vector<T>::uniquify() {

int oldSize = _size;

int i = 1;

while (i < _size) {

_elem[i - 1] == _elem[i] ? remove(i) : i++;

}

return oldSize - _size;

}

该算法的正确性在于有序算法中的重复元素必然是紧邻的,所以只要自前向后逐个扫描再使用remove()接口删除靠后者,否则转向下一个元素,如此即可实现有序向量的唯一化。

这种算法的时间消耗主要来自于while循环,迭代次数是n-1次,且在最坏情况下每次循环都需要执行一次remove操作,所以共计有:

(n-2) + (n-3) + (n-4) +...+2 + 1 = O(n*n)

由此可见,效率竟然和无序元素相同,所以十分低下,原因在于,在对remove()接口的调用过程中,同意元素作为后继元素向前多次移动,且每次只移动一个单元。这是因为每次进行remove()操作的时候,我们只会进行一对一的独立删除。所以倘若我们成批的删除重复元素必将大大提高效率。

由此给出高效版的代码如下:

template <typename T> int Vector<T>::uniquify() {

Rank i = 0, j = 0;

while (++j < _size) {

if (_elem[i] != _elem[j]) {

_elem[++i] = _elem[j];//发现不同元素时,向前移至紧邻于前者右侧

}

_size = ++i; shrink();//直接截除尾部多余元素

}

return j - i;

}

这份算法的while循环的每次迭代只需要进行一次比较,向后移动一到两个位置指针,并至多向前复制一个元素,故一次迭代只需要常数时间,总体只需要O(n)的时间。

原文地址:https://www.cnblogs.com/NK-007/p/9228604.html

时间: 2024-07-28 17:13:19

2.5 有序向量的唯一化实现的相关文章

第二章&#160;向量(d1)有序向量:唯一化

原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/10260104.html

2.4 插入、删除、唯一化和遍历

插入,不赘述,代码如下: template <typename T> Rank Vector<T>::insert(Rank r,T const& e) { expand(); for (int i = _size; i > r; i--) _elem[i] = elem[i-1];//复制原向量内容 _elem[r] = e; _size++; return r; } 插入前,要使用expand()算法核实是否即将溢出,然后为了保证数组元素物理地址的连续性,将后缀_

有序向量的查找算法

声明:本文是对 xuetangx 清华大学 丁俊晖 老师 数据结构 课程的个人总结. 说到有序向量的查找算法,首先蹦入脑海的肯定是二分查找算法. 然而,即便是简单的二分查找也没有想象的那么简单. 首先考虑一些特殊情形: 1.查找的元素不存在: 2.要查找的元素值存在多个. 当然,对于不存在的情况,我们可以简单的返回一个 -1 代表未查找到,但很多时候,这样做往往是不够的.比如说,我们在调用查找之后,很有可能紧接着需要考虑插入一个值使原向量依然保持有序,而如果我们仅仅只是返回一个未查找到的 -1

有序向量的去重算法

声明:本文参考 Xuetangx 数据结构 丁俊晖 老师的相关课程,不失为一个个人总结. 首先,这肯定是一个简单而且看起来一目了然的命题.对于有序向量,特别注意是“有序”向量,抓住重要的一个特点,那就是,相同的元素必然是在同一个不间断的区段内的,即相同的元素都是紧邻的构成一个区间. 像这样: 最后要做到: 即重复元素只保留了一个. 考虑到重复元素都是紧邻的,很容易直接写出以下的算法: 也就是,每一元素相同的区间只保留单个元素即可. 由 while 循环和 remove 操作可以得知,算法复杂度为

数据结构学习第八天

18:35:51 2019-08-23 学习 无序向量的操作 以及  有序向量 二分查找  Fibonacci查找 1 #define _CRT_SECURE_NO_WARNINGS //vs中scanf为不安全的函数 要使用 得加上这句话 2 #include<stdio.h> 3 #define Size 10 4 int Vector[10] = { 1,6,8,9,11,15,18,33,40,61 }; 5 //int Vector[Size]; 6 // 无序向量 7 int Ge

6.5-数据结构&amp;算法-标准模板STL/STL容器/向量

一.标准模板库(STL) 1.定义了一系列的容器模板,实现泛型化的数据结构. 1)向量(vector),内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高. 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高. 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效率都比较高. 以上三种合称为线性容器. 4)堆栈(stack),后进先出 5)队列(queue),先进先出 6)优先队列(priorit

向量(vector)

1.接口与实现 1.1 抽象数据类型:一组数据模型上定义的一组操作    数据类型是(char.int等) 数据结构:基于特定语言的,实现ADT的一整套算法. 1.2 向量:向量是数组的抽象与泛化,由一组元素按线性次序封装而成. 特点:1.各元素与(0,n)内的秩一一对以应 2.元素的类型不限于基本类型 3.操作.管理更加简洁.统一与安全 4.可更为便捷的参与复杂数据结构的定制与实现 1.3 向量的操作 insert(0,9):在0的位置插入9 put(1,2)修改1位置上的元素为2 get(2

STL模板_十大容器概念

一.向量(续)1.大小和容量大小:容器中元素的个数.容量:容器中可容纳元素的个数.size_type size (void) const; // 获取大小void resize (size_type num, value_type const& val = value_type ()); // 改变大小往小改,被裁减掉的元素将被析构.往大改,新增出来的元素将被构造,第二个参数表示初始值.void clear (void); // 清空,相当于resize (0)bool empty (void)

Standard C++ Episode 11

一.标准模板库(STL) (p.s. STL中的常用实用工具 auto_ptr string pair ) 1.定义了一系列的容器模板(类模板),实现泛型化的数据结构. 1)向量(vector, 这里说的"向量"就是数组), 向量内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高. 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高. 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效