概念:数组是一种线性表数据结构,用一组连续的内容空间,来存储一组具有相同类型的数据。
1. 了解线性表(每个数据最多只有一个前驱和后继节点,eg数组、链表、队列、栈等)和非线性表(eq 树、堆、图)
2. 连续的内存空间和相同数据类型的数据,这两点使得数组可以实现随机访问
操作:
随机访问:根据下标随机访问的时间复杂度为O(1),根据数组的示意图,可知根据下标即可知道该元素的地址,具体计算公式为num[index]_addr = base_addr + data_type_size * index
插入:在确保数组有空间的情况下进行插入:
1. 如果确保原数组的顺序,在某个位置K插入某个数,需要把插入位置K以及以后的数据移动,平均复杂度为O(n)
2. 如果对原数组数据顺序没有要求,直接在最后位置插入一个数,然后和第K个的数进行调换即可,时间复杂度为O(1)
删除:删除数据,数据需要向前运动,平均时间复杂度为O(n)
1. 删除最后一个元素,时间复杂度为O(1)
2. 删除第一个元素,时间复杂度为O(n)
3. 如果有多次删除操作,可以考虑合并提高效率
注意点:
1. 数据的越界问题,数组下标从0开始,下标取值范围[0,1,2,...len-1]
2.多维数组
3. 学习高级语言的容器,对数组的封装以及动态的扩容,Java的arraylist,C++的Vector
常考面试题:
1. 数组的查找最大值、最小值、给定值、重复值
2. 数组的排序、快排、归并排序等
3. 多个数组的排序、合并、求交集、求并集
常见的优化方向:
1. 如果数组有序,可以考虑二分法用于优化
2. 如果数组无序,通常使用Hash帮助统计