数组定义
数组是一种线性表数据结构,用一块连续的内存空间,来存储相同类型的一组数据。
基本操作及实间复杂度
查找 时间复杂度O(1)
注:根据下标直接查找,时间复杂度O(1)
查找某元素是否在数组中(顺序查找时间复杂度O(n), 若数组有序,可使用二分查找O(logN))
插入 时间复杂度 O(n)
注:若不要求数组有序,可直接在末尾插入,时间复杂度O(1)
若是要在指定位置插入(但不要求有序),可以将插入位置的元素搬移到末尾,然后将要插入的元素插入到该位置,时间复杂度O(1)
若要求有序,需要将插入位置的元素都往后移一位,然后再插入元素,时间复杂度O(n)(最好O(1), 最坏O(n), 平均O(n))
删除 时间复杂度O(n)
若要删除第K个元素,为保证存储的连续性,需要搬移删除元素之后的数据,时间复杂度(最好O(1), 最坏O(n), 平均O(n))
优化:每次删除元素时,并不搬移,只是标记删除的元素,在没有剩余存储空间存储数据时,触发真正的删除操作。这样可以大大减少删除操作导致的数据搬移。(类似JVM的标记清除垃圾回收算法)
特点
优点:实现简单、效率高
缺点:大小固定,数组越界问题
注意事项
警惕数组的访问越界问题
数组越界在C语言中是一种未决行为,访问数组的本质就是访问一段连续的内存,只要通过偏移计算得到的内存是可用的,程序就不会报错,因此数组越界会导致莫名其妙的逻辑错误。
容器和数组使用场景总结
表示多维数据时,使用数组更加直观
数据大小已知,并且对数据的操作比较简单时,使用数组更方便
如果是业务开发,使用容器,省时省力
如果是底层开发,追求极致的效率,则选择使用数组
数组下标为什么是从0开始
如果是从1开始计数,计算内存地址的时候,会多出一个减法运算,增加CPU消耗
历史原因,保持和C语言语法一致