在《計算機程式設計藝術》第三頁有這樣一段話文章:
給定兩個正整數m,n求它們的最大公因數:
E1:用 n 除 m ,得到余數 r。
E2:如果 r = 0,演算法終止,n是答案
假定已知 m = 119 和 n = 544 ,我們從E1開始,在這種情況下,用n除以m非常簡單。因為商為0,余數是119,于是r = 119。我們進入步驟E2,由于r≠0,因而五操作,在步驟E3,我們置m=544,n=119,很明顯,如果最初m<n,那么步驟E1中的上始終為0,其演算法總要以這種頗為繁瑣的方式交換m與n,為此我們增加一個新的操作步驟:
E0:如果m<n,交換m和n的值
根據這段文章,java代碼如下
/**
* 阿基米德演算法
*
* @author 我TM帥爆
* @date 2020/6/22 20:43
* @week 星期一
*/
public class Archimedes {
public static void main(String[] args) {
algorithm1();
algorithm2();
}
/**
* 計算方式1
*/
private static void algorithm1() {
long startTime = System.nanoTime();//獲得演算法開始的時間,納秒級時間戳
int m = 119;
int n = 544;
int r;//余數
do {
r = m % n;
m = n;
n = r;
} while (r != 0);
System.out.println("演算法1:" + (System.nanoTime() - startTime));//輸出演算法運行了多少時間
}
/**
* 計算方式2
*/
private static void algorithm2() {
long startTime = System.nanoTime();//獲得演算法開始的時間,納秒級時間戳
int m = 119;
int n = 544;
if (m < n) {
//交換m和n值
int sun = n;
n = m;
m = sun;
}
int r;//余數
do {
r = m % n;
m = n;
n = r;
} while (r != 0);
System.out.println("演算法2:" + (System.nanoTime() - startTime));//輸出演算法運行了多少時間
}
}
最終兩種計算方式運行所時間為(單位:納秒):
演算法1:52700
演算法2:5500
為啥我感覺演算法2的操作步驟明顯要比演算法1復雜,運行的時間卻比演算法1要少這么多
uj5u.com熱心網友回復:
自己頂自己,頂上去uj5u.com熱心網友回復:
你在兩個演算法的 while 回圈中加個計數看各算了多少次 % 取余就明白了演算法1做了5次取余,
演算法2做了4次取余
時間差主要在這兒了
另外,實際上兩個演算法的時間性差距沒這么大
因為程式剛啟動時也會占用一點系統資源
你把演算法1和2的執行順序反過來,會發現反而演算法2更耗時了
你真的要測時間性,至少給兩個演算法加上回圈,各跑個100000次以上
才能看出真正的差距
其實差距很小
演算法一:不需要資料數值比較,但是多做一次取余
演算法二:多做了一次數值比較,少做一次取余
uj5u.com熱心網友回復:
我讓兩個演算法各跑了一千萬次結果總耗時:
演算法1大約是演算法2的1.5倍耗時
絕對沒有10倍差距這么多
這個例子可以證明:
取余計算的耗時高于數值比較
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42894.html
標籤:Java SE
上一篇:獲取不到表單內容,求大神解答一下
下一篇:如何系結機器碼與注冊碼
