线性表:数组、链表、栈、队列
线性表:数组 链表 栈 队列 。 线性表上的数据最多只有前和后两个方像)
非线性表:树、图
数组
如何实现随机访问?
数组是一种线性数据结构,用连续的存储空间存储相同类型数据。
所以数组可以随机访问,但对数组进行删除插入,为了保证数组的连续性,就要做大量的数据搬移工作。
数组如何实现下标随机访问
计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据
// 一维数组
a[i]_address = base_address + i * data_type_size
//二维数组
a[i][j]_address = base_address + ( i * n + j) * data_type_size
纠正数组的错误认识
数组的查找操作时间复杂度并不是O(1)。即便是排好的数组,用二分查找,时间复杂度也是O(logn)。
正确表述:数组支持随机访问,根据下标随机访问的时间复杂度为O(1)H2~O
低效的插入和删除
- 插入 删除:从最好O(1) 最坏O(n) 平均O(n)
- 插入时。
如果数组中的数据是有序的,我们在某个位置插入一个新的元素时,那所有的数据都需要依次往后移动一位。
如果数组中的数据是无序的,数组只是被当作一个存储数据的集合,直接将第 k 位的数据搬移到数组元素的最后,把新的元素直接放入第 k 个位置。 - 多次删除集中在一起,提高删除效率
记录下已经被删除的数据,每次的删除操作并不是搬移数据,只是记录数据已经被删除,当数组没有更多的存储空间时,再触发一次真正的删除操作。即JVM标记清除垃圾回收算法。