数组与链表的区别

数组与链表的区别

数据和链表是两种不同的数据存储的方式

1、数组

1.1数组的定义

数组是一组具有相同数据类型的变量的集合,这些变量称之为集合的元素,每个元素都有一个编号,称之为下标,可以通过下标来区别并访问数组元素,数组元素的个数叫做数据的长度

1.2数组的特点

1.2.1数组的存储区间

在内存中,数组是一块连续的区域

1.2.2数组需要预留空间

在使用前需要提前申请所占内存的大小,如果提前不知道需要的空间大小时,预先申请就可能会浪费内存空间,即数组的空间利用率较低。注:数组的空间在编译阶段就需要进行确定,所以需要提前给出数组空间的大小(在运行阶段是不允许改变的)

1.2.3数组效率

在数组起始位置处,插入数据和删除数据效率低

插入数据时,待插入位置的元素和他后面的所有元素都需要向后搬移

删除数据时,待删除位置后面的所有元素都需要向前搬移

1.2.4数组的随机访问

数组的随机访问效率很高,时间复杂度可以达到O(1)

因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址向后偏移就可以访问到了

1.2.5数组的开辟

数组开辟的空间,在不够使用的时候需要进行扩容;扩容的话,就涉及到需要把旧数组中的所有元素向新数组中搬移

1.2.6数组的空间分配

数组的空间分配是从栈分配的(栈:先进后出)

1.3数组的优点

随机访问性强,查找速度快,时间复杂度是O(1)

1.4数组的缺点

从头部删除、从头部插入的效率低,时间复杂度是o(n),因为需要相应的向前搬移和向后搬移。、

内存空间要求高,必须要有足够的连续的内存空间

数组的空间大小是固定的,不能进行动态扩展

2、链表

2.1链表的定义

所谓链表,链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

链表的特性是在中间任意位置插入和删除元素都非常快,不需要移动其它元素

对于单向链表而言,链表中的每一个元素都要保存一个指向下一个元素的指针

对于双向链表而言,链表中的每个元素既要保存指向下一个元素的指针,又要保存指向上一个元素的指针

对于双向循环链表而言,链表中的最后一个元素保存一个指向第一个元素的指针

2.2链表的特点

相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)

链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)

链表的特点是:查询相对于数组困难,增加和删除容易

2.3链表的优点

可动态添加删除 大小可变

2.4链表的缺点

只能通过顺次指针访问,查询效率低

ps:补充

顺序表的优点:查找方便,适合随机查找
顺序表的缺点:插入、删除操作不方便,因为插入、删除操作会导致大量元素的移动

链接表的优点:插入、删除操作不方便,不会导致元素的移动,因为元素增减,只需要调整指针。
顺序表的缺点:查找方便,不适合随机查找

3、数组和链表的区别

比较项目数组链表
逻辑结构(1)数组在内存中连续; (2)使用数组之前,必须事先固定数组长度,不支持动态改变数组大小;(3) 数组元素增加时,有可能会数组越界;(4) 数组元素减少时,会造成内存浪费;(5)数组增删时需要移动其它元素(1)链表采用动态内存分配的方式,在内存中不连续 (2)支持动态增加或者删除元素 (3)需要时可以使用malloc或者new来申请内存,不用时使用free或者delete来释放内存
内存结构数组从栈上分配内存,使用方便,但是自由度小链表从堆上分配内存,自由度大,但是要注意内存泄漏
访问效率数组在内存中顺序存储,可通过下标访问,访问效率高链表访问效率低,如果想要访问某个元素,需要从头遍历
越界问题数组的大小是固定的,所以存在访问越界的风险只要可以申请得到链表空间,链表就无越界风险

4、数组和链表操作时的时间复杂度

操作数组链表
随机访问O(1)O(N)
头部插入元素O(N)O(1)
头部删除元素O(N)O(1)
尾部插入元素O(1)O(1)
尾部删除元素O(1)O(1)

5、数组和链表的使用场景

数组(顺序表)和链表各有短长,在实际应用中,应该具体问题具体分析,通常有以下方面的考虑

比较项数组的使用场景链表的使用场景
空间数组的存储空间是栈上分配的,存储密度大,当要求存储的大小变化不大时,且可以事先确定大小,宜采用数组存储数据链表的存储空间是堆上动态申请的,当要求存储的长度变化较大时,且事先无法估量数据规模,宜采用链表存储
时间数组访问效率高。当线性表的操作主要是进行查找,很少插入和删除时,宜采用数组结构链表插入、删除效率高,当线性表要求频繁插入和删除时,宜采用链表结构
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值