区别:
①插入(或删除)一个元素:
- 数组:这个元素后的所有元素的内存地址都要往后(前)移动(数组的内存地址是连续的),对最后一个元素插入(或删除)时才比较快,平均时间复杂度是O(n)
- 链表:不需要改变内存的地址,只需要修改节点的信息即可(包括指针指向,节点值),光讨论插入这个操作的话,平均时间复杂度是O(1),但是如果不知道插入(或删除)的位置的时候,找到该位置的平均时间复杂度是O(n),所以整个插入(或删除)操作的平均时间复杂度也是O(n)。
②扩展性:
- 定义数组时所占用的空间大小都是固定的,如果存储满了,无法扩展,只能新建一个更大空间的数组。
- 链表的扩展性较好
提出问题:
查询数组和链表的时间复杂度是O(n)
查询数组和链表的时间复杂度是O(n),但是在实际中确实 数组的速度要比链表快,这是为什么呢?
CPU缓存会把一片连续的内存空间读入
- 因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面, 平均读取每个元素的时间只要3个CPU时钟周期。
- 而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。 这样算下来,数组访问的速度比链表快33倍! (这里只是介绍概念,具体的数字因CPU而异)
顺便学习一下,内存、缓存、和寄存器的区别
1. 寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
2. 内存包含的范围非常广,一般分为只读存储器(ROM)、随机存储器(RAM)和高速缓存存储器(cache)。
为什么寄存器比内存快?
1.距离不同 。
寄存器在CPU内部,当然读起来会快一点,内存在外部的内存插槽内,要电流经过电路板进行传输
2.硬件设计不同
3.工作方式不同
寄存器就是找到相应的位,然后读取这些位,两步操作。
而内存则复杂的多
(1)找到数据的指针。(指针可能存放在寄存器内,所以这一步就已经包括寄存器的全部工作了。
(2)将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址翻译成实际的物理地址。
(3)将物理地址送往内存控制器(memory controller),由内存控制器找出该地址在哪一根内存插槽(bank)上。
(4)确定数据在哪一个内存块(chunk)上,从该块读取数据。
(5)数据先送回内存控制器,再送回CPU,然后开始使用。
内存的工作流程比寄存器多出许多步。每一步都会产生延迟,累积起来就使得内存比寄存器慢得多。
参考:
内存,寄存器和cache的区别与联系
数组和链表的区别比较