顺序表的存储:由存储空间一段连续的地址组成,一边表现为数组,可以通过下标跟初始位置确定第i个元素的位置,因此顺序表的优点是便于查询数据。
链表:由存储空间内不连续的空间组成,每一个存储单元中除了存储所需数据,还存储下一个存储单元的位置,优点是方便扩充跟插入节点。
下边说一说顺序表(数组)跟链表的增删改查的时间复杂度:
数组:
1、有序数组:
添加数据:时间复杂度 :O(n)
原因:因为有序数组,我们查找时采用的是二分查找,时间复杂度O(log n),找到数据应该存放的位置后,将插入位置跟插入位置以后的数据统一后移一个单位,此时时间复杂度O(n),总的时间复杂度O(n)+O(log n)属于O(n)级别。
查找数据:时间复杂度 :O(log n)
原因:因为有序数组,我们查找时采用的是二分查找,时间复杂度O(log n),以2的指数级别缩减查找长度。
删除数据:时间复杂度 :O(n)
原因:因为有序数组,我们查找时采用的是二分查找需要删除的数据,时间复杂度O(log n),删除完成以后需要将删除位置后边的数据前移一个位置,时间复杂度O(n),总的时间复杂度O(n)+O(log n)属于O(n)级别。
修改数据:时间复杂度 :O(n)
原因:因为有序数组,我们将数据修改后,需要进行一次数据比较移动,因此时间复杂度属于O(n)级别
2、无序数组:
添加数据:当数组中还有空间时,时间复杂度 :O(1),当数组中无空间时,需要重新开辟空间,将以前的元素复制过来,时间复杂度 :O(n),
查找数据:时间复杂度 :O(n)
原因:因为数组无序,我们查找时时必须遍历整个数组,因此时间复杂度为O(n)。
删除数据:时间复杂度 :O(n)
原因:因为数组无序,我们必须遍历整个数组找到要删除的数据,时间复杂度为O(n),删除完成后还需要将删除位置后边的数据前移一个位置,时间复杂度O(n),总的时间复杂度为2O(n),属于O(n)级别。
修改数据:时间复杂度 :O(n)
原因:因为数组无序,我们必须遍历整个数组进行修改,因此时间复杂度为O(n)。
链表:
增加数据:链表有序时:O(n) ,无序时O(1)
原因:因为有序链表无二分查找一说,所以我们需要遍历整个链表去找到插入位置,无需链表只需要在表头或者表尾添加数据即可。
删除数据:O(n)
原因:我们需要遍历整个链表去查找需要删除的数据。
修改数据:O(n)
原因:我们需要遍历整个链表去查找需要修改的数据。
查找数据:O(n)
原因:我们需要遍历整个链表去查找需要的数据。链表有序无序对查找数据的时间复杂度级别不影响,因为有序无序都需要遍历一遍链表,但是相对于无序,有序还是更快一点的,毕竟不需要遍历完链表,比遍历完边表肯定要快。