算法是什么?
算法其实就是对一个问题或一类问题的解决过程的描述。大家对高斯不陌生吧?以首项加末项乘以项数除以2用来计算“1+2+3+4+5+···+(n-1)+n”的结果。我们把它叫做高斯算法,因为可以通过公式来解决复杂的问题,大大缩短了解题时间。当然算法的魅力还不止如此,我们接着往下看:
这两段代码都可以称之为算法,因为分别可以解决两个数相加和从1加到n的问题。算法并不一定要非常复杂,小到一行代码,多到上万行代码,只要能解决特定问题,就是算法。
如何评估算法优劣
使用不同算法,解决同一个问题,效率可能相差非常大
现有两个求斐波那契数 (fibonacci number) 的算法
(斐波那契数列:1 1 2 3 5 8 ……)
这里
public static int fib1(int n) {
if
(n <= 1) return n;
return
fib1(n - 1) + fib1(n - 2);
}
public static int fib2(int n) {
if
(n <= 1) return n;
int
first = 0;
int
second = 1;
for
(int i = 0; i < n - 1; i++) {
int
sum = first + second;
first
= second;
second
= sum;
}
return
second;
}
这两个算法哪个更优呢?
如果单从执行效率上进行评估,可能会想到这么一种方案
比较不同算法对同一组输入的执行处理时间
这种方案也叫做:事后统计法
我们的做法是:
public static void main(String[] args) {
int
n = 45;//求第45个斐波那契数
TimeTool.check("fib1",
new Task() {
public
void execute() {
System.out.println(fib1(n));
}
});//5.815秒
TimeTool.check("fib2",
new Task() {