算法笔记系列|数组

150 阅读2分钟

随机访问

  1. 数组是一种线性数据结构,用连续的存储空间存储相同类型数据

  2. 线性表:数组、链表、队列、栈 非线性表:树 图

  3. 数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)

    ⚠️数组只在已知下标的情况下查找方便,时间复杂度为 O(1);即便是排好序的数组,你用二分查找,时间复杂度也是 O(logn);

插入

正常情况复杂度为O(n)

一个降低插入时间复杂度的方法

当不要求保持数组顺序时,可以直接将第 k 位的数据搬移到数组元素的最后,把新的元素直接放入第 k 个位置。

删除

最好情况时间复杂度为 O(1)(删除最后一个);

则最坏情况时间复杂度为 O(n)(如果删除开头的数据)

平均情况时间复杂度也为 O(n)。

已经降低删除时间复杂度的方法

我们可以先记录下已经删除的数据。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

数组越界

我们知道,在 C 语言中,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。根据我们前面讲的数组寻址公式,a[3]也会被定位到某块不属于数组的内存地址上,而这个地址正好是存储变量 i 的内存地址,那么 a[3]=0 就相当于 i=0,所以就会导致代码无限循环。

数组越界在 C 语言中是一种未决行为,并没有规定数组访问越界时编译器应该如何处理。因为,访问数组的本质就是访问一段连续内存,只要数组通过偏移计算得到的内存地址是可用的,那么程序就可能不会报任何错误。