一个程序的运行时间,依赖于算法的好坏和问题的输入规模。
思维的问题输入规模是指输入量的多少。
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。