当前位置:   article > 正文

数据结构与算法:时间复杂度_时间复杂度是一个具体的数值吗

时间复杂度是一个具体的数值吗

时间复杂度:算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大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

每次递归调用的次数:一次递归里面,有多少次其他的调用,比如递归里面的循环等等

如果有错,希望纠错,谢谢!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/169327
推荐阅读
相关标签
  

闽ICP备14008679号