数组
数组概念
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表
线性表就是数据排成像一条线一样的结构。表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。数组、链表、队列、栈等也是线性表结构。
非线性表
二叉树、堆、图等,在非线性表中,数据之间并不是简单的前后关系。
连续的内存空间和相同类型的数据
优点:随机访问(下标查找数据)
缺点:删除、插入数据非常的低效
数据存储原理和为啥下标从0开始
案例
int[] a = new int[10]
右边的1000到1039为连续的内存空间,其中每个数据占用4个字节数据,因为int
取值代码:
a[i]_address = base_address + i * data_type_size
其中 data_type_size 表示数组中每个元素的大小
假设我要拿a[1]
a[1]=999+4*1=1003 1000-1003
如果第一个元素的索引不从0开始,每一次都要进行一次-1,对于cpu来说,就是多一次减法指令,以0开始可以提高性能。
时间复杂度分析
根据索引取值
由于根据索引取值,n和代码是不影响的,代码执行时间为一个常数,时间复杂度为O(1)
插入数据
依次从0为开始,时间复杂度为1+2+...n/n=O(n)
如果数据不是有序的,这里我们只是把它当做容器
可以用这种插入方法,时间复杂度为O(1)
删除数据
删除数据和插入数据时间复杂度都为O(n)
删除数据减小时间复杂度,骚操作--标记清除思想
假如我们要删除a,b,c三个元素,我们只需要把它们记下来,直到数组被删除完全,在执行一次删除
其实这就是垃圾回收经常使用的标记-清除思想