Daily Leetcode-0 算法复杂度

Daily Leetcode-0 算法复杂度

这里有一篇很棒的CSDN文章《算法的时间复杂度和空间复杂度-总结》
为了方便自己日后查阅,在这里做一个更简要总结。

事后估计的方法有两个缺陷:

  1. 要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行;
  2. 所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。

1. 时间复杂度

1.1 时间复杂度的定义

时间频度:一个算法执行所耗费的时间。从理论上这是不能算出来的,必须上机运行测试才能知道。

时间复杂度是为了了解时间频度 T ( n ) T(n) T(n)的变化规律而引入的概念。
时间复杂度 O ( f ( n ) ) O(f(n)) O(f(n))的定义:

一般情况下,算法中基本操作重复执行的次数是问题规模 n n n的某个函数,用 T ( n ) T(n) T(n)表示。若有某个辅助函数 f ( n ) f(n) f(n),使得当 n n n趋近于无穷大时, T ( n ) / f ( n ) T(n)/f(n) T(n)/f(n)的极限值为不等于零的常数,则称f(n)是 T ( n ) T(n) T(n)的同数量级函数,记作 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=(f(n)),称 O ( f ( n ) ) O(f(n)) (f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

在这里插入图片描述
图源

常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

Ο(log2n)、Ο(n)、 Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者(即多项式时间复杂度的算法)是有效算法,把这类问题称为 P ( P o l y n o m i a l , 多 项 式 ) 类 问 题 \color{red}{P(Polynomial,多项式)类问题} PPolynomial,,而把后者(即指数时间复杂度的算法)称为 N P ( N o n − D e t e r m i n i s t i c P o l y n o m i a l , 非 确 定 多 项 式 ) 问 题 \color{red}{NP(Non-Deterministic Polynomial, 非确定多项式)问题} NPNonDeterministicPolynomial,

1.2 计算时间复杂度的基本流程

  1. 找出算法中的基本语句;
  2. 计算基本语句的执行次数的数量级;
  3. 用大Ο记号表示算法的时间性能。

简化程序分析的法则:

  1. 对于一些简单的输入输出语句或赋值语句,近似认为需要O(1)时间
  2. 对于顺序结构,需要依次执行一系列语句所用的时间可采用大O下"加法法则"
  3. 对于选择结构,如if语句,它的主要时间耗费是在执行then字句或else字句所用的时间,需注意的是检验条件也需要O(1)时间
  4. 对于循环结构,循环语句的运行时间主要体现在多次迭代中执行循环体以及检验循环条件的时间耗费,一般可用大O下"乘法法则"
    对于复杂的算法,可以将它分成几个容易估算的部分,然后利用加法法则和乘法法则技术整个算法的时间复杂度

我们注意到有两个核心法则:算法复杂度计算的 加 法 法 则 \color{red}{加法法则} 乘 法 法 则 \color{red}{乘法法则}

加 法 法 则 \color{red}{加法法则} :是指若算法的2个部分时间复杂度分别为 T 1 ( n ) = O ( f ( n ) ) T1(n)=O(f(n)) T1(n)=O(f(n)) T 2 ( n ) = O ( g ( n ) ) T2(n)=O(g(n)) T2(n)=O(g(n)),则 T 1 ( n ) + T 2 ( n ) = O ( m a x ( f ( n ) , g ( n ) ) ) T1(n)+T2(n)=O(max(f(n), g(n))) T1(n)+T2(n)=O(max(f(n),g(n)))
特别地,若 T 1 ( m ) = O ( f ( m ) ) T1(m)=O(f(m)) T1(m)=O(f(m)) T 2 ( n ) = O ( g ( n ) ) T2(n)=O(g(n)) T2(n)=O(g(n)),则 T 1 ( m ) + T 2 ( n ) = O ( f ( m ) + g ( n ) ) T1(m)+T2(n)=O(f(m) + g(n)) T1(m)+T2(n)=O(f(m)+g(n))
乘 法 法 则 \color{red}{乘法法则} :是指若算法的2个部分时间复杂度分别为 T 1 ( n ) = O ( f ( n ) ) T1(n)=O(f(n)) T1(n)=O(f(n)) T 2 ( n ) = O ( g ( n ) ) T2(n)=O(g(n)) T2(n)=O(g(n)),则 T 1 ∗ T 2 = O ( f ( n ) ∗ g ( n ) ) T1*T2=O(f(n)*g(n)) T1T2=O(f(n)g(n))

1.3 计算时间复杂度的示例

以2个特殊的时间复杂度形式为例:

  1. O ( l o g 2 n ) O(log_2n) O(log2n)
i=1;while i<=n:
	i=i*2;

语句1的频度是 1 1 1
设语句2的频度是f(n), 则: 2 f ( n ) ≤ n ; f ( n ) ≤ l o g 2 n 2^f(n)\leq n;f(n)\leq log_2n 2f(n)n;f(n)log2n
取最大值 f ( n ) = l o g 2 n f(n)=log_2n f(n)=log2n
T ( n ) = O ( l o g 2 n ) T(n)=O(log_2n) T(n)=O(log2n)

  1. O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
    归并排序,快速排序等的时间复杂度都是 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)
    一个最简单的例子:
i=1
j=1       
while j<=n:
	j+=1
	while i<=n:
		i=i*2;	

在这里插入图片描述
图源

2. 空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。

类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值