高斯演算法——Java實現及效率對比
阿新 • • 發佈:2019-01-02
高斯演算法:
計算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 } }