1.向量
特点是插入,删除元素慢,秩访问元素快
1.1无序向量
1.1.1无序向量查找算法
int Vector<T>::find(const T & e,int lo,int hi)
算法 | 最坏时间复杂度 |
---|
从后往前顺序查找,直至范围越界 | O(n)O(n)O(n) |
1.1.2 无序向量去重算法
int Vector<T>::deplicate()
算法 | 最坏时间复杂度 | 附注 |
---|
从前往后逐一扫描各元素,在其前缀中查找雷同者,若无雷同则考察后继,否则删除雷同 | O(n2)O(n^2)O(n2) | [删除操作费时O(n)+查找操作O(n)]x迭代n步 |
1.2有序向量
1.2.1有序向量查找算法
int Vector<T>::search(const T& e,int lo,int hi) const;
算法 | 最坏时间复杂度 | 附注 |
---|
二分查找(三分支) | O(logn)O(\log n)O(logn) | 平均查找长度O(1.5logn)O(1.5\log n)O(1.5logn),根本原因在于左右分支对应查找长度的不均衡 |
Fibonacci查找 | O(logn)O(\log n)O(logn) | 平均查找长度O(1.44logn)O(1.44\log n)O(1.44logn),将查找长度的不平衡,通过一定程度的认为修正 |
二分查找(二分支) | O(logn)O(\log n)O(logn) | 平均查找长度O(logn)O(\log n)O(logn),直接将不平衡改为平衡,完全平衡了 |
查找算符的整体效率更主要取决于其中执行的元素大小比较操作的次数,即所谓查找长度
1.2.2有序向量去重算法
通常无序去重算法复杂度较高,一般做法是将无序向量转为有序向量再做唯一化操作,免去了查找操作
int Vector<T>::uniquify()
算法 | 最坏时间复杂度 | 附注 |
---|
从前往后,逐一比对各相邻元素,若相同,删除后者,否则转至后一元素 | O(n2)O(n^2)O(n2) | 免去了查找操作,但删除操作费时 O(n)O(n)O(n) |
逐一扫描,发现不同元素时,向前移至紧邻已经唯一化向量的右侧,扫描到终点,直接截除尾部多余元素 | O(n)O(n)O(n) | 在原向量开头直接修改,避免中间一个一个删除操作,免去了查找操作和删除元素操作 |
1.3向量排序器
将无序向量转换为有序向量
void Vector<T>::sort(int lo,int hi)
算法 | 最坏复杂度 |
---|
冒泡排序 | O(n2)O(n^2)O(n2) |
选择排序 | |
归并排序 | O(nlogn)O(n\log n)O(nlogn) |
堆排序 | |
快速排序 | |
2.列表
特点是插入,删除元素快速,秩访问元素慢
2.1无序列表
2.1.1无序列表查找算法
ListNodePosition List<T>::find( const T& e,int n ,ListNodePosition p) const;
算法 | 最坏时间复杂度 | 附注 |
---|
从后往前逐个比对,直至命中或者范围越界返回nullptr | O(n)O(n)O(n) | |
2.1.2 无序列表去重算法
int List<T>::deduplicate()
算法 | 最坏时间复杂度 | 附注 |
---|
从首节点开始直到末节点逐个扫描,在每个节点的前驱中查找雷同者,若存在雷同者,则删除雷同者,否则扫描下一个节点 | O(n2)O(n^2)O(n2) | 查找O(n)O(n)O(n),迭代n步 |
2.2 有序列表
2.2.1 有序列表查找算法
在无序列表的内节点p(可能是尾节点)的n(0<n<=_size)个前驱中,找到不大于e的最后者,返回节点地址
ListNodePosition List<T>::search( const T& e,int n, ListNodePosition p) const;
算法 | 最坏时间复杂度 | 附注 |
---|
对于p的最近的n个前驱,从右往左逐个比较,直到命中或者数值/范围越界 | O(n)O(n)O(n) | |
2.2.2 有序列表去重算法
int List<T>::uniquify()
算法 | 最坏时间复杂度 | 附注 |
---|
从前往后,逐一比对各相邻元素,若相同,删除后者,否则转至后一元素 | O(n)O(n)O(n) | 删除操作O(1)O(1)O(1),所以相同算法下,向量去重算法慢得多 |
2.3 列表排序器
void List<T>::sort(ListNodePosition p,int n);
算法 | 最坏时间复杂度 | 附注 |
---|
插入排序 | O(n2)O(n^2)O(n2) | 查找元素费时 |
选择排序 | O(n2)O(n^2)O(n2) | 查找最大元素费时 |
归并排序 | O(nlogn)O(n\log n)O(nlogn) | |