关于算法效率
例子:
有2种写法:
- 最容易想到的方法:
//方式1: 比较low的写法
private static double getF1(int n, double[] a, double x) {
int i;
double p = a[0];
for (i = 1; i <= n; i++) {
p += (a[i] * Math.pow(x, i));
}
return p;
}
- 秦九韶算法
//方式2: f (x) = a0 + x(a1 + x(…(an-1 + x(an))…))
//秦九韶算法 结合律 从里往外算
private static double getF2(int n, double[] a, double x) {
int i ;
double p = a[n];
for (i = n; i > 0; i--) {
p = a[i - 1] + x * p;
}
return p;
}
测试:假设 n=9,x=1.1,a为10个数字的数组,存储的是0-10:
public static void main(String[] args) {
int n = 9;
double x = 1.1;
double[] a = new double[10];
for (int i = 0; i <= n; i++) {
a[i] = (double) i;
}
long startTime = System.currentTimeMillis();
System.out.println(startTime);
double f1 = 0;
for (int j=0;j<100000;j++){
f1 = getF1(n, a, x);
}
System.out.println(f1);
long endTime = System.currentTimeMillis();
System.out.println(startTime);
System.out.println(endTime - startTime);
System.out.println("------");
long startTime2 = System.currentTimeMillis();
System.out.println("startTime2==" + startTime2);
double f2 = 0;
for (int j=0;j<100000;j++){
f2 = getF2(n, a, x);
}
System.out.println(f2);
long endTime2 = System.currentTimeMillis();
System.out.println(endTime2);
System.out.println(endTime2 - startTime2);
}
因为我的是固态硬盘,执行一遍代码看不出来效果,循环执行100000遍,可以看到时间差别,差了一个数量级:
这个例子说明:
完