数组的概念
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
根据定义里边的关键词详解数组定义。
第一是线性表。 线性表就是数据拍成像一条线一样的结构。每个线性表上的而数据最多只有前和后两个方向。第二个是连续的内存控件和相同类型的数据。
因为有这两个特点,才有了一个堪称“杀手锏”的特性:“随机访问”。也导致了低效插入和删除操作。
数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。
插入操作
假设数组的长度是n,现在,如果我们需要将一个数据插入到数组中的第K个位置。为了把第K个位置腾出来,给新来的数据,我们需要将第K~N这部分的元素都顺序地往后挪一位。最好是在末尾插入O(1),坏在开头插入O(n),平均时间复杂度为O(n).
优化方法,假设数组中存储的数据没有规律只是一个存储集合。那么可以将K位置的数移动到数组的最后,将新数据插入K的位置,这样的话,插入为O(1).
删除操作
和插入类似需要搬移数据,最好是在末尾删除O(1),坏在开头删除O(n),平均时间复杂度为O(n).
优化方法,再删除数据后不进行真正的删除,只是标记数据,到数组空间不够用时,在执行一次删除操作。
警惕数组越界
在C语言中,只要不是访问受限的内存,所有的内存控件都是可以自由访问的。越界后会被执行到一块未定义的空间去执行操作,导致程序异常。
容器能否完全代替数组
对于业务开发,直接使用容器就足够了,省时省力。如果是做一些非常底层的开发,比如开发网络框架,性能要求做极致,这个时候数组就会优于容器。