线性表
1、线性表的概念和性质
1、概念
集合 E E E上的一个线性表就是 E E E中一组有穷个元素排成的序列 L = ( e 0 , e 1 , ⋯ e n − 1 ) L=(e_0,e_1,\cdots e_{n-1}) L=(e0,e1,⋯en−1),其中 e i ∈ E e_i\in E ei∈E且 n ≥ 0 n\geq 0 n≥0。在一个表里可以包含零个或多个元素,序列中的每一个元素在表里都有一个确定的位置,称为元素的下标。下标一般从0开始,不含任何元素的表称作空表。
2、性质
- 表元素之间存在一个基本关系,称为下一个关系。对于表 L = ( e 0 , e 1 , ⋯ e n − 1 ) L=(e_0,e_1,\cdots e_{n-1}) L=(e0,e1,⋯en−1),下一个关系是二元组的集合 { ( e 0 , e 1 ) , ( e 1 , e 2 ) ⋯ ( e n − 2 , e n − 1 ) } \{(e_0,e_1),(e_1,e_2)\cdots (e_{n-2},e_{n-1})\} { (e0,e1),(e1,e2)⋯(en−2,en−1)}。可以看出下一个关系是一种顺序关系,即线性关系,线性表表示一种线性结构。
- 在一个非空的线性表里,存放着唯一一个首元素和唯一一个尾元素。除首元素之外,表中的每个元素都有且仅有一个前驱元素,除尾元素外,表中的每个元素都有且仅有一个后继元素。
2、表抽象数据类型
ADT List:
List(self)
is_empty(self)
len(self)
prepend(self,elem)
append(self,elem)
insert(self,elem)
del_first(self)
del_last(self)
del(self,i)
search(self,elem)
forall(self,op) #对表中每个元素执行操作op
3、线性表的实现
在实现表数据结构时,需要考虑以下两点:
- 计算机内存的特点,以及保存元素和元素顺序信息的需要。
- 各种重要操作的效率。
基于以上考虑,有两种基本的实现模型:
- 将表中的元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表。
- 将表元素存放在通过链接构造的一系列存储块里,这样实现的表称为链接表。
1、顺序表
布局方案
上图表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址 L o c ( e 0 ) Loc (e_0) Loc(e0)加上逻辑地址(第 i i i个元素)与存储单元大小( c = s i z e ( 元 素 ) c=size(元素) c=size(元素))的乘积计算而得,即:$Loc(e_i) = Loc(e_0) + c*i $。故访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。
如果表中元素的大小不统一,将无法通过公式计算出元素位置。这个时候可以采取另一种布局方案,将实际数据元素另行存储,在顺序表各单元里保存对应元素的的引用信息(链接)。