目录
前言
在一个算法设计好之后,还需要对其进行分析,确定一个算法的优劣。本节讨论算法的时间复杂度和空间复杂度分析。
一、算法分析概述
算法分析就是分析算法占用计算机资源的多少。而计算机资源主要是CPU时间和内存空间,分析算法占用CPU时间的多少称为时间性能分析,分析算法占用空间的多少称为空间性能分析。
算法分析的目的是分析算法的时空性能以便改进算法。
二、算法时间性能分析
1.两种算法时间性能分析
通常有两种衡量算法时间性能的方法,即事后统计法和事前估算法。
- 事后统计法:编写算法对应程序,统计其执行时间。一个算法用计算机语言实现后,在计算机上执行所消耗的时间与很多因素有关,如计算机的运行速度、编写程序采用的计算机语言、编译产生的机器代码质量和问题的规模问题。这种方法存在两个。一是必须执行程序,二是存在很多因素掩盖了算法本质
- 事前估算法:撇开这些与计算机硬件、软件有关的因素,仅考虑算法本身的效率高低,可以认为一个特定算法的“运行工作量”的大小只依赖于问题的规模(通常用整数n表示),或者说算法的执行时间是问题规模的函数,因此后面主要采用事前估算法来分析算法的时间性能
2.算法时间复杂度分析
(1)计算算法的频度
一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的。例如,在以下算法中,语句1、3、5和6就是原操作。
而算法的执行时间取决于控制结构和原操作的综合效果。显然,在一个算法中执行原操作数的次数越少,其执行时间也就相对较少;执行原操作数次数越多,其执行时间也就相对越多。也就是说,一个算法的执行时间可以由其中原操作数的执行次数来计量。
假设算法的问题规模为n,如果对10个整数排序,问题规模n就是10。算法时间分析的就是求出算法所有原操作数的执行次数(也成为频度),它是问题规模n的函数,用表示。
算法执行时间大致等于原操作所需的时间,也就是说
与算法的执行时间成正比,为此用
表示算法的执行时间,比较不同算法的
大小得出算法执行时间的多少。
(2)频度
用“O”表示
由于算法分析不是绝对是件的比较,在求出后,通常进一步采用时间复杂度来表示。算法时间复杂度(time complexity)就是用
的数量级来表示,记作
。
在上述表达式中“O”读作“大O”(是Order的简写,意指数量级),其含义是为寻找一个上界
,其严格地数学定义是