数据结构-数组、链表有序无须的时间复杂度分析

数组和链表是我们经常使用的数据结构,我们都知道数组的存储地址是连续的,链表的存储地址是不连续的,这就给我们的使用提供了多种选择。下面简单的分析一下数组和链表分别在有序和无须情况下的时间复杂度。

数组

1、有序数组的删除:数组的存储地址是连续的,我们删除数组中的某个值,首先我们要找到要删除的值,删除此值后,若此值后面还有其他值,每个值的都要向前移动一位,即索引减去1。

分析:在数组为有序的情况下,查找数组中的某个元素时,采二分法查找,每次排除一半的数据,时间复杂度为O(logn)。
而移动数组元素改变索引时间复杂度为O(n)。

所以有序数组的删除时间复杂度为O(n)+O(logn),即为O(n)级别。

若删除的数组元素为末尾一个,则时间复杂度为O(logn)。

2、有序数组的添加:有序数组的添加类似于有序数组的删除,先要找到添加的位置,然后要移动该元素后面的值。

分析:数组有序,采用二分查找,找到添加的位置,当然查找可以使用遍历查找,这里只是考虑时间复杂度最小的情况。然后移动插入位置后面元素的索引即可。

和有序数组的删除同理,时间复杂度为O(n)+O(logn),即为O(n)级别。

3、有序数组的修该:有序数组的修改,首先要找到要修改的值,然后还要保证数组的有序性。

分析:首先查找和上面的相同,采用二分查找,时间复杂度为O(logn),修改完数值之后还要进行移动数据,因为数组本身是有序的,不需要采用其他方法进行重新排序,进行移动数据即可,因此时间复杂度最小为O(n),当然采用其他方式也可以,时间复杂度会变大。

4、无序数组的增加:添加在数组末尾时,时间复杂度为O(1)。不添加在末尾时,添加了一个值时,会改变其他值的索引,所以时间复杂度为O(n)。

5、无序数组的删除:首先找到要删除的数据,时间复杂度为O(n),删除后要移动索引,时间复杂度为O(n),所以总的时间复杂度为O(n)+O(n)即O(n)级别。

6、无序数组的改动:找到要改动的值,直接修改即可,即查找的时间复杂度O(n)。

链表

1、有序链表的增加:因为链表的有序只是数值上的有序,地址上是不连续的,所以,有序链表的添加,在遍历一遍找到添加的位置即可。所以时间复杂度为遍历的时间复杂度O(n)。

2、有序链表的删除:原理和添加类似,在遍历查找删除节点的时候,可以把前后节点记录下来,删除后直接把前一个节点的指向指到后一节点即可。因此时间复杂度为O(n)。

3、有序链表的改动:有序链表的改动首先要遍历查找要插入的位置,平均查找次数为n/2,所以时间复杂度为O(n)级别。

4、无序链表:对于无序链表,链表本身的存储位置就不是连续的,各种操作只是查找操作存在时间复杂度。

而当在无序链表头部插入一个值时,只需要查找一次,因此时间复杂度为O(1)。其他操作均需要平均查找n/2次,因此时间复杂度为O(n)级别。

你可能感兴趣的:(数据结构)