最近开始了考研专业课数据结构的复习,严蔚敏的教材在第一章绪论中肤浅地介绍了算法分析的概念和方法,包括时间复杂度的分析,鉴于前段时间在看《算法导论》这本书,也有看MIT的算法导论的开放课程,所以结合书和课程的听课笔记来深入算法的时间复杂度分析。为何算法分析很重要,度量算法好坏的标准是什么,为何引入时间复杂度分析,如何计算一个算法的时间复杂度?
本人刚开始学习数据结构和算法时,觉得一个算法写出来就可以了,为啥要分析上半天它的时间复杂度或空间复杂度。当时是因为接触到的算法比较浅显,一看大概就能看出来哪个算法执行更快一点,更节省空间一点。但学习和研究一定要有凭有据。
一、如何进行算法分析
算法分析指对一个算法需要的资源进行预测,其分析包括对一个算法的空间复杂度分析和时间复杂度分析。而随着硬件技术的飞速发展和成本的降低,我们更加关注算法在时间上的表现。
比较直观的做法是通过算法执行的时间来度量一个算法的时间上的效率。但这与执行算法的硬件和运行时的情境关系很大,不同机器、不同状态下的同一算法的运行时间都可能不同,所以这种算法是不科学的。
一个算法所需的时间应当是随着其输入规模增长的,而输入规模与特定具体问题有关。对大多数问题来说其最自然的度量就是输入中的元素个数。
算法的运行时间是指在特定输入时所执行的基本操作数。我们可以得到关于一个关于输入规模n的所需时间的函数。
然而可以进一步简化算法的时间分析,我们进行进一步抽象,首先,忽略每条语句的真实代价,通过运行时间的增长率来度量一个算法在时间方面的表现。我们只考虑公式的最高次项,并忽略它的常数系数。
通常,有三种情况的分析:
(1)最坏情况分析:这个是最常用的。通常我们想知道一个算法最糟能糟到什么情况,以此来分辨一个算法的好坏。对于升序排序算法,最糟糕的输入便是降序排列的数列。
(2)平均情况分析:这个也常用到。输入规模n下的期望时间。
(3)最好情况分析:比较少遇到。对于一个排序算法最好的情况无非输入已是排好序的。
二、要用到的渐近记号
所有记号都表示一切满足条件的函数的集合。
1、Θ记号 Θ(g(n)) = { f(n) : 若存在正常数c1,c2和n0,使对所有n>=n0时有0<=c1*g(n)<=f(n)<=c2*g(n)}
其效果相当于删除f(n)中的低阶项,并忽略最高阶项的系数。
2、Ο记号Ο(g(n)) = { f(n) : 存在正常数c和n0,使对所有n>=n0,有0<=f(n)<=c*g(n) }
Ο记号在一个常数因子内给出某函数的一个上界。f(n) =Ο(g(n))表示f(n)是集合O(g(n))的一个元素。f(n) =Θ(g(n))隐含着f(n) =Ο(g(n)),因为Θ记号强于Ο记号。对f(n) =Ο(g(n))只能说明g(n)的某个常数倍是f(n)的渐近上界,而不反映该上界如何接近。Ο记号在用作对算法最坏情况运行时间的上界时就有对任意输入的运行时间的上界。
3、Ω记号Ω(g(n)) = { f(n) : 存在正常数c和n0,使所有n>=n0有0<=c*g(n)<=f(n) }
Ω记号给出一个函数的渐近下界。
对于上面三种,有下面的定理:
对任意两个函数f(n)和g(n),f(n) =Θ(g(n))当且仅当f(n) =Ο(g(n))和f(n) =Ω(g(n)).
4、其它符号
ο记号:Ο记号提供的渐近上界可能是也可能不是渐近紧确的。2n^2 =Ο(n^2)是渐近紧确的,而2n = O(n^2)不是。而o记号用来表示非渐近紧确的。o(g(n)) = { f(n) : 对任意正常数c,存在正常数n0,使对所有n>=n0,有0<=f(n)<=c*g(n) }
ω记号:ω记号与Ω记号的关系和o记号与Ο记号的关系一样,不在多说。
总之,可以这样理解,Θ记号相当于"=",Ο相当于“<=",Ω相当于”>=",o相当于“<",ω相当于">".这样理解只用于区别不同渐近记号间的关系,其实每个渐近记号为一个函数集合,而非两个数关系那样的。
下一篇奉上如何对一个递归算法进行时间复杂度分析,欢迎关注!
分享到:
相关推荐
第二章《开始》介绍了插入排序算法作为示例,深入浅出地讲解了算法分析的基础。这部分内容涵盖了如何评估算法的时间复杂度和空间复杂度,以及如何通过大O记号(O-notation)来表示算法的渐近行为。此外,还介绍了...
为了描述算法效率,本书引入了增长函数的概念,并介绍了渐近符号,如大O符号、Ω符号和Θ符号,这些是算法分析中最核心的工具之一。它们用于表达算法运行时间的增长率或内存使用的增长率。 本书的第三部分涉及分治...
第三版继续在算法的分析和设计方法上提供了深入浅出的介绍,并增加了许多新章节和内容。 书中首先介绍了算法在计算中的角色,强调算法作为技术的重要性,并通过插入排序等基础算法,引导读者理解算法的基本概念。接...
这本书深入浅出地介绍了计算机算法的基础理论与实践应用,被视为学习和研究算法的必备参考书。 ### 重要知识点概览 #### 算法的角色与技术价值 - **算法**:书中首先定义了算法的概念,即一系列明确指令的集合,...
### 知识点生成 #### 一、算法在计算中的角色与技术意义 - **算法的概念**:本书从算法的基本定义...这本书深入浅出地介绍了算法的基础理论及其实现方法,是一本非常适合计算机科学及相关专业学生学习的经典教材。
《算法导论》(第三版)是一本被广泛使用的计算机科学领域的经典教材,它深入浅出地介绍了算法的基本概念、设计技巧以及分析方法。本书由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein...
它深入浅出地介绍了算法的基本概念、设计方法以及分析技巧,并覆盖了大量实用的算法案例。对于希望深入了解算法理论及其应用的学生、研究人员以及专业人士而言,《算法导论》不仅是一本重要的参考书,更是不可或缺的...
书中深入浅出地讲解了计算机科学中必需的数学知识。主要内容包括: - **和式**:求和符号的使用及其在计算机科学中的应用。 - **整值函数**:伽马函数和相关概念。 - **数论**:质数测试、同余方程等。 - **二项式...