数据操作的时间复杂度主要由磁盘寻道所消耗的时间所决定,同时在磁盘中通过寻道查找相应数据所需要的时间又由数据在磁盘中的存储形式所影响。想要更加透彻的了解时间复杂度问题,就需要对磁盘的存储原理有一个清楚认识。所以推荐大家一片详细讲解磁盘原理的博客,非常nice!影响机械磁盘速度的因素:寻道时间、旋转延迟、数据传输时间
一、线性表
线性表分为顺序表和链表,顺序表是指数据在磁盘中存储在连续地址上,如数组;链表指数据在磁盘中存储地址不连续。顺序表进一步可分为有序和无序两种,即各数据是否遵循从小到大或从大到小的顺序依次存储。同理链表可分为有序和无序两种。有序顺序表又要根据各数据间是否存在固定的数学规律,如等差、等比,从而分为有规律及无规律两种。大致分类如下图:

分别对不同类型线性表进行“增删改查”操作时时间复杂度进行分析:
1、有序有规律线性表
设有如下数据按有序有规律线性表形式存储在磁盘中:
1 2 3 4 5 6 7 8 9
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
查:可通过首元素地址增加相应数量个数据单位大小,跳转到相应位置查询所需数据。例如首元素地址为12,查找数据6,则根据元素间数学规律得知数据6在首地址后第5个位置处,则直接寻址到地址(12+5)位置,即数据6所在地址位置为17。从而得出时间复杂度为O(1).
改:同“查”操作相似,在查找后将所在位置数据修改为相应值,时间复杂度为O(1),然后根据修改后数据的大小重新确定数据应在有序链表中所处的位置,并移动到相应位置,时间复杂度为O(n)。
删:通过“查”操作找到相应数据后删除,时间复杂度为O(1),删除位置后的数据依次前移1个数据单位,时间复杂度为O(n),则整个删除过程的时间复杂度为O(n).
增:增加操作首先要考虑线性表中是否还有闲余位置,如果没有则需要开辟更大空间的线性表,并将原表复制过去。将预定插入位置及之后的数据依次后移1个单位,将数据插入到指定位置,之后根据数学规律确定数据在表中应处位置并进行调整。总的时间复杂度为O(n)。
2、有序无规律线性表
设有如下数据按有序无规律线性表形式存储在磁盘中:
2 4 7 10 13 22 41 58
2 | 4 | 7 | 10 | 13 | 22 | 41 | 58 | ||||
查:通过二分法查找,时间复杂度为O(log2n)。
改:将数据插入到指定位置,之后根据二分法确定数据应处位置并进行调整,时间复杂度为O(log2n).
删:通过“查”操作找到相应数据后删除,时间复杂度为O(log2n),删除位置后的数据依次前移1个数据单位,时间复杂度为O(n),则整个删除过程的时间复杂度为O(n).
增:增加操作首先要考虑线性表中是否还有闲余位置,如果没有则需要开辟更大空间的线性表,并将原表复制过去。将预定插入位置及之后的数据依次后移1个单位,将数据插入到指定位置,之后通过二分法确定数据在表中应处位置并进行调整。总的时间复杂度为O(n)。
3、无序顺序表
设有如下数据按无序顺序表形式存储在磁盘中:
3 1 9 15 7 3 2 4
3 | 1 | 9 | 15 | 7 | 3 | 2 | 4 | ||||
查:通过循环遍历每一个元素查找,时间复杂度为O(n)。
改:同“查”操作相似,只要在查找后将所在位置数据修改为相应值,时间复杂度为O(n).
删:通过“查”操作找到相应数据后删除,时间复杂度为O(n),删除位置后的数据依次前移1个数据单位,时间复杂度为O(n),则整个删除过程的时间复杂度为O(n).
增:增加操作首先要考虑线性表中是否还有闲余位置,如果没有则需要开辟更大空间的线性表,并将原表复制过去。将指定位置及之后的元素依次后移1个数据单位,时间复杂度为O(n),然后在相应位置插入数据,整个增加过程的时间复杂度为O(n).
二、链表
1.有序链表
设有如下数据按有序链表形式存储在磁盘中:
2 4 6 11 15 22 61 95
4 | 11 | 15 | |||||||||
2 | 95 | 61 | |||||||||
6 | 22 |
查:通过循环遍历查找,时间复杂度为O(n)。
改:通过“查”操作,在查找后将所在位置数据修改为相应值,然后通过循环遍历找到新修改的数据在有序链表中应该的位置,并进行相应调整。时间复杂度为O(n).
删:通过“查”操作找到相应数据后删除,时间复杂度为O(n),使所删除的前一个数据的指针指向后一个数据,时间复杂度为O(1),则整个删除过程的时间复杂度为O(n).
增:通过循环遍历到相应位置,将元素插入此处,然后通过循环遍历找到新修改的数据在有序链表中应该的位置,并进行相应调整。时间复杂度为O(n).
2.无序链表
设有如下数据按有序链表形式存储在磁盘中:
23 12 61 11 15 9 61 33
12 | 15 | 33 | |||||||||
23 | 61 | ||||||||||
11 | 61 | 9 |
查:通过循环遍历查找,时间复杂度为O(n)。
改:通过“查”操作,在查找后将所在位置数据修改为相应值。时间复杂度为O(n).
删:通过“查”操作找到相应数据后删除,时间复杂度为O(n),使所删除的前一个数据的指针指向后一个数据,时间复杂度为O(1),则整个删除过程的时间复杂度为O(n).
增:通过循环遍历到相应位置,将元素插入此处。时间复杂度为O(n).
第一次撰写博客,有很多不足之处,敬请大佬们指正。