之前讲了集合的顺序存储结构和链式存储结构,今天接着聊下一个基本的数据结构--线性表,线性表是线性数据结构的一种表现形式
线性表的定义
线性表是同一类型数据的一个有限序列,线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
线性表的顺序存储要求地址空间是连续的,地址必须一个接一个,不能中断。如下图为顺序存储结构:
顺序存储结构
线性表的顺序存储每个节点只包含数据部分,不需要额外包含数据之间的关系,因为数据之间的关系通过地址连续来体现,所以非常省空间
它的优点访问非常快速,因为地址是连续的,只要知道首地址,任意一个元素的地址都可以算出来。假设每个地址占c个空间,则第i个地址为(i-1)*c。
它的缺点是在插入和删除数据时,可能要移动许多数据,比如一个10000个元素的有序数据,如果我删除了第二个元素,为了继续保持地址连续,所以要把后面9999个元素都向前移动。
线性表的抽象数据类型定义如下:
ADT Set is
Data:
采用任何一种存储方法存储的一个线性表
Operation:
initList() //初始化集合
add(obj,pos)//向第pos个位置添加元素
remove(pos)//删除第pos个位置的元素
find(obj)//查找元素并返回其位置
value(pos)//返回第pos个位置元素的值
modify(obj,pos)//修改第pos个位置的元素为obj
size()//获取线性表的长度
isEmpty//判断线性表是否为空
clear()//清空线性表
forward()//正向遍历输出线性表中的所有值
backward()//反向遍历输出线性表中的所有值
sort()//根据当前线性表,返回一个排好序的线性表
线性表的顺序存储结构和操作实现
下面把线性表用java实现,首先定义一个线性表操作的接口,List
下面对线性表进行初始化
插入操作add,时间复杂度O(n)
删除操作remove,时间复杂度O(n)
查找元素find,时间复杂度O(n)
获取第i个位置元素,时间复杂度O(1)
修改某个位置元素modify,时间复杂度O(1)
判空isEmpty,清空线性表clear和获取线性表元素长度size,时间复杂度O(1)
正向遍历forward和反向遍历backward,时间复杂度O(n)
根据当前线性表,返回一个排好序的线性表sort,时间复杂度O(n*n)
其中用了插入排序对线性表进行排序,如果插入排序忘记了的话,可以看看我这篇博文
测试及结果
好了,今天就到这里了,后面接着讲有序线性表的实现和线性表的链式存储结构