数据结构与算法:时间复杂度

文章详细解释了时间复杂度的概念,它是描述算法运行时间与输入数据之间关系的函数。在估算时间复杂度时,通常忽略低阶项和首项系数,采用大O符号表示。文章提到了几种典型情况的时间复杂度,如最好情况、平均情况和最坏情况,并通过实例分析了二分查找和斐波那契数列的递归算法的时间复杂度。
摘要由CSDN通过智能技术生成

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

srhqwe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值