代码改变世界

第2章 算法效率的度量方法---《大话数据结构》读书笔记

2012-01-01 17:55  海不是蓝  阅读(355)  评论(0)    收藏  举报

一个程序的运行时间,依赖于算法的好坏和问题的输入规模。

思维的问题输入规模是指输入量的多少。

 

2种求和算法

第一种:

Int32 sum = 0, n = 100;//执行了1次

for (Int32 i = 1; i <= n; i++)//执行了n+1次

{

    sum = sum + i;//执行了n次

}

Console.WriteLine("sum={0}", sum);//执行了1次

 

第二种:

Int32 sum = 0, n = 100;//执行了1次

sum = (1 + n) * n / 2;//执行了1次

Console.WriteLine("sum={0}", sum);//执行了1次

 

 

第一种算法执行次数:1+(n+1)+n+1=2n+3

第二种算法执行次数:1+1+1=3

两种算法第一条和最后一条语句是一样的,忽略它们然后关注中间的那部分语句。

然后忽略循环体判断开销,这2个算法就是n次与1次的差距。

所以第一个算法没有第二个好。

 

延伸一个例子:

Int32 sum = 0, x = 0, n = 100;//执行了1次

for (Int32 i = 1; i <= n; i++)//执行了n+1次

{

    for (Int32 j = 1; j <= n; j++)//执行了n(n+1)次

    {

        x++; ;//执行了n*n次

        sum = sum + i;//执行了n*n次

    }

}

Console.WriteLine("sum={0} x={1}", sum, x);//执行了1次

所以这个算法执行次数是:1+(n+1)+n(n+1)+n*n+n*n+1=3n^2+2n+3

忽略其它步骤(循环体头尾的开销),这个算法3n^2次,忽略最高项系数,那么这个算法执行次数是n^2

 

最终,在分析程序的运行时间时,最重要的是把程序看成独立于程序设计语言的算法或者一系列步骤。

同样问题的输入规模是n

求和算法的第一种:求1+2++n需要一段代码运行n次。那么这个问题的输入规模使得操作数量是f(n)=n

第二种:无论n为多少,运行次数都是为1,f(n)=1

第三种f(n)=n^2