数据结构之数组
思考:
- 1.数组的本质定义?
- 2.数组的内存结构?
- 3.数组的优势和劣势?
- 4.数组为什么大部分都行0开始?
- 5.数组能否用其他容器来代替?
- 6.数组的应用场景?
一、数组的本质定义:
数组:是相同元素的序列。即把相同类型的若干元素按无序的形式组织起来的一种形式。(核心思想:就是对角标的操作)
二、数组的内存结构:
- 数组是一种线性结构,即只有前置节点和后续节点的数据结构。
像队列,链表栈都是线性结构的,而二叉树、图是非线性结构的 - 数组元素在内存分配上是连续的(“数组的杀手锏”,需记死烂在心里)。
三、数组的优势和劣势:
问题1.:为什么数据可以使用下标访问?
答案:内存连续+相同数据类型
问题2:数组适合按下标来查找元素。按下标查找元素的时间复杂度是o(1).为什么呢?
答案:
数据在内存上分配的情景:
要想访问数组的元素需要知道元素在内存中对应的内存地址。而数组指向的内存的地址为首元素的地址,即arr[0]。由于数组的每个元素都是相同类型的,每个类型占用的字节数系统已知,所以想访问一个数组元素,按照下标查找可以抽象为:arr[n]=arr[0]+size*n, size为每个元素的大小(int类型的,size=4),n是一个里首元素的偏移量,arr[0]:基地址。
优势:数组按下标查询速度很快。由于数组的连续性,所以在遍历的时候很快,不仅是数组的连续性起作用,cpu的缓存也起作用了,因为cpu读缓存只能读取连续的内容,数组的连续性刚好符合cpu缓存的指令原理。【注:cpu缓存的速度内存的速度快上很多】
劣势:
- 1.数组的添加和删除速度慢。由于数组在内存排列上是连续的,而且要保持这种连续性,所以当增加一个元素或者删除一个元素,为了保持连续性,需要做大量元素的移动工作。
- 2.数组的连续性要求创建数组的时候,内存必须有相应大小的连续区块,如果不存在,可能创建失败。
- 3.数组要求所有元素是同一个类型。
- 4.数组是固定长度的数据结构
- 5.数据有访问越界的可能。
四、数组下标为什么从0开始:
1.如果数组下标从1开始,上面的公式变为:arr[n]=arr[1]+size*(n-1),那么每次获取内存地址都多了一次减法运算,即多了一次cpu指令的运行。
2.编程语言的鼻祖c语言是从0开始的,java是后来衍生的语言,沿用了这个传统。
五、数组的应用场景:
以后接触了再补充。