顺序表的实现 1. Loc(ei) = l0 + c x i 设有一个顺序表对象,其元素储存在一片元素存储区,该存储区的起始位置(内存地址)已知为l0。假定表元素标号从0开始(符合Python和许多编程语言的约定),元素e0自然应存储在内存位置 Loc(ei) = l0 。在假定表中一个元素所需的存储单元数为c = size,在这种情况下就有上述的元素ei的地址计算公式。 2. 在建立一个顺序表时,一种可能是按建立时确定的元素个数分配存储(Python的tuple)。一种是可以变动的表,分配一块足以容纳当前需要记录的元素存储块,还应该保存一些空位,以满足增加元素的需要(Python的list)。 3.顺序表基本操作的实现 1)创建和访问操作 ① 创建空表:O(1)复杂度 ② 简单判断操作:O(1)复杂度 ③ 访问给定下标i的元素:O(1)复杂度 ④ 遍历操作:O(1)复杂度 ⑤ 查找给定元素d(第一次出现)的位置:O(1)复杂度 ⑥ 查找给定元素d在位置k之后的第一次出现的位置:O(n)复杂度 2)变动操作:加入元素 ① 尾段加入新数据项:O(1)复杂度 ② 新数据存入元素存储区的第i个单元:最坏或平均情况O(i)复杂度 3)变动操作:删除元素 ① 尾段删除数据:O(1)复杂度 ② 删除位置i的数据:O(1)复杂度 ③ 基于条件的删除:O(n)复杂度 4. 表的顺序实现的总结: 优点:O(1)时间的(随机、直接的)按位置访问元素;元素在表里存储紧凑,除表元素存储区之外只需要O(1)空间存放少量辅助信息。 缺点:需要很大片的连续内存空间;一旦确定了存储块的大小,可容纳单元个数并不随着插入/删除操作的进行二变化;可能会造成表内的存储浪费;在进行加入或删除操作时,通常需要移动许多元素,效率低;建立表时需要考虑元素存储区大小,而实际需求通常很难事先估计。
链接表 1. 基本思想 ① 把表中的元素分别存储在一批独立的存储块(称为表的结点)里。 ② 保证从组成表结构中的任一个结点可找到与其相关的下一个结点。 ③ 在前一结点里用链接的方式显式地记录与下一结点之间的关联。 2. 单链表 ① 一个单链表由一些具体的表结点构成 ② 每个结点是一个对象,有自己的标识,下面也常称其为该结点的链接。 ③ 结点之间通过结点链接建立起单项的顺序联系。 见代码1 3. 链接表的操作 1)基本链接操作 ① 创建空链表 时间复杂度O(1) ② 删除链表 时间复杂度O(1) ③ 判断表是否为空 时间复杂度O(1) ④ 判断表是否满 时间复杂度O(1) 2)加入元素 ① 表首端插入 时间复杂度O(1) 见代码2 ② 一般情况的元素插入 时间复杂度O(n) 见代码3 3)删除元素 ① 删除表首元素 时间复杂度O(1) 见代码4 ② 一般情况的元素删除 时间复杂度O(n) 见代码4 4)扫描、定位和遍历 ① 由于单链表只有一个方向,开始情况下只有表头常量在掌握中,所以对表内容的一切检查都只能从表头变量开始,沿着表中链接逐步进行,称之为扫描。 见代码5 ② 按下标定位 见代码6 ③ 按元素定位 见代码7 ④ 遍历 见代码8 5)求表的长度 见代码9