时间复杂度:算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
简单的说,就是计算函数执行的次数.
上述说,说时间复杂度是函数,就是把执行的次数写成函数,设F(N)为辅助函数
则F(N)就是循环执行的次数,那么F(N)=N^2+2N+10
上述说不包括这个函数的低阶项和首项系数
那么也就是很像高数学极限时的抓大头
得到了F(N)=N^2
上述还说时间复杂度常用大O符号表述
O表示估算,并不是一个精确的算法
则时间复杂度就为O(N^2)
以上是省略低阶项,下面则是省略首项系数
根据上述,次函数的时间复杂度就是F(N) = 2N+10
如果正常抓大头就是F(N) = 2N
但是这里因为2是N的系数,当N无限大的时候2和N在同一级别
上述说不包括这个函数的低阶项和首项系数
所以时间复杂度就是O(N)
这里F(N) = 100
时间复杂度既不是O(100)也不是O(0),而是O(1)
当代码运行常数次时,都用O(1)表示
注意的是:" O(1)并不表示代码运行一次,而是代码运行常数次 "
在计算时间复杂度的时候可能有不同情况的时候,比如,在代码的功能是,在字符串中寻找某个字符,此时如果没有规律需要一个一个去找,就很难说在某一次找到这个字符,那么这样的话,时间复杂度就不知道应该是多少,所以出现了一下三种情况
最好情况、平均情况、最坏情况。
最好情况:代码执行最少的次数。(下限) F(N)=1 O(1)
平均情况:最好和最好情况的中和。 F(N) = N/2 O(N)
最坏情况:代码执行最多的次数。(上限) F(N) = N O(N)
正常情况下都是取最坏情况作为代码的时间复杂度,一些特别的代码会使用平均情况,但是这样的代码往往很复杂
如果看代码做题很难得到明确的时间复杂度函数,不能只看代码,要从代码本身的含义去推导
计算二分查找的时间复杂度
最好情况就是第一次就找到O(1)
上面说计算时间复杂度需要计算最坏的情况
在这里,N是数组的元素的个数,一直/2/2/2/2...就会得到一个唯一的数,即是需要找到的数
这样/2的次数就是代码执行的次数,如此就得到一个式子,设X为代码执行次数,N/2^X = 1
这样N=2^X
所以X=log2N
得到时间复杂度为O(log2N)
这是递归的时间复杂度题
递归执行的次数就是时间复杂度
N一直-1直到0,其间一直被调用,每-1就调用一次,所以这里的时间复杂度是O(N)
这是计算递归斐波那契数列的时间复杂度,右边画的树状图与二叉树很
每一次递归就会带动两次递归
所以如图,每次调用函数相当于同时递归的下次递归再*2,所以执行完的最后一次递归连带的同时递归的总和2^(n-1)
所以这是一个等比数列q=2
(学过fib函数的都知道,其中含有时间复杂度差值,但是这个差值对于N无穷大时也毫无意义,所以可以忽略)
根据等比数列求和公式,S=a1*(1-q^n)/(1-q) = 1*[1-2^(n-1)]/(1-2) = 2^(n-1) - 1
所以时间复杂度为O(2^n)
补充:递归的时间复杂度算法:递归次数*每次递归调用的次数
拿fib数列举例
递归次数:递归发生的次数,再这里就是 2^(n-1) - 1
每次递归调用的次数:一次递归里面,有多少次其他的调用,比如递归里面的循环等等
如果有错,希望纠错,谢谢!!!