顺序表
1.线性表
定义:
具有n(n>=0)个数据结点(元素)的序列A=(a1,a2,a3,…,an);数据集合可以为空。
引入下面术语:
- 首节点和尾结点
- 表的长度
- 空表
- 前驱和后继(左邻和右邻)
- 有序表
其中,a1称为首结点,an称为尾结点,n是表的长度,如果n等于0,称为空表,相继的两个结点之间互为前驱和后继,a1没有前驱,an没有后继。如果表中的结点是按结点的值,或按结点某个域的值由小到大升序或相反排列的,则称这个表示有序表。这是关于表的逻辑结构。
例子:
100以内的素数表:p=(2,3,5,.....,97)。
# 这是有序表,而且是一个单值元素表
学生成绩单
# 学生成绩单是典型的非单值元素表,每行数据作为一个结点,元素是结构类型。对于结构类型的表,通常要指定一个数据项作为结点的关键字。比如:学号可以定位关键字。
补充:数据结点是类似于数据表中的一条记录,数据项是类似于记录中的一个单元
如何存储线性表?
既要存储数据结点本身,也要存储数据结点之间的关系。
2.存储方法
线性表:具有n(n>=0)个数据结点(元素)的序列A=(a1,a2,a3,…,an);数据集合可以为空。
2.1:顺序存储
- 存储结点的逻辑次序与蓄力次序一致
- 称为:顺序表
2.2:链式存储
- 存储节点的逻辑次序与物理次序不必一致
- 称为:链表
3. 表的顺序存储——顺序表
顺序存储:
- 用一组地址连续的存储单元一次存放数据元素
- 所有数据元素的存储位置均取决于第一个元素的存储位置。
- 在高级语言中,可以理解为数组。数组的特征与顺序存储的内涵完全一致。因此可以用数组描述顺序存储
- 这样一个数组元素便是一个存储结点,下标作为结点的存储地址。
3-1.顺序表的插入操作
插入:在表中添加一个新结点
- 指定位置插入
- 指定条件插入
- 无条件插入
例如:有序插入需要先进行查找运算——》确定位置插入——》完成插入操作
完成插入的程序段:
for (j=n-1;j>=i;j--) a[j+1]=a[j] //又移,空出a[i]
a[i]=x
n+=1
插入a[i]共需要移动n-i个元素
T(n)=n-i
3-2.顺序表的删除操作(指定位置)
删除:删除表中某个结点。
删除的方式有:
- 指定特征的删除:删除值为x的结点。
- 指定位置删除:比如,删除表头结点,或表尾接地点,或第i个结点。
3-3.指定位置插入/删除操作效率分析
插入:T(n)=n-i
删除:T(n)=n-1-i
在表尾处插/删,最好,时间用量最少,T(n)=O(1)。
最坏情况下,在表头处插/删,i=0,T(n)=O(n)。
平均情况下,移动半数表元素,T(n)=O(n-i)。
插入与删除的平均时间复杂度都是O(n)
适用情况:
一、表长不大
二、不做,或很少做插/删
三、只在表的断点处插/删
3-4.顺序表的查找
查找:给定结点的关键字值x,查找值等于x的结点的存储地址。
“穷尽式搜索法“通常以查找长度,即查找过程中测试的节点数目,度量查找算法的时间复杂性。
顺序查找的查找长度为for循环体的查找次数,最小为1,最多为n。等概率下长度为(1+n)/2
3-5 顺序查找(带监督元):
在查找终点预留一个存储结点(监督元),对程序的运行起到“监督控制作用”。
带监督元查找在表长n较大,查找频繁的表中更加有效。
监督元技术应用范围很广,适用于顺序表,也适用于二叉树和链表。不同的结构有不同的处理目的。
3-6 二分查找
适用范围:有序顺序表
核心思想:分治法
讲一个难以直接解决的大问题,分割成一些规模较小的、性质相同的子问题,以便各个击破,分而治之。
性能:
最坏:T(n)=O(1+log2(n))
平均:T(n)=O(logn)