数组
本文只是我的个人学习笔记,用于记录数据结构和算法的学习总结。
什么是数组
数组是用来存储一组具有相同类型数据的一组连续内存空间。是一种线性数据结构。
什么是线性表
线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表。
特性
连续的内存空间和相同类型的数据。
优点:具有随机访问的特性
缺点:删除,插入数据效率低
数组怎么实现下标随机访问
以一维数组举例:
a[i]_address = base_address + i * data_type_size
其中base_address
是内存块的首地址,也就是a[0]。data_type_size
是数组中每个元素的大小。
二维数组计算方式:
Array[m][n], a[i][j]_address=base_address + (i*n+j)*data_type_size
数组根据下标随机访问的的时间复杂度是 O(1)
低效的插入和删除
最好时间复杂度: O(1)。
最坏时间复杂度:O(n)。
平均时间复杂度:(1+2+…n)/n=O(n)。
提高效率:将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作。
为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始?
从数组存储的内存模型上来看,“下标”最确切的定义应该是”偏移“
a[0] 就是偏移为 0 的位置,也就是首地址,a[k] 就表示偏移 k 个 type_size 的位置。所以计算 a[k] 的内存地址只需要用这个公式(以C语言为例):
a[k]_address = base_address + k * type_size
如果数组从 1 开始计数,那我们计算数组元素 a[k] 的内存地址就会变为:
a[k]_address = base_address + (k-1)*type_size
从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。
我觉得最主要的是因为C语言是从0开始的。