要解决一个实际问题,常常有多种算法可供选择,不同的算法各有其自身的优缺点,如何在这些算法中取舍呢?这就需要采用算法分析技术来评价算法的效率。算法分析的任务就是利用某种方法,对每一个算法讨论其各种复杂度。算法的复杂度是度量算法优劣的重要依据。对于一个算法,复杂度的高低体现在运行该算法所需的计算机资源上。计算机资源主要包括时间资源和空间资源。因而,算法的复杂度通常体现在时间复杂度和空间复杂度两个指标上。
算法的时间复杂度分析
算法时间复杂度的高低直接反映算法执行时间的长短,而算法的执行时间需要通过依据该算法编制的程序在计算机执行所消耗的时间来度量。影响一个程序的执行时间的主要因素有以下几个方面:
1、算法本身所用的策略
2、问题规模即处理问题时所处理的数据元素的个数
3、程序设计所采用的语言工具
4、编译程序所产生的机器代码质量
5、计算机执行指令的硬件速度
6、程序运行的软件环境
定义:算法的时间复杂度T(n)=O(f(n))当且仅当存在正常数c和自然数N,对所有的n(n>=N)满足0<=T(n)<=c*f(n)(其中O()读作大O)。
一般情况下,对于一个关于数据元素个数n的多项式,用大O表示法时只需保留其最高次幂的项并去掉其系数即可。使用大O记号表示的算法时间复杂度,也称为算法的渐进时间复杂度。
假设一个算法是由n条指令序列所构成的集合,则:算法的执行时间=指令序列(i)的执行次数×指令序列(i)的执行时间。算法的执行时间与指令序列的执行次数成正比。于是,我们尝试通过计算机依据算法编制的程序中每条语句的语句频度之和的值来估算一个算法的执行时间,所谓语句频度就是语句重复执行次数。
在大多数情况下,用渐近分析法对算法的执行时间进行估算,是根据算法执行过程中需要实施的关键操作的数目的多少来衡量的。所谓关键操作就是算法中最主要的操作。用这种方法对算法的时间复杂度进行分析时,只需适当选择一个算法中的关键操作并通过计算关键操作的语句频度来估算出算法的执行时间。于是,一个算法的执行时间代价主要体现在关键步骤上。