【数据结构(邓俊辉)学习笔记】列表03——有序列表

文章目录

  • [0. 概述](#0. 概述)
  • [1. 唯一化](#1. 唯一化)
  • [2. 查找](#2. 查找)
    • [2.1 实现](#2.1 实现)
    • [2.2 顺序查找](#2.2 顺序查找)
    • [2.3 复杂度](#2.3 复杂度)

0. 概述

介绍下有序列表。

若列表中所有节点的逻辑次序与其大小次序完全一致,则称作有序列表(sorted list)。为保证节点之间可以定义次序,依然假定元素类型T直接支持大小比较,或已重载相关操作符。

1. 唯一化

算法思想:

有序列表中的雷同节点也必然(在逻辑上)彼此紧邻。利用这一特性。位置指针p和q分别指向每一对相邻的节点,若二者雷同则删除q,否则转向下一对相邻节点。如此反复迭代,直至检查过所有节点。

cpp 复制代码
template <typename T> 
Rank List<T>::uniquify() { //成批剔除重复元素,效率更高
   if ( _size < 2 ) return 0; //平凡列表自然无重复
   Rank oldSize = _size; //记录原规模
   ListNodePosi<T> p = first(); ListNodePosi<T> q; //p为各区段起点,q为其后继
   while ( trailer != ( q = p->succ ) ) //反复考查紧邻的节点对(p, q)
      if ( p->data != q->data ) p = q; //若互异,则转向下一区段
      else remove( q ); //否则(雷同)直接删除后者,不必如向量那样间接地完成删除
   return oldSize - _size; //列表规模变化量,即被删除元素总数
}

整个过程的运行时间为O(_size) = O(n),线性正比于列表原先的规模。

2. 查找

2.1 实现

cpp 复制代码
template <typename T> //在有序列表内节点p(可能是trailer)的n个真前驱中,找到不大于e的最后者
ListNodePosi<T> List<T>::search( T const& e, Rank n, ListNodePosi<T> p ) const {
   do { //初始有:0 <= n <= rank(p) < _size;此后,n总是等于p在查找区间内的秩
      p = p->pred; n--;  //从右向左  
   } while ( ( -1 != n ) && ( e < p->data ) ); //逐个比较,直至越界或命中  
   return p;  //返回最终停止的位置
} //失败时返回区间左边界的前驱(可能是header)------调用者可据此判断查找是否成功

2.2 顺序查找

与无序列表的顺序查找算法几乎一样。

原因:尽管有序列表中的节点已在逻辑上按次序单调排列,但在动态存储策略中,节点的物理地址与逻辑次序毫无关系,故无法像有序向量那样自如地应用减治策略,从而不得不继续沿用无序列表的顺序查找策略。

2.3 复杂度

最好情况下的运行时间为O(1),最坏情况下为O(n)。在等概率的前提下,平均运行时间也是O(n),线性正比于查找区间的宽度。

相关推荐
mykj15516 小时前
英语单词APP解锁学习新方式,智能高效背单词
学习·英语单词app
知识分享小能手6 小时前
深度学习学习教程,从入门到精通,深度学习中的正则化 — 完整知识点与代码示例(7)
人工智能·深度学习·学习
~kiss~7 小时前
Agent 的 未来吗?String: An Agentic OS Where Every App Is a Markdown File
学习
HugoStudio_SWAN8 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
猎头南楼9 小时前
VLA 模型落地端侧:从架构选型到量化部署的工程实践笔记
笔记·架构·大模型
Capricorn198810 小时前
日志级幻觉排障:GPT-6 Astra 迈入 AGI 时代,知芽 Notebook Skill 如何以引用校验与零命中诚实弃权解决长文失忆
论文阅读·人工智能·笔记·gpt·agi
UIU11410 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
疯狂打码的少年10 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
tq108610 小时前
算法的另一面
笔记
青山木11 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法