前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【算法】复杂度理论 ( 时间复杂度 )

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

作者头像
韩曙亮
发布2023-03-29 14:53:28
1.4K0
发布2023-03-29 14:53:28
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、复杂度理论


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

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

编程复杂度 : 代码可读性是否高 , 是否容易看懂 ; 写代码时的难度不高 , 别人读代码时的难度也不高 ; 如果写的时候经过长时间斟酌 , 那么可读性估计会很差 ;

如 : 字符串查找 ,

使用 蛮力算法 , 编程复杂度很低 , 很容易看懂 , 但是其时间复杂度是

O(m \times n)

;

如果使用 Rabin-Karp 算法 , 时间复杂度是

O(m + n)

, 但是编程复杂度很高 , 实现了哈希算法 , 很难看懂 ;

思维复杂度 : 是否容易想得出 ; 算法的原理是否容易理解 ;

算法是否容易理解 ;

字符串查找 KMP 的算法就很难理解 , 即使把代码展示出来 , 将原理说明 , 也是很难理解的 ;

一般 蛮力算法 时间复杂度 很高 , 但是 编程复杂度 和 思维复杂度 很低 , 代码容易理解 ;

如果对 时间复杂度 要求很高 , 如必须达到

O(n)

O(n^2)

要求 , 则必须使用复杂的算法 , 双指针 , 动态规划 , KMP 等 , 代码会写几百行 , 很难理解 ;

二者之间需要综合考虑 , 相互作出一些妥协 ;

二、时间复杂度


1、P 与 NP 问题

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

时间复杂度都是

O(n)

,

O(n^2)

,

O(n^3)

,

O(m + n)

,

O(1)

,

O(\sqrt{n})

,

O(\log n)

,

O(n \log n)

等多项式 ;

n

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

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

时间复杂度一般是

O(2^n)

,

O(n^n)

,

O(n!)

等 ;

2、O 表示的复杂度情况

O

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

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

但是也有特例 , 快速排序的最坏情况下 , 时间复杂度是

O(n^2)

, 这个时间复杂度几乎不会遇到 , 一般情况下描述快速排序的时间复杂度时 , 使用 平均时间复杂度

O(n \log n)

;

3、时间复杂度取值规则

只考虑最高次项 : 时间复杂度描述中 , 一般 只考虑最高次项 ;

如 :

O(n^2 + n) = O(n^2)

,

O(2^n + n^2) = O(2^n)

不考虑常数项 : 时间复杂度描述中 , 不考虑常数项 ;

如 :

O(n^2 + 2000) = O(n^2)

不考虑系数项 : 时间复杂度描述中 , 不考虑系数项 ;

如 :

O(2n^2) = O(n^2)

,

O(\log n) = O(\log(n^2)) = O (\log _4 (n) )

,

O(\log(n^2))

其中的

2

可以提取到前面 变为

O(2\log(n))

,

O (\log _4 (n) )

中的底数

4

提取出来变为

O (\cfrac{1}{2}\log (n) )

, 系数项不考虑 , 不管底数是多少 , 内部

n

是多少次幂 , 都可以提取成系数 , 系数项不考虑 ;

因此 , 对数的复杂度只有

O(\log n)

, 没有其它的底数或

n

次幂的情况 , 这些都可以提取成系数 ;

但是系数为

n

除外 ;

4、时间复杂度对比

O(m + n)

O(max(m, n))

哪个复杂度更高 ;

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

是介于两个值之间的数值 ;

O(n + m) = O(\cfrac{m + n}{2})

, 因此

O(n + m) = O(\cfrac{m + n}{2}) = O(max (m, n))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、复杂度理论
  • 二、时间复杂度
    • 1、P 与 NP 问题
      • 2、O 表示的复杂度情况
        • 3、时间复杂度取值规则
          • 4、时间复杂度对比
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档