1.1 算法的时间复杂度性分析
算法是解决问题的方法,一个问题可以有多种解决方法,不同的算法之间就有了优劣之分。如何对算法进行比较呢?算法可以比较的方面很多,如易读性、健壮性、可扩展性等,但不是最关键的方面,算法的核心和灵魂是效率,也就是解决问题的速度。试想,一个需要运行很多年才能给出正确结果的算法,就是其他方面的性能再好,也是一个不实用的算法。
算法的时间复杂性。
算法的时间复杂性是以后总事前分析估算的方法,它是对算法所消耗资源的一种渐进分析方法,所谓渐进分析方法是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。渐进分析的好处是大大降低了算法的分析难度,是从数量级的角度评价算法的效率。
输入规模和基本语句。
基本语句是执行次数与整个算法执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最重要的操作。
int SeqSearch(int A[] ,int n, int k) //在数组a[n]中查找值为k的记录。
{
for(int i=0;i<n;i++)
{
if(A[i]==k) break;
}
if(i==n) return 0; //查找失败,返回失败标志0;
else return (i+1); //查找成功返回记录序号。
}
算法的运行时间主要消耗在循环语句,循环语句执行次数取决于带查找记录个数n和待查找值k在数组中的位置,每执行一次for循环,都要执行一次元素比较。因此,输入规模是带查找记录个数n,基本语句是比较操作(A[i] ==k)。
最好、最坏和平均情况。
最好情况(best case)不能作为算法性能的代表,因为发生的概览太小,对于条件的考虑太乐观了,当最好情况出现的概览较大时候,应该分析最好情况。
最坏情况(worst case):可以知道算法的运行时间,最坏情况坏到什么程度,这一点实时系统中尤其重要。
平均情况(average case):考虑各种情况发生的概率。