算法題4


摘自傳智播客


package test;
public class Arithmetic4 {
    public static void main(String[] args) {
        //問題:計算求出1到10000的所有質數
        //問題:計算求出1到100000000的所有質數
        int num = 1000000;
        /*
         * 方案一
         */
        long start = System.currentTimeMillis();
        for(int i=1;i<num;i++) {
            for(int j=2;j<i;j++) {
                if(i%j==0) break;
                if(j==i-1) System.out.println(i);
            }
        }
        System.out.println("-----------------------");
        long end1 = System.currentTimeMillis();
        /*
         * 方案二
         */
        System.out.println(3);
        for(int i=1;i<=num;i++) {
            for(int j=2;j<=Math.sqrt(i);j++) {
                if(i%j==0) break;
                if(j==(int)Math.sqrt(i)) System.out.println(i);
            }
        }
        System.out.println("-----------------------");
        long end2 = System.currentTimeMillis();
        /*
         * 方案三
         */
        System.out.println(3);
        for(int i=1;i<=num;i+=2) {
            for(int j=2;j<=Math.sqrt(i);j++) {
                if(i%j==0) break;
                if(j==(int)Math.sqrt(i)) System.out.println(i);
            }
        }
        System.out.println("----------------");
        long end3 = System.currentTimeMillis();
        /*
         * 方案四
         */
        int[] nums = new int[100];
        nums[0] = 2;
        int temp = 1;
        for(int i=2;i<num;i++) {
            for(int j=0;j<temp;j++) {
                if(i%nums[j]==0) break;
                if((j+1)==temp) {
                    if(temp == nums.length) {
                        int[] tempNums = new int[nums.length*2];
                        for(int k=0;k<nums.length;k++) {
                            tempNums[k] = nums[k];
                        }
                        nums = tempNums;
                    }
                    nums[temp] = i;
                    temp++;
                }
            }
        }
        for(int i=1;nums[i]!=0;i++) {
            System.out.println(nums[i]);
        }
        long end4 = System.currentTimeMillis();
                                                                                                 
        /*
         * 時間對比
         */
        System.out.println("方案一:"+(end1-start)+"ms");
        System.out.println("方案二:"+(end2-end1)+"ms");
        System.out.println("方案三:"+(end3-end2)+"ms");
        System.out.println("方案四:"+(end4-end3)+"ms");
    }
}



時間對比:wKioL1MIncXgLNvlAABqKBYxjZE452.jpg

從方案一到方案四都是優化了計算次數,爲什麼方案四所用時間反而大於方案三和方案四呢?

原因在於程序運行時間並沒有像我們預期的那樣,我們忽略了一些小細節,就是不同的操作符所用時間是不同的,當循環數足夠大時,它們的差值能蓋過你所優化的時間。

小實驗:


long start = System.currentTimeMillis();
int[] num = new int[10];
for(int i = 0;i<100000000;i++) {
    if(num[1]==1) ;
}
long end = System.currentTimeMillis();
System.out.println((end-start) + "ms");
long start = System.currentTimeMillis();
int j = 0;
for(int i = 0;i<100000000;i++) {
    j++;
}
long end = System.currentTimeMillis();
System.out.println((end-start) + "ms");

像這樣對運算符進行時間評估,可以發現從數組取值所花時間明顯高於其他運算符。

所以:在算法設計時,不要忽略了一些簡單的行爲++ [] ==,這些操作需要開銷時間的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章