1. 程式人生 > >高斯演算法——Java實現及效率對比

高斯演算法——Java實現及效率對比

 高斯演算法:

        計算1 + 2 + 3 + ... + n 時, 通過收尾相加, 然後乘以最大數/2的方式來實現

/**
 * 高斯演算法
 */
public class GaussAlgorithm {

    public static void main(String[] args) {

        long n = 999;

        /*
            常規演算法, 當n較大時效率較低
            空間複雜度為 O(n)
         */
        long startTime = System.currentTimeMillis();
        long sum = 0;
        for (int i = 1; i <= n; i ++){
            sum += i;
        }

        long end1 = System.currentTimeMillis();
        System.out.println("normal sum = " + sum + ", case time" + (end1 - startTime));

        /*
            高斯演算法, 當n為奇數時需要考慮中位數的問題
            空間複雜度為 O(1)
         */

        long sum2 = (1 + n) * (n >> 1);
        //如果n是奇數的話, 需要在計算結果上加上中位數
        if((n & 1) == 1){
            sum2 += (1 + n) >> 1;
        }

        long end2 = System.currentTimeMillis();
        System.out.println("gauss sum = " + sum2 + ", case time" + (end2 - end1));


        /*
            使用浮點計算, 不用考慮中位數的問題, 但在資料較大時,小數位會出現問題
         */
        double sum3 = (1 + n) * ((float)n / 2);
        long end3 = System.currentTimeMillis();
        System.out.println("gauss sum = " + sum3 + ", case time" + (end3 - end2));

//        n = 99999999L
//        normal sum = 4999999950000000, case time50
//        gauss sum = 4999999950000000, case time0
//        gauss sum = 5.000000136282112E15, case time0

//        n = 999999999
//        normal sum = 499999999500000000, case time457  普通演算法
//        gauss sum = 499999999500000000, case time0     高斯演算法
//        gauss sum = 4.9999999215337472E17, case time0  使用浮點型資料在計算大數時會出現問題

//        n = 9999999999L
//        normal sum = 0 死掉,幾分鐘沒跑出來
//        gauss sum = -5340232226128654848,  case time0  超出範圍, 出現問題
//        gauss sum = 5.000000100204387E19, case time0

    }
}