CM2 线性结构之一:线性表
数据元素集(D)
n个相同类型数据元素的有限序列( a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an)
逻辑结构(L)
由下标i
决定
首元素、尾元素、前驱、后继
算法的设计取决于逻辑结构
基本操作(O)
-
初始化
ListInit(L)
-
销毁
ListDestory(L)
-
引用型操作
ListLength(L), ListGet(L, i), ListLocate(L, elem), ListPrior(L, elem), ListNext(L, elem), ListEmpty(L)
-
加工型操作
ListInsert(L, i, elem), ListDelete(L, i), ListClear(L)
相关操作
-
遍历
首先判空
ListEmpty(L)
然后找到线性表的第一个元素,依次向后扫描
-
合并
-
直接合并
-
算法描述
集合
La, Lb
依次从
Lb
中取第i
个元素elem = ListGet(Lb, i)
判断
elem
是否在LA
中存在ListLocate(La, elem)
若不存在,则将
elem
插入到La
中ListInsert(La, n+1, elem)
-
算法分析
基本操作执行次数
ListGet
和ListInsert
与具体存储结构有关,与长度无关最好情形: O ( n 2 ) O(n^2) O(n2)
最坏情形: O ( m n + n 2 ) O(mn+n^2) O(mn+n2)
优化:选元素少的作为
Lb
-
-
保序合并
双指针
时间复杂度:
O(n+m)
-
顺序存储结构
-
逻辑上相邻的元素其物理位置也相邻
-
实现方法
- 数组表示法
- 内存空间在编译前确定,称为静态存储
- 指针表示法
malloc
- 数组表示法
-
相关操作
操作 时间复杂度 void SeqListInit(SeqList &L)
O ( 1 ) O(1) O(1) int SeqListLength(SeqList &L)
O ( 1 ) O(1) O(1) ElemType SeqListGet(SeqList &L, int i)
O ( 1 ) O(1) O(1) int SeqListLocate(SeqList &L, ElemType elem)
O ( n ) O(n) O(n) ElemType SeqListPrior(SeqList &L, ElemType elem)
O ( n ) O(n) O(n) ElemType SeqListNext(SeqList &L, ElemType elem)
O ( n ) O(n) O(n) bool SeqListInsert(SeqList &L, ElemType elem)
O ( n ) O(n) O(n) bool SeqListDel(SeqList &L, int i)
O ( n ) O(n) O(n) bool SeqListEmpty(SeqList &L)
O ( 1 ) O(1) O(1) void SeqListTraverse(SeqList &L)
O ( n ) O(n) O(n) -
特点
- 随机存取
- 元素最大个数需预先确定,不便于扩充
- 插入和删除效率低
链式存储结构
-
用一组地址任意的存储单元存放数据元素,结点中含有一个指针域
-
牺牲空间效率换取时间效率
-
相关操作
操作 时间复杂度 void LinkedListInit(LinkedList L)
O ( 1 ) O(1) O(1) int LinkedListLength(LinkedList L)
O ( n ) O(n) O(n) ElemType LinkedListGet(LinkedList L, int i)
O ( n ) O(n) O(n) int LinkedListLocate(LinkedList L, ElemType elem)
O ( n ) O(n) O(n) ElemType LinkedListPrior(LinkedList L, LinkedList p)
O ( n ) O(n) O(n) ElemType LinkedListNext(LinkedList L, LinkedList p)
O ( 1 ) O(1) O(1) bool LinkedListInsert(LinkedList L, LinkedList p, ElemType elem)
O ( n ) O(n) O(n) bool LinkedListDel(LinkedList L, ElemType elem, LinkedList p)
O ( n ) O(n) O(n) void LinkedListCreate(LinkedList L, ElemType a[n])
O ( n ) O(n) O(n) bool LinkedListEmpty(LinkedList L)
O ( 1 ) O(1) O(1) void LinkedListTraverse(LinkedList L)
O ( n ) O(n) O(n) -
特点
- 动态结构,不需要预先分配空间
- 不能随机存取
-
双向链表
-
循环链表
若线性表的长度不大,主要操作是查找采用顺序表,则采用顺序表。
L)` | O ( n ) O(n) O(n) |
-
特点
- 动态结构,不需要预先分配空间
- 不能随机存取
-
双向链表
-
循环链表
若线性表的长度不大,主要操作是查找采用顺序表,则采用顺序表。
若线性表的长度变化大,主要操作是插入、删除,则采用链表。