顺序表 (Sequence List)

ListSeqList


表示

定义

顺序表是一种线性表数据结构,即线性结构;它用一段连续的内存空间 来存储一组具有相同类型 的数据。

  • 线性表(Linear List):顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其中,顺序表、链表、队列、栈等都是线性表结构。

  • 非线性表:是与线性表相对的概念,如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。

性质

高效的随机访问

  • 由于顺序表具有连续的内存空间和相同类型数据,故支持“随机访问”;

  • 由于顺序表具有连续的内存空间,故其下标从“0”开始;寻址公式: data[i] = base_address + i * sizeof(data_type), base_address 为存储空间的首地址。

  • 注:随机访问 != 查找O(1) ,因为二分查找的复杂度为O(logn);但是,按照数组索引方式访问数据,其复杂度为O(1) ;

  • 由于要保证物理内存的连续性,所以对于顺序表的“插入”和“删除”操作效率非常低,因为需要移动大量的数据元素。

低效的插入与删除

  • 假设顺序表的长度为 n,现在,如果我们需要将一个数据插入到顺序表中的第 k 个位置。为了 把第 k 个位置腾出来,给新来的数据,我们需要将第 k~n 这部分的元素都顺序地往后挪一 位;

  • 如果在数组的末尾插入元素,那就不需要移动数据了,这时的时间复杂度为 O(1) ;

  • 但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是 O(n) ;

  • 因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为 (1+2+ …n)/n=O(n) ;

  • 跟插入数据类似,如果我们要删除第 k 个位置的数据,为了内存的连续性,也需要将k~n这部分的元素都顺序的前移一位;

  • 优化方法:建议“插入”和“删除”操作顺序表中的最后一位元素;

存储结构

基本操作

完整代码

Last updated

Was this helpful?