顺序表(数组)与链表的区别

相关文档

算法和数据结构系列

学习算法和数据结构:线性结构

顺序表

顺序表一般视为数组,使用一组地址连续的存储单元依次存储数据元素

顺序表具有以下特点:

  1. 长度固定,必须在内存分配之前确定数组长度;
  2. 存储空间连续,即允许随机访问任意元素;
  3. 数据存储密集,即在内存中存储的全部是数据;
  4. 要访问特定元素,使用元素索引(时间复杂度为O(1));
  5. 要插入或删除特定元素,需要移动该位置之后的所有元素(时间复杂度为O(n))

可以考虑使用“复制-倍增”的方法利用“顺序表”做一个“变长数组”(这样做势必会产生“内存碎片”,不环保但是方便元素的查找)

链表

链表中的每个结点都有一个“指向下一个结点的指针”
根据指针的数量和指向,可以分为“单链表”、“双链表”、“循环链表”

链表具有以下特点:

  1. 长度不固定,可以任意增删;
  2. 存储空间不连续,以单链表为例每个元素只能访问相邻的一个元素;
  3. 数据存储密度小,降低了整体的关联性;
  4. 要访问特定元素,必须从表头开始遍历所有元素(时间复杂度为O(n));
  5. 要插入或删除特定元素,不涉及其它元素的变动

在实际操作中,链表由于要频繁的分配小块内存而分配内存是要耗时的所以真正运行起来往往链表不是那么优秀

双向循环链表
双向循环链表的每一个元素都有一个后继结点next、一个前趋结点prev,第一个元素的前趋结点指向最后一个元素,而最后一个元素的后继结点指向第一个元素

静态链表
所谓的静态链表就是在用数组建立链表并用一个下标来维护,类似于“内存池”预先分配一个足够长的数组,之后链表节点都会保存在这个数组里,“静态链表”解决了“普通链表”需要频繁内存分配的问题(不过需要实现准备一个足够大的数组,或者考虑变长数组)

这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构

这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,仍具有链式存储结构的主要优点

静态链表的每一个节点都包含两部分,分别是数据data和游标cur(游标是指该存储元素的下一个元素所在数组对应的标)

块状链表
也叫“随机线性存取表”,整体上使用链表,但是链表的每一个节点替换成一个大小合适的数组

块状链表结合了顺序表(数组)快速查找和链表添加、删除元素快速的特点

跳跃链表
也称“跳表”,是一种随机化的数据结构

要查找一个目标元素,如上图所示,起步于头元素和顶层列表,并沿着每个链表搜索,直到到达小于或着等于目标的最后一个元素

“跳表”的数据存取效率很高(可以比拟“二叉查找树”,大多数查找仅需要O(logn)的时间复杂度)

跳跃链表的思路:
在构造此链表的时候,我们构造了另一个链表,它指向原链表中的元素,只不过它中间跳过一些节点,但任然是按照原链表顺序将其中元素串起来,这样在查找过程中可以跳过一些节点;跳表的产生就是为了更高效的查找数据

跳跃链表的一般构造套路:

  1. 给定一个有序链表;
  2. 选择其中最大和最小的元素,然后从剩下的元素中随机选出一些组成一个有序链表,这是跳表的第一层,原链表称为其下一层;
  3. 为刚刚选出的每个元素添加一个指针域,该指针指向下一层中和自己相同值的元素;Top指针指向首元素
  4. 重复2、3步,直到不能找出除了最大最小值的其它数

“跳表”就是为了高效查找数据而诞生的!

猜你喜欢

转载自blog.csdn.net/Yuyh131/article/details/83629642
今日推荐