00数据结构与算法分析:大纲
01数据结构:数组
02数据结构:链表
03数据结构:栈
03数据结构:队列
数组
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。
关键点:连续的存储空间 --- 就保证了数组可以进行随机访问
1 访问
假如我们声明一个int [] arr = new int[10];
计算机给数组分配一个连续的存储单元,计算机通过地址来访问内存中的数据,假如分配的首地址是base_address
那么第i个元素的访问地址及内存地址就是
a[i] = base_address + i*data_type_size
所以访问的时间复杂度O(1)
2:插入和删除
为了保持内存数据的连续性,所以在插入和删除的时候,性能比较低。
如果在第一位插入数据,需要把所有的数据往后移动一位,然后把数据放在第一位。
所以插入的时间复杂度O(n)
如果在第一位删除数据,需要把所有的数据往前移动一位。
所删除入的时间复杂度O(n)
3:编程小技巧
1:插入操作
在第K为插入数据可以把第K位的数据放在最后一位,然后把要插入的数据放在第一位。
2:删除操作
多次操作一次执行,为了避免数据多次移动和搬移,我们每次删除的时候只记录数据已删除,当数组没有存储空间的时候,触发真正的删除操作。eg:JVM标记清除垃圾回收的算法核心思想。
3:数组越界
数组下标越界会导致寻址错误,系统bug。
4:Java中的数组容器类 ArrayList Arrays
优势:支持动态扩容
具体的方法:参考JDK文档手册
5:为什么数组下标从0开始
从0开始寻址:
a[i] = base_address + i*data_type_size
从1开始寻址:
a[i] = base_address + (i-1)*data_type_size
如上两个公式,从1开始比从0开始多一不减法运算。
历史原因:就是C语言是从0开始,后来的高级语言为了学习成本,效仿了C语言。
二位数组寻址 对于m*n的数组
a[i][i] = base_address +(i*n+j) ata_type_size