数组和链表的区别

我们知道遍历数组和链表的时间复杂度都是O(n),但是在实际中确实数组的速度要比链表快,这是为什么呢?

1、首先,数组是具有相同的数据类型且按一定次序排列的一组变量的集合体,构成一个数组的这些变量称为数组元素。数组在内存中的地址是连续相邻的,而链表在内存的地址是散列的,不连续的。

2、CPU缓存会把一片连续的内存空间读入,因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面,而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,而缓存的速率要比内存快。

3、CPU → 寄存器 → 缓存 → 内存。cpu取数据,处理数据,都要放到寄存器中处理(存放指令),缓存就是把内存中提取的数据暂时保存在里面。如果寄存器要获取内存中同一位置的数据,就从缓存中获取,如果寄存器获取的不是同一个内存地址的数据(或者获取的内存地址缓存中不存在),就从内存中查找获取 

从上述比较中,我们可以看出数组的查询,要比链表的快。

插入和删除的操作比较:

1、数组的中间插入(或删除)一个元素,那么这个元素后面所有元素的内存地址都要往后(前)移动(数组的内存地址是连续的),对最后一个元素插入(或删除)时才比较快,而链表不需要改变内存的地址,只需要修改节点的信息即可(包括指针指向,节点值)。

2、链表的扩展性较好,定义数组时所占用的空间大小都是固定的,如果存储满了,无法扩展,只能新建一个更大空间的数组。

综上所述我们可以得出:

数组大小固定,不适合动态存储,动态添加,内存为一连续的地址,可随机访问,查询较快。

而链表大小可变,扩展性强,只能顺着指针的方向查询,速度较慢。

为什么寄存器比内存快?

1、距离不同 。寄存器在CPU内部,当然读起来会快一点,内存在外部的内存插槽内,要电流经过电路板进行传输。

2、硬件设计不同。

3、工作方式不同。寄存器就是找到相应的位,然后读取这些位,两步操作。

而内存则复杂的多

(1)找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。)

(2)将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。

(3)将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。

(4)确定数据在哪一个内存块(chunk)上,从该块读取数据。

(5)数据先送回内存控制器,再送回CPU,然后开始使用。

内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。

关于计算机的缓存和内存,可以参考这篇文章《计算机缓存与内存简析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值