【算法】复杂度理论 ( 时间复杂度 )

举报
韩曙亮 发表于 2022/01/14 01:16:40 2022/01/14
【摘要】 文章目录 一、复杂度理论二、时间复杂度1、P 与 NP 问题2、O 表示的复杂度情况3、时间复杂度取值规则4、时间复杂度对比 一、复杂度理论 时间复杂度 : 描...





一、复杂度理论



时间复杂度 : 描述一个算法执行的大概效率 ; 面试重点考察 ; 面试时对时间复杂度都有指定的要求 , 蛮力算法一般都会挂掉 ;

空间复杂度 : 程序执行过程中 , 所耗费的额外空间 ; 面试考察较少 , 程序中使用的空间 , 看变量的定义就可以知道大概数量 ;

编程复杂度 : 代码可读性是否高 , 是否容易看懂 ; 写代码时的难度不高 , 别人读代码时的难度也不高 ; 如果写的时候经过长时间斟酌 , 那么可读性估计会很差 ;
如 : 字符串查找 ,
使用 蛮力算法 , 编程复杂度很低 , 很容易看懂 , 但是其时间复杂度是 O ( m × n ) O(m \times n) O(m×n) ;
如果使用 Rabin-Karp 算法 , 时间复杂度是 O ( m + n ) O(m + n) O(m+n) , 但是编程复杂度很高 , 实现了哈希算法 , 很难看懂 ;

思维复杂度 : 是否容易想得出 ; 算法的原理是否容易理解 ;
算法是否容易理解 ;
字符串查找 KMP 的算法就很难理解 , 即使把代码展示出来 , 将原理说明 , 也是很难理解的 ;


一般 蛮力算法 时间复杂度 很高 , 但是 编程复杂度 和 思维复杂度 很低 , 代码容易理解 ;
如果对 时间复杂度 要求很高 , 如必须达到 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) 要求 , 则必须使用复杂的算法 , 双指针 , 动态规划 , KMP 等 , 代码会写几百行 , 很难理解 ;
二者之间需要综合考虑 , 相互作出一些妥协 ;





二、时间复杂度




1、P 与 NP 问题


P 问题 ( Polynomial ) , 是有效算法的集合 , 都可以在多项式时间内完成计算 , 其 时间复杂度都是多项式 ,

时间复杂度都是 O ( n ) O(n) O(n) , O ( n 2 ) O(n^2) O(n2) , O ( n 3 ) O(n^3) O(n3) , O ( m + n ) O(m + n) O(m+n) , O ( 1 ) O(1) O(1) , O ( n ) O(\sqrt{n}) O(n ) , O ( log ⁡ n ) O(\log n) O(logn) , O ( n log ⁡ n ) O(n \log n) O(nlogn) 等多项式 ;

n n n 一般都在底数的位置 , 不在幂次方的位置 ;


NP 问题 ( Nondeterministic Polynomial ) , 是没有找到一个算法可以在多项式时间内解决该问题 , 目前只找到了非多项式时间的解法 , 不确定该问题是否有多项式时间解法 ;

时间复杂度一般是 O ( 2 n ) O(2^n) O(2n) , O ( n n ) O(n^n) O(nn) , O ( n ! ) O(n!) O(n!) 等 ;


2、O 表示的复杂度情况


O O O 表示算法在 最坏的情况下的时间复杂度 ;

一般情况下 , 算法的时间复杂度都以最坏情况的时间复杂度为准 ;

但是也有特例 , 快速排序的最坏情况下 , 时间复杂度是 O ( n 2 ) O(n^2) O(n2) , 这个时间复杂度几乎不会遇到 , 一般情况下描述快速排序的时间复杂度时 , 使用 平均时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn) ;


3、时间复杂度取值规则


只考虑最高次项 : 时间复杂度描述中 , 一般 只考虑最高次项 ;
如 : O ( n 2 + n ) = O ( n 2 ) O(n^2 + n) = O(n^2) O(n2+n)=O(n2) , O ( 2 n + n 2 ) = O ( 2 n ) O(2^n + n^2) = O(2^n) O(2n+n2)=O(2n)


不考虑常数项 : 时间复杂度描述中 , 不考虑常数项 ;
如 : O ( n 2 + 2000 ) = O ( n 2 ) O(n^2 + 2000) = O(n^2) O(n2+2000)=O(n2)


不考虑系数项 : 时间复杂度描述中 , 不考虑系数项 ;
如 : O ( 2 n 2 ) = O ( n 2 ) O(2n^2) = O(n^2) O(2n2)=O(n2) ,


O ( log ⁡ n ) = O ( log ⁡ ( n 2 ) ) = O ( log ⁡ 4 ( n ) ) O(\log n) = O(\log(n^2)) = O (\log _4 (n) ) O(logn)=O(log(n2))=O(log4(n)) , O ( log ⁡ ( n 2 ) ) O(\log(n^2)) O(log(n2)) 其中的 2 2 2 可以提取到前面 变为 O ( 2 log ⁡ ( n ) ) O(2\log(n)) O(2log(n)) , O ( log ⁡ 4 ( n ) ) O (\log _4 (n) ) O(log4(n)) 中的底数 4 4 4 提取出来变为 O ( 1 2 log ⁡ ( n ) ) O (\cfrac{1}{2}\log (n) ) O(21log(n)) , 系数项不考虑 , 不管底数是多少 , 内部 n n n 是多少次幂 , 都可以提取成系数 , 系数项不考虑 ;
因此 , 对数的复杂度只有 O ( log ⁡ n ) O(\log n) O(logn) , 没有其它的底数或 n n n 次幂的情况 , 这些都可以提取成系数 ;
但是系数为 n n n 除外 ;


4、时间复杂度对比


O ( m + n ) O(m + n) O(m+n) O ( m a x ( m , n ) ) O(max(m, n)) O(max(m,n)) 哪个复杂度更高 ;


n + m > m a x ( m , n ) > m + n 2 n + m > max (m, n) > \cfrac{m + n}{2} n+m>max(m,n)>2m+n

m a x ( m , n ) max (m, n) max(m,n) 是介于两个值之间的数值 ;

O ( n + m ) = O ( m + n 2 ) O(n + m) = O(\cfrac{m + n}{2}) O(n+m)=O(2m+n) , 因此 O ( n + m ) = O ( m + n 2 ) = O ( m a x ( m , n ) ) O(n + m) = O(\cfrac{m + n}{2}) = O(max (m, n)) O(n+m)=O(2m+n)=O(max(m,n))

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/119011214

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。