【算法设计与分析】算法的时间复杂度(介绍O渐近上界,Ω渐近下界,θ准确的界)

什么是时间复杂度?

我们先看看一些函数的渐近表达式:
在这里插入图片描述
关于时间复杂度的基本要点

  1. 时间复杂度反映的是随着问题规模的变大,计算所需的时间的增长速度,与系数的多少关系不大

  2. 算法的渐近时间复杂度,简称时间复杂度,很多时候为了便于理解,直接把时间复杂度等同于O()是可以的。

  3. 常见的时间复杂度,及其增长速度比较:

    O ( 1 ) < O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < O ( 2 n ) < O ( n ! ) < O ( n n ) O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2 )<O(n^3)< O(2^n)<O(n!)<O(n^n) O(1)O(log2n)O(n)O(nlog2n)O(n2)<O(n3)<O(2n)O(n!)O(nn)

可以这么说,看到这里就已经基本掌握时间复杂度的概念了,对于分析常见时间复杂度问题是没问题的

当然,若想深入了解这块知识,请参考课本及其他博客,并耐心地看完下面的内容


定义及例子

(阅读时请结合例子理解)

一、大O记号(渐近上界记号)

定义1-1

设函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在两个正常数c和n0,使得当n≥n0时,有f(n)≤cg(n),则记做f(n) = O(g(n)),称为大O记号(big Oh notation) 称g(n)是f(n)的一个上界 注: f(n)的阶不高于g(n)

例1-1 f(n) = 2n + 3 = O(n)
当n≥3时,2n+3≤3n,

所以,可选c = 3,n0 = 3。对于n≥n0,f(n) = 2n + 3≤3n,

所以, f(n) = O(n) 。这意味着,当n≥3时,该程序步不会超过3n。


例1-2 f(n) = 10n2 + 4n + 2 = O(n2)
对于n≥2时,有10n2 + 4n + 2≤10n2 + 5n,

并且当n≥5时,5n≤n2, 因此,可选c = 11, n0 = 5;

对于n≥n0,f(n) = 10n2 + 4n + 2≤11n2, 所以f(n) = O(n2)。


例1-3 10n2 + 9 !=O(n)
使用反证法,假定存在c和n0,使得对于n≥n0,10n2 + 9≤cn始终成立,

那么有10n + 9/n≤c,即n≤c/10 - 9/(10n)总成立。

但此不等式不可能总成立,取n = c/10 + 1时,该不等式便不再成立。


重要定理

在这里插入图片描述

渐近时间复杂度

使用大O记号及下面定义的几种渐近表示法表示的算法时间复杂度,

称为算法的渐近时间复杂度(asymptotic complexity),简称时间复杂度

适当选择关键操作,算法的渐近时间复杂度可以由关键操作的执行次数之和来计算

一般地,关键操作的执行次数与问题的规模有关,是n的函数

【程序1-4】 矩阵乘法
for(i=0; i<n; i++//n+1
   for(j=0; j<n; j++{                           		//n(n+1)
       c[i][j]=0;                                       //n2
       for(k=0; k<n; k++//n2(n+1)
             c[i][j]+=a[i][k]*b[k][j];                  //n3
   }

总的时间: n 3 + n 2 ( n + 1 ) + n 2 + n ( n + 1 ) + n + 1 = 2 n 3 + 3 n 2 + 2 n + 1 n^3+ n^2(n+1)+ n^2+ n(n+1)+ n+1 =2n^3+3n^2+2n+1 n3+n2(n+1)+n2+n(n+1)+n+1=2n3+3n2+2n+1
渐进时间复杂度: O ( n 3 ) O(n^3) O(n3)


大O运算规则:

(1) O(f)+O(g)=O(max(f, g))
(2) O(f)+O(g)=O(f+g)
(3) O(f)O(g)=O(fg)
(4) 如果g(N)=O(f(N)), 则O(f)+O(g)=O(f)
(5) O(Cf(N))=O(f(N)), 其中C是一个正常数
(6) f=O(f)


二、Ω记号(渐近下界记号)

定义2-2

设有函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在两个正常数 c和n0,使得当n≥n0时,有f(n)≥c g(n),则记做f(n) = Ω (g(n)),称为Ω记号(omega notation)。 注: f(n)的阶不低于g(n)
(Ω的相关概念实际上就是O(n)颠倒过来)

例1-5 f(n) = 2n + 3 =Ω(n)
对所有n,2n+3≥2n,可选c = 2,n0=0。

对于n≥n0,f(n) = 2n+3≥2n,所以,f(n) = Ω(n),即2n + 3∈Ω(n)。


例1-6 f(n) = 10n2 + 4n + 2 = Ω(n2)
对所有n,10n2 + 4n + 2≥10n2,可选c = 10,n0 = 0。

对于n≥n0,f(n) = 10n2 + 4n + 2≥10n2,所以,f(n) =Ω(n^2)。


重要定理

在这里插入图片描述


三、 θ记号(紧渐近界记号)

定义1-3

设有函数f(n)和g(n)是定义在非负整数集合上的正函数,如果存在正常数c1,c2和n0,使得当n≥n0时,有c1 g(n)≤f(n)≤c2 g(n),则记做f(n) = θ(g(n)),称为θ记号(Theta notation)。 注:此时f(n)和g(n)同阶

例1-7 f(n) = 2n + 3 = θ(n)
例1-8 f(n) = 10n2 + 4n + 2 = θ(n^2)


四、算法按时间复杂度分类

多项式时间算法

凡渐近时间复杂度有多项式时间限界的算法称做多项式时间算法(polynomial time algorithm)

O ( 1 ) < O ( l o g n ) < O ( n ) < O ( n l o g n ) < O ( n 2 ) < O ( n 3 ) O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(n^3) O(1)O(logn)O(n)O(nlogn)O(n2)O(n3)

指数时间算法

渐近时间复杂度为指数函数限界的算法称做指数时间算法(exponential time algorithm)

O ( 2 n ) < O ( n ! ) < O ( n n ) O(2^n)<O(n!)<O(n^n) O(2n)O(n!)O(nn)

时间复杂度增长示意图

在这里插入图片描述

判断时间复杂度是否为准确值相关定理
  1. 如果存在正常数n0, 使得当n≥n0时有f(n)>0, g(n)>0
    并且 lim ⁡ n → ∞ f ( n ) g ( n ) = 0 \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=0 nlimg(n)f(n)=0,则f(n)=O(g(n))

  2. 如果存在正常数n0, 使得当n≥n0时有f(n)>0, g(n)>0
    并且 lim ⁡ n → ∞ f ( n ) g ( n ) = c \lim\limits_{n\to\infty}\frac{f(n)}{g(n)}=c nlimg(n)f(n)=c,则f(n)=θ(g(n))

书上相关例题参考答案:

在这里插入图片描述

转载

传送门

  • 24
    点赞
  • 168
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 凸优化是一类重要的数学优化问题,它具有许多实际应用价值。MATLAB是一种常用的科学计算和数据分析软件工具,提供了丰富的优化算法函数库,可以用于解决凸优化问题。 MATLAB中凸优化算法的实现有两种常用方式:内置函数和自定义算法。 首先,MATLAB提供了内置的凸优化函数,例如fmincon、linprog和quadprog等,这些函数能够很方便地求解一般的凸优化问题。用户只需要根据具体问题设定目标函数、约束条件和变量的上下界,然后调用相应的函数即可获得最优解。 其次,对于特定的凸优化问题,可以自定义算法进行求解。MATLAB中常用的凸优化算法有:梯度下降法、共轭梯度法、牛顿法、内点法等。这些算法通常需要根据实际问题进行调整和优化,比如设置步长、迭代次数等参数。 在使用MATLAB进行凸优化算法时,需要注意以下几点: 1. 确定优化问题的目标函数、约束条件和变量范围; 2. 选择合适的凸优化算法,例如使用fmincon函数求解约束优化问题; 3. 检查算法的收敛性和精度,确保求解结果的正确性; 4. 对于大规模的凸优化问题,可能需要考虑分布式计算、并行计算等技术,以提高求解效率。 总之,MATLAB提供了丰富的凸优化算法函数库,能够很方便地用于求解凸优化问题。根据具体问题的特点和求解需求,可以选择合适的内置函数或自定义算法进行求解。 ### 回答2: 凸优化是指在给定约束条件下,寻找目标函数的最小值的问题。这类问题的特点是约束条件是线性的,目标函数是凸函数。在数学和工程领域有着广泛的应用,如经济学、运筹学、信号处理等。 Matlab中提供了多种凸优化算法的工具箱,如CVX、YALMIP等。这些工具箱可以方便地调用已经实现好的算法,简化了凸优化问题的建模和求解过程。 在使用Matlab进行凸优化算法时,首先需要用数学语言描述问题,包括目标函数和约束条件。然后,利用工具箱提供的函数进行建模。根据问题的特点选择合适的凸优化算法,如内点法、梯度法等。最后,使用相关的函数进行求解,并得到问题的最优解。 凸优化算法的核心是迭代求解过程,即利用当前解来生成下一个解。迭代的终止条件可以是达到一定的精度要求或经过固定次数的迭代。每次迭代中,根据当前解计算目标函数和约束条件的梯度,并更新解,直到满足终止条件为止。 凸优化算法的性能和求解效率与问题的规模和复杂度有关。通常情况下,凸优化问题可以在多项式时间内求解。但对于大规模和复杂的问题,可能需要使用更高级的算法或使用分布式计算平台进行求解。 总之,凸优化算法是求解目标函数最小值的有力工具,Matlab提供了丰富的函数和工具箱来支持凸优化问题的建模和求解,使得复杂问题的求解更加简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值