今天來說說為什么需要使用算法?
算法是什么?算法是:指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。如果一個算法有缺陷,或不適合于某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間復雜度與時間復雜度來衡量。(百度百科版)
說完了算法的概念,我們舉個例子說一下為什么需要算法?
~~~
public class Test {
/**
* 使用原始的循環計算等差數列
*/
private void originalMethod(long n) {
System.out.println("**使用原始循環算法**");
long startTime = System.currentTimeMillis();
long sum = 0;
for (long i = 0; i <= n; i++) {
sum += i;
}
long endTime = System.currentTimeMillis();
System.out.println("結果:" + sum);
System.out.println("用時:" + (endTime - startTime));
}
/**
* 使用等差數列算法計算
*
* @param n
*/
private void advanceMethod(long n) {
System.out.println("**使用等差數列算法**");
long startTime = System.currentTimeMillis();
long sum = 0;
long a1 = 1;
long an = n;
sum = (a1 + an) * n / 2;
long endTime = System.currentTimeMillis();
System.out.println("結果:" + sum);
System.out.println("用時:" + (endTime - startTime));
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
long n = 1000;
System.out.println("-------當n=" + n + "的時候------");
test.originalMethod(n);
test.advanceMethod(n);
n = 1000000;
System.out.println("-------當n=" + n + "的時候------");
test.originalMethod(n);
test.advanceMethod(n);
n = 1000000000L;
System.out.println("-------當n=" + n + "的時候------");
test.originalMethod(n);
test.advanceMethod(n);
}
}
~~~
輸出結果:
-------當n=1000的時候------
**使用原始循環算法**
結果:500500
用時:0
**使用等差數列算法**
結果:500500
用時:0
-------當n=1000000的時候------
**使用原始循環算法**
結果:500000500000
用時:3
**使用等差數列算法**
結果:500000500000
用時:0
-------當n=1000000000的時候------
**使用原始循環算法**
結果:500000000500000000
用時:2070
**使用等差數列算法**
結果:500000000500000000
用時:0
從上面的結果可以看見,使用循環算法的所用時間不斷的增加,而且達到某個數量級之后(例如10的20次方),估計我們等死也等不到結果出來,而反觀使用等差數列算法,使用的實際都是0,當然,其實不是0,只不過太快了,沒有顯示出來而已,兩個計算方式相互比較一下,算法的性能一下子就看出來了。
而且對于現今大數據來說,動不動就是幾億幾十億的數據,計算的過程比我們上面的更加復雜,所需要的時間就更多,這時候如果不使用相應的算法,解決一個問題的時間基本是不可估計的,因此,我們需要算法