线性表的链式存储结构与顺序存储结构(链表和数组)的区别及优缺点
线性表的链式存储结构与顺序存储结构(链表和数组)的区别及优缺点
参照《大话数据结构》整理:
顺序存储结构:
优点:
- 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
- 可以快速的存取表中任一位置的元素 O(1)
缺点:
- 插入和删除操作需要移动大量元素 O(n)
- 当线性表长度变化较大时,难以确定存储空间的容量
- 造成存储空间的“碎片”
二者对比
存储分配方式 | |
---|---|
顺序存储结构 | 用一段连续的存储单元依次存储线性表的数据元素 |
单链表 | 采用链式存储结构,用一组任意的存储单元存放线性表的元素 |
时间性能 | 查找 | 插入和删除 |
---|---|---|
顺序存储结构 | O(1) | 需要平均移动表长一半的元素 O(n) |
单链表 | O(n) | 在找出某位置的指针后,插入和删除的时间复杂度为 O(1) |
空间性能 | |
---|---|
顺序存储结构 | 需要预分配存储空间,分大了->浪费,分小了->易发生上溢 |
单链表 | 不需要分配存储空间,只要有就可以分配,元素个数也不受限制 |
适用场景:
- 数组: 元素个数变化不太大,需要频繁查找(存取),很少进行插入和删除操作时。
- 链表: 元素个数变化较大或者根本不知道有多大时,插入或删除数据频繁,
之前整理的,与前文意思相同,但上文更精炼 -> 以下可不看
区别:
(1)内存:数组静态分布内存,链表动态分布内存;
数组在内存中是连续的,链表不连续;
(2)复杂度:
①查找时:
数组利用索引定位,查找的时间复杂度是O(1),
链表通过遍历定位元素,查找的时间复杂度是O(n);
② 插入和删除:
数组插入和删除要移动其他元素, 时间复杂度是O(n),
链表的插入和删除不需要移动其他元素, 时间复杂度是O(1);
数组的优缺点:
(1)优点:
复杂度: 随机访问性比较强,可以通过下标进行快速定位。查找速度快
(2)缺点:
内存: ①会造成内存的浪费. 因为内存是连续的,所以在创建数组的时候必须规定其大小,如果不合适,就会造成内存的浪费。
②内存空间要求高. 创建一个数组,必须要有足够的连续内存空间。
③数组的大小是固定的,在创建数组的时候就已经规定好,不能动态拓展, 如果要扩容, 需要重新分配一块更大的空间, 再把所有数据全部复制过去.
复杂度: ④插入和删除的效率低,需要移动其他元素。
链表的优缺点:
(1)优点:
内存: ①内存利用率高,不会浪费内存,可以使用内存中细小的不连续的空间,只有在需要的时候才去创建空间。大小不固定,拓展很灵活。
复杂度: ②插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除。
(2)缺点:
内存: ①由于每个元素必须存储指向前后元素位置的指针, 会消耗相对更多的存储空间.
复杂度: ②查找的效率低,因为链表是从第一个节点向后遍历查找。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下