顺序存储结构
顺序结构定义
线性表的顺序存储结构,指的是一段地址连续的存储单元依次存储线性表的数据元素。
- 构成顺序存储结构需要三个属性:
- 存储空间的起始位置(数组data的第一个内存地址,也就是数组下标0的位置data[0])
- 线性表的最大存储容量(数组的长度)
- 线性表的当前长度(元素的个数,不定量会变化)
warning
注意数组的长度和线性表的长度区别,前者描述存放线性表存储空间的长度一般固定。后者描述是线性表元素的个数。往往后者要小于等于前者。
顺序存储结构基础操作
- 我们根据上述讲述的三个属性,创建一个顺序存储结构的类
Details
定义顺序存储结构类
static class LinearStructure {
// 最大存储长度
int maxSize;
// 存储线性表的数组
int[] data;
// 线性表长度
int length;
// 初始化
public LinearStructure(int number) {
// 最大数组长度
this.maxSize = number;
// 初始化数组data
this.data = new int[this.maxSize];
// this.data[0] = 1;
// this.data[1] = 2;
// this.data[2] = 3;
// this.data[3] = 4;
// 线性表 初始化长度0
this.length = 0;
}
}
- 顺序存储结构获取getElem元素
顺序存储结构获取元素非常简单,直接根据下标获取即可。
public int getData(int index) {
return data[index];
}
因可直接根据下标获取元素,因此线性表不管多长不管在什么位置,时间复杂度都是O(1)
- 顺序存储结构的插入insertElem操作
Hare正在火车站排队买票,来了一个小伙子告知是否插队我前面,看着挺着急谁让咱善良呢。小伙子站在了我的前面,随后我就得向后移动,当然后面的人都得向后移动。队伍蠕动了起来!
从以上讲述可得知,顺序存储结构若是遇到了插入则每个元素都得向后移动(插入时,数组长度要有空余的位置)。
// 插入数据
public boolean insert(int num, int i) throws Exception {
if (!full()) {
if (i >= this.maxSize || i < 0) {
throw new Exception("超出数组长度");
}
// 最优情况i等于this.data.length-1,每次插入到最后面O(1)
//data[i] = num;
// 往后移动
for (int j = this.length-1; j >= i; j--) {
data[j + 1] = data[j];
}
// 插队
data[i] = num;
this.length++;
return true;
}
throw new Exception("已满,插入 失败~");
}
// 当线性表长度等于数组最大存储长度则当前已满
public boolean full() {
if (this.length == this.maxSize) {
return true;
}
return false;
}
顺序存储结构最终分析
- 最优情况下: 删除,插入最后一个,不需要动其他的元素。则时间复杂度O(1)
- 最坏情况下: 删除,插入,需要移动元素,则时间复杂度O(n)
- 当我们获取元素时: 直接根据下标获取即可,所以此顺序存储结构适合读多,增删写少(速度慢性能影响)