走进数据结构和算法(c++版)(1)——算法时间复杂度

本文介绍了算法的时间复杂度概念及其重要性,详细解释了常见的时间复杂度类型,如O(1)、O(logn)、O(n)等,并通过实例展示了如何计算不同算法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法时间复杂度

  要判断算法的好坏,可以从时间方面进行分析。算法运行的越快,所用的时间越短则算法越好。但是同一个算法在不同的平台上的运行时间不同。那么又该如何进行评判呢?我们采用时间复杂度进行衡量。

算法时间复杂度定义
  在进行算法分析时, 语句总的执行次数$ T ( n )是关于问题规模是关于问题规模 n的函数,进而分析的函数,进而分析 T ( n )随随 n的变化情况并确定的变化情况并确定 T ( n )的数量。算法的时间复杂度。也就是算法的时间量度,记做:的数量。算法的时间复杂度。也就是算法的时间量度,记做: T ( n )=O(f(n))。它表示随问题规模。它表示随问题规模 n的增大,算法执行时间的增长率和的增大,算法执行时间的增长率和 f ( n )的增长率相同,称作算法的∗∗渐近时间复杂度∗∗,简称为∗∗时间复杂度∗∗。其中的增长率相同,称作算法的**渐近时间复杂度**,简称为**时间复杂度**。 其中 f ( n )是问题规模是问题规模 n$的某个函数。

  简单的理解时间复杂度就是用来表示执行次数$ T ( n )随问题规模随问题规模 n增加的变化趋势。∗∗一般情况下,随着增加的变化趋势。**一般情况下,随着 n的增大,的增大, T ( n )$增长最慢的算法为最优算法。**

  那么如何分析一个算法的时间复杂度呢?步骤如下:

  1. 用常数 1 取代运行时间中的所有加法常数。
  2. 再修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是 1 ,则去除与这个项相乘的常数。

时间复杂度O(1)O(1)O(1)

int a=1,b=3,sum=0;//执行1次
sum=a+b;//执行1次
cout<<"sum="<<sum<<endl;//执行1次

时间复杂度O(n)O(n)O(n)

for(int i = 0; i < n; i++)//执行n次
{
    cout<<i<<endl;
}   

时间复杂度O(n2)O(n^2)O(n2)

for(int i = 0; i < n; i++)//执行n^2次
{
    for(int j = 0; j < n; j++)
    {
        cout<<i<<endl;
    }
}   

  综上,我们可以看出,若每层嵌套的时间复杂度为O(n)O(n)O(n),则nnn层嵌套的时间复杂度为O(nn)O(n^n)O(nn)

时间复杂度O(logn)O(logn)O(logn)

int i=1;
while(i<n)
{
	i=i*2;
}

  由于每次执行i乘以2,当2x&lt;n2^x&lt;n2x<n时结束循环。所以总共执行了x=log2nx=log_2nx=log2n次,所以其时间复杂度为O(logn)O(logn)O(logn)

   常用的时间复杂度所耗费的时间从小到大依次是:
O(1)&lt;O(logn)&lt;O(n)&lt;O(nlogn)&lt;O(n2)&lt;O(n3)&lt;O(2n)&lt;O(n!)&lt;O(nn)O(1)&lt;O(logn)&lt;O(n)&lt;O(nlogn)&lt;O(n^2)&lt;O(n^3)&lt;O(2^n)&lt;O(n!)&lt;O(n^n)O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

最坏情况

  最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。一般在没有特殊说明的情况下,都是指最坏时间复杂度。

平均情况

  平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。

递归算法的时间复杂度求解

  递归算法的时间复杂度的求解方法有很多,我们这里介绍一个比较常用的求解方法——主方法。
  对于递归式:
T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n)

  其中a≥1a≥1a1b&gt;1b&gt;1b>1是常数,f(n)f(n)f(n)是渐近正函数。

  1. 若对某个常数ε&gt;0ε&gt;0ε>0,有f(n)=O(n(logba)−ε)f(n)=O(n^{(log_ba)-ε})f(n)=O(n(logba)ε),则T(n)=Θ(nlogba)T(n)=\Theta (n^{log_ba})T(n)=Θ(nlogba)
  2. f(n)=Θ(nlogba)f(n)=\Theta (n^{log_ba})f(n)=Θ(nlogba),则T(n)=Θ(nlogbalgn)T(n)=\Theta (n^{log_ba}lgn)T(n)=Θ(nlogbalgn)
  3. 若对某个常数ε&gt;0ε&gt;0ε>0,有f(n)=Ω(n(logba)+ε)f(n)=\Omega (n^{(log_ba)+ε})f(n)=Ω(n(logba)+ε),且对于某个常数c&lt;1c&lt;1c<1和所有足够大的nnn有$af(n/b)≤cf(n) ,则,则T(n)=\Theta (f(n))$

  举个栗子:T(n)=4T(n/2)+nT(n)=4T(n/2)+nT(n)=4T(n/2)+n,其中a=4,b=2a=4,b=2a=4,b=2,logba=2log_ba=2logba=2。当ε=1ε=1ε=1,有O(n(logba)−ε)=O(n(log24)−1)=O(n)O(n^{(log_ba)-ε})=O(n^{(log_24)-1})=O(n)O(n(logba)ε)=O(n(log24)1)=O(n)。符合第一种情况所以T(n)=Θ(n2)T(n)=\Theta (n^{2})T(n)=Θ(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不放弃的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值