数据结构与算法 - 线性表之顺序表与链表结构

线性表,全名为线性存储结构

简介:将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(简称线性表)。

注意:使用线性表的数据所使用的数据类型必须是一致的。

 

有两种方式线性地存储数据到内存中,即顺序存储链式存储

下图为顺序存储在内存中的存储方式:

说明:将表格中每一个Cell看作是1个单位的内存空间,左边是内存的地址,右边是保存的值;

当需要从内存中将存放的值全部取出来时,只需要从第一个地址依次遍历即可取到。

 

下图为链式存储在内存中的存储方式:

说明:将表格中每一个Cell看作是1个单位的内存空间,左边是内存的地址,右边是保存的值;这里就存在一个问题,顺序被打乱了那么如何将值完整的取出来呢?

答案是在每一个节点中都存放下一个节点的地址的值,C语言中可以很方便的将指针指向的地址转变为节点,例如:内存地址0x0001中存放下一个节点R的地址:node->next=0x0007,在内存地址0x0007中存放下一个节点I的地址:node->next = 0x0003;这样就能循环往复的拿到整个链表的数据了。

 

顺序表与链表各自的优势与不足:

从空间利用率的角度考虑,由于顺序表是在内存整块整块地存放的,而链表每次申请的地址是随机的,这种情况会产生很多的空间碎片。

 

从时间复杂度的角度考虑,由于顺序表中的各个元素可以通过下标直接访问,不需要从头依次查找,所以在执行查询操作时顺序表的时间复杂度是O(1);反观链表则需要从头结点依次遍历,它的时间复杂度为O(n);

另一方面对链表进行增删改操作时,比如需求是在ARIMA中的A和R之间添加一个字母V,只需要将原指向R的地址赋值给V的next,将V的地址赋值给A的next节点。

在对顺序表执行相同的操作时,则需要在原R~A节点的地址依次往后移动,再在原来存放R节点的地址位置存放V节点。这种操作会移动大量的节点(也许只有几个节点看不明显,想象有一个占用1G内存空间的程序(1G空间 ≈ 2^30 byte))

所以顺序存储的时间复杂度为O(n),链表存储的时间复杂度为O(1);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值