数据机构与算法学习(三)- 数组

数组的概念

数组(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语言中,只要不是访问受限的内存,所有的内存控件都是可以自由访问的。越界后会被执行到一块未定义的空间去执行操作,导致程序异常。

容器能否完全代替数组

对于业务开发,直接使用容器就足够了,省时省力。如果是做一些非常底层的开发,比如开发网络框架,性能要求做极致,这个时候数组就会优于容器。

原文地址:https://www.cnblogs.com/OneSky-Mi/p/14388179.html