顺序表与链表
1.逻辑结构
顺序表与链表的逻辑结构均为线性结构,都属于线性表。
2.存储结构
顺序表是顺序存储,因此其可以随机存取,只要知道顺序表的起始地址,则可以立即找到第i个元素的起始位置。且由于不存储其他冗余信息。
因此顺序表
优点为:可随机存储,存储密度高。
缺点为:大片连续空间分配不方便,改变容量不方便。
链表是链式存储,
优点为:离散的小空间分配方便,改变容量方便。
缺点为:不可随机存取,存储密度低。
3.基本操作
创销、增删改查
创建的不同:
顺序表:需要预分配大片连续空间;若分配空间过小,则之后不方便拓展容量;若分配空间过大,则浪费内存资源;
顺序表采取静态分配创建静态数组,则其容量不可更改。
顺序表若采用动态分配创建动态数组,容量可以改变,但需要移动大量元素,时间代价高。
链表:只需要分配一个头结点,之后方便拓展即可。
销毁的不同:
顺序表:
静态分配:静态数组。则系统自动回收空间。
动态分配:动态数组。需要手动free。
链表:需要对每个结点手动free。
插入和删除的不同:
顺序表:插入和删除都要将后续元素后移/前移。时间复杂度为O(n),时间开销主要来自移动元素。
链表:插入和删除元素只需要修改指针即可。时间复杂度为O(n),时间开销主要来自查找目标。
但若数据元素很大,则移动的时间代价很高,如1MB的数据元素移动一次需要10ms,则总时间为10msn,而查找数据元素的时间快得多,且与数据元素的大小无关,通过指针查找元素的时间可能为1us,则总时间为1usn。因此顺序表插入和查找的时间还是大于 链表的时间的。
查找的不同:
顺序表:
按位查找:O(1)
按值查找:若表内元素无序,则查找时间复杂度为O(n)。若表内元素有序,则查找时间复杂度为O(
l
o
g
2
n
log_2n
log2n)的时间复杂度(可进行二分查找)
链表:
按位查找:O(n)
按值查找:O(n)
4.顺序表与链表的适用场景
顺序表:表长可预估、查询操作比较多。
链表:表长难以预估、经常要增加/删除元素