记录学习笔记
数组
定义:需要⼀块连续的内存空间来存储
思考?为什么数组下标从0开始?
从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移 (offset)”。前⾯也讲到,如果⽤a来表⽰数组的⾸地址,a[0]就是偏 移为0的位置,也就是⾸地址,a[k]就表⽰偏移k个type_size的位置, 所以计算a[k]的内存地址只需要⽤这个公式:
a[k]_address = base_address + k * type_size
但是,如果数组从1开始计数,那我们计算数组元素a[k]的内存地址就 会变为:
a[k]_address = base_address + (k-1)*type_size
对⽐两个公式,我们不难发现,从1开始编号,每次随机访问数组元素 都多了⼀次减法运算,对于CPU来说,就是多了⼀次减法指令。 数组作为⾮常基础的数据结构,通过下标随机访问数组元素⼜是其⾮ 常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少 ⼀次减法操作,数组选择了从0开始编号,⽽不是从1开始
时间复杂度
插入删除O(n)
随机访问O(1)
链表
定义:通过指针将一组零散的内存块串联起来
时间复杂度
插入删除O(1)
随机访问O(n)