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

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

文章目录

一、复杂度理论

二、时间复杂度

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(n

2

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

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






二、时间复杂度



1、P 与 NP 问题


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


时间复杂度都是 O ( n ) O(n)O(n) , O ( n 2 ) O(n^2)O(n

2

) , O ( n 3 ) O(n^3)O(n

3

) , 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 nn 一般都在底数的位置 , 不在幂次方的位置 ;



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


时间复杂度一般是 O ( 2 n ) O(2^n)O(2

n

) , O ( n n ) O(n^n)O(n

n

) , O ( n ! ) O(n!)O(n!) 等 ;



2、O 表示的复杂度情况


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


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


但是也有特例 , 快速排序的最坏情况下 , 时间复杂度是 O ( n 2 ) O(n^2)O(n

2

) , 这个时间复杂度几乎不会遇到 , 一般情况下描述快速排序的时间复杂度时 , 使用 平均时间复杂度 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(n

2

+n)=O(n

2

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

n

+n

2

)=O(2

n

)



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

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

2

+2000)=O(n

2

)



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

如 : O ( 2 n 2 ) = O ( n 2 ) O(2n^2) = O(n^2)O(2n

2

)=O(n

2

) ,



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(n

2

))=O(log

4


(n)) , O ( log ⁡ ( n 2 ) ) O(\log(n^2))O(log(n

2

)) 其中的 2 22 可以提取到前面 变为 O ( 2 log ⁡ ( n ) ) O(2\log(n))O(2log(n)) , O ( log ⁡ 4 ( n ) ) O (\log _4 (n) )O(log

4


(n)) 中的底数 4 44 提取出来变为 O ( 1 2 log ⁡ ( n ) ) O (\cfrac{1}{2}\log (n) )O(

2

1


log(n)) , 系数项不考虑 , 不管底数是多少 , 内部 n nn 是多少次幂 , 都可以提取成系数 , 系数项不考虑 ;

因此 , 对数的复杂度只有 O ( log ⁡ n ) O(\log n)O(logn) , 没有其它的底数或 n nn 次幂的情况 , 这些都可以提取成系数 ;

但是系数为 n nn 除外 ;



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)>

2

m+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(

2

m+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(

2

m+n


)=O(max(m,n))


目录
相关文章
|
4月前
|
存储 机器学习/深度学习 编解码
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
本文提出统一相位正交啁啾分复用(UP-OCDM)方案,利用循环矩阵特性设计两种低复杂度均衡算法:基于带状近似的LDL^H分解和基于BEM的迭代LSQR,将复杂度由$O(N^3)$降至$O(NQ^2)$或$O(iNM\log N)$,在双选择性信道下显著提升高频谱效率与抗多普勒性能。
293 0
双选择性信道下正交啁啾分复用(OCDM)的低复杂度均衡算法研究——论文阅读
|
机器学习/深度学习 算法 程序员
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
本文是作者阅读《趣学算法》后的笔记,介绍了算法复杂度的基本概念,包括时间复杂度和空间复杂度的不同阶表示,并通过具体例子展示了如何计算和理解算法的效率。
213 2
读《趣学算法》:重开算法之门,时间复杂度与空间复杂度
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
288 6
|
搜索推荐 算法
插入排序算法的平均时间复杂度解析
【10月更文挑战第12天】 插入排序是一种简单直观的排序算法,通过不断将未排序元素插入到已排序部分的合适位置来完成排序。其平均时间复杂度为$O(n^2)$,适用于小规模或部分有序的数据。尽管效率不高,但在特定场景下仍具优势。
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
258 6
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
685 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
1362 0
算法的时间复杂度和空间复杂度
|
算法 Python
震惊!Python 算法设计背后,时间复杂度与空间复杂度的惊天秘密大起底!
在 Python 算法设计中,理解并巧妙运用时间复杂度和空间复杂度的知识,是实现高效、优雅代码的必经之路。通过不断地实践和优化,我们能够在这两个因素之间找到最佳的平衡点,创造出性能卓越的程序。
195 5
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
348 4
|
算法 程序员 Python
程序员必看!Python复杂度分析全攻略,让你的算法设计既快又省内存!
在编程领域,Python以简洁的语法和强大的库支持成为众多程序员的首选语言。然而,性能优化仍是挑战。本文将带你深入了解Python算法的复杂度分析,从时间与空间复杂度入手,分享四大最佳实践:选择合适算法、优化实现、利用Python特性减少空间消耗及定期评估调整,助你写出高效且节省内存的代码,轻松应对各种编程挑战。
385 1

热门文章

最新文章