详细告诉你为什么它、它、它的时间复杂度是O(1)、O(n)、O(logn)、O(n^2),算法时间复杂度理解

时间复杂度是一个理解比较难的问题,网上有很多讲解,但都不详细,一般都是举个例子,然后告诉你,这个的时间复杂度是多少多少。例如告诉你冒泡排序的时间复杂度是O(n^2),然后就没然后了。这可难坏了初学不懂时间复杂度的人。喂!我可不是要知道这个例子的时间复杂度到底多少,我是想知道它的时间复杂度为什么是这个的啊而不是想知道答案而已,你给我个鱼竿,告诉我能钓鱼,却不告诉我怎么钓鱼,还不是要饿死我,而且更让我难受了。

俗话说,授人以鱼不如授人以渔。现在,为了解决大家的痛点,我详细讲讲时间复杂度,带来例子,并详明它的时间复杂度为什么是这个答案。

注意!时间复杂度不是单纯的耗时,而是指耗时与数据增长量之间的关系(一般可以套用耗时x数量增长量),我搜了下,竟然有“时间复杂度为O(1)就是耗时1秒,查找10000次时间复杂度O(n)就是耗时10000秒”这样扯淡的说法

时间复杂度O(1)理解:
这个很简单,一般的简单操作就是O(1),像"int n = 1;"这样单步骤的(我称之为元操作)。这个不需要多讲。
一般来说,像执行查找的时候,像HashMap这样通过contains()方法查找HashCode直接可以查找出某个值的操作,其时间复杂度也是O(1).

时间复杂度O(n)理解:
这里用使用contains()方法使用查找List集合里面的某个元素来举例。List是有序表,不能直接一次性查找到。比如从{12,23,45,··· ···,76,32}里面查找76,要从12开始查找,一次次循环查找,直到查到76并返回。这里每次的查找时间复杂度为O(1),需要查找N次才能查到76,则时间复杂度可以看作是N * O(1)=O(n)。注意,这里的n不是具体的数值N,不要以为查询了100次就是O(100),这是错的,这里只是为了方便理解(前面说了,时间复杂度并不是单指耗时,下同)。

时间复杂度O(logn)理解:
一般的查找都是O(n),但是如果通过算法,可以使查找的时间复杂度降低,比如二分查找。像上面解释O(n)的例子中,采用二分查找的话,是不是就是个log(O(n))的对数数学模型,所以其时间复杂度为O(logn)。

时间复杂度O(n^2)理解:
这里拿冒泡排序对某个数组进行有序排序举例。在冒泡排序中,分为获取值、对该值进行排序、重复取值排序三个步骤。其中取值时间复杂度为O(1),则在N个数中进行该值的比较排序,则为N*O(1)=O(n)时间复杂度。这时候还没有获取到有序数组,必须对这N个数重复进行取值、排序,执行N次,故时间复杂度为N * N * O(1)=O(n^2)。

常用排序方式的复杂度(图片来自网络):

各种时间复杂度下随操作量级N增长耗时,从中可以知道二分查找的魅力(图片来自网络):

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_43410022/article/details/85997981
今日推荐