if((k<=1))
return 1
for(i=1; i<k; i++) j*=i;
return j;
}
程序采用的是一个时间复杂度为O(n)的算法,不过,我们可以把他轻易地改为O(1)的算法:
// 程序段2 (非规范改进)
int
GetFactorial(
int k){
int i, j=1;
static const int FractorialTable[]={1, 1, 2, 6, 24,
120, 720, 5040, 40320, 362880, 3628800};
if((k<0) (k>=10))
return -1;
return FractorialTable[k];
}
|
这是一个典型的以空间换时间的做法。通用的编译器不会这么做——因为它没有办法在编译时确定你是不是要这么改。可以说,如果编译器真的这样做的话,那将是一件可怕的事情,因为那时候你将很难知道编译器生成的代码和自己想的到底有多大的差距。
当然,这类优化超出了本文的范围——基本上,我把它们归入“算法优化”,而不是“程序优化”一类。类似的优化过程需要程序设计人员对于程序逻辑非常深入地了解和全盘的掌握,同时,也需要有丰富的算法知识。
自然,如果你希望自己的程序性能有大幅度的提升,那么首先应该做的是算法优化。例如,把一个
O(n
2)的算法替换为一个
O(n)的算法,则程序的性能提升将远远超过对于个别语句的修改。此外,一个已经改写为汇编语言的程序,如果要再在算法上作大幅度的修改,其工作量将和重写相当。因此,在决定使用汇编语言进行优化之前,必须首先考虑算法优化。但假如已经是最优的算法,程序运行速度还是不够快怎么办呢?