麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

指定誤差求開平方之不同算法實現之間的效率比較(java實現)

2019-11-14 11:46:14
字體:
來源:轉載
供稿:網友

本文通過比較對數字指定誤差的求開平方不同算法實現之間的效率比較,來使程序入門者對不同算法的性能差距有直觀的印象,并且對算法的作用有深刻的體會。

算法一(暴力遍歷法):

	/**	 * 求開方	 * @param source 被開方數,大于等于0	 * @param deviation 誤差范圍	 * @return	 */	public static double sqrt(double source,double deviation) {				if(source < 0 || deviation <0) {			throw new RuntimeException("don't transmit negtive");		}		long count = 1;//統計循環執行次數		double result = 0;		while ((result + 1) * (result + 1) < source) {			count++;			result++;		}		while ((result + deviation) * (result + deviation) < source ) {			count++;			result += deviation;		}		System.out.PRintln("sqrt total count:" + count);		return result;	}

本算法是將計算結果從0開始一點一點增加并進行試探,直到接近真實結果誤差范圍內。

算法二(步長調整法):

/**	 * 求開方 優化,步長調整	 * @param source 被開方數,大于等于0	 * @param deviation 誤差范圍	 * @return	 */	public static double sqrt1(double source,double deviation) {				if(source < 0 || deviation <0) {			throw new RuntimeException("don't transmit negtive");		}		long count = 1;//統計循環執行次數		double result = 0;		int stepI = 2;		double stepD = deviation;		long stepCount = 1;		while ((result + 1) * (result + 1) < source) {			count++;			stepCount++;			if(stepCount%3==0){  //加快結果累計,調整步長				if((result + stepI) * (result + stepI) < source) {					result += stepI;					stepI++;					continue;				} else {					stepI--;				}			}			result++;		}		stepCount = 0;		while ((result + deviation) * (result + deviation) < source ) {			count++;			stepCount++;			if(stepCount%3==0){  //加快結果累計,調整步長				if((result + stepD) * (result + stepD) < source) {					result += stepD;					stepD+=deviation;					continue;				} else {					stepD-=deviation;				}			}			result += deviation;		}		System.out.println("sqrt1 total count :" + count);		return result;	}

本算法每當執行循環三次時調整一次步長,讀者可以自行定制更加高效的調整步長策略。

算法三(二分法):

	/**	 * 求開方 優化,二分法	 * 該方法效率明顯比前兩個方法快的多	 * @param source 被開方數,大于等于0	 * @param deviation 誤差范圍	 * @return	 */	public static double sqrt2(double source,double deviation) {				if(source < 0 || deviation <0) {			throw new RuntimeException("don't transmit negtive");		}		long count = 1;//統計循環執行次數		double result = 0;				double head = source;		double tail = 0;		while(true) {			count++;			if(((head+tail)/2) * ((head+tail)/2) < source) {				tail = (head+tail)/2;			} else {				head = (head+tail)/2;			}			result = (head+tail)/2;			if((result + deviation)*(result + deviation) >= source &&					(result - deviation)*(result - deviation) <= source) {				break;			}		}		System.out.println("sqrt2 total count:" + count);		return result;	}

本算法為典型的二分法,算法的原理如下:將0和source分別作為結果的初始下界和上界,將下界和上界的平均值與真實結果比較并調整結果的下界或者上界,直至結果位于真實結果的誤差范圍內。

上面已經給出了算法的實現,算法可能的難點是怎么判斷算出的值是否在誤差范圍內,讀者需要注意這點。下面通過幾組數據簡單的比較一下不同算法實現之間的效率差別:

                                                                      

上圖中,我們測試了三組數據,從標紅的數據可以看出,算法二明顯優于算法一,而算法三明顯優于算法二。當執行第三組數據時,算法一甚至要等一小會兒才能執行完,而算法三卻馬上就能得到結果,而且算法三隨著問題規模的擴大執行次數卻增長很慢,而這只是簡單的幾行代碼改進的結果。從這個算法問題中我們可以看到不同算法之間效率的巨大差距,由此不難體會在許多算法應用場合下算法巨大的威力。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产无遮挡一区二区三区毛片日本 | 成人影片在线免费观看 | 国产精品久久久久久久娇妻 | 中文字幕在线播放不卡 | h视频在线观看免费 | 亚洲人成综合第一网 | 午夜精品小视频 | 成人毛片视频免费 | www国产成人免费观看视频,深夜成人网 | 视频一区国产精品 | 精品一区二区三区在线观看视频 | 最近日本电影hd免费观看 | 韩国精品视频在线观看 | 91中文在线 | 91网站免费在线观看 | 欧美中文日韩 | 国产精品探花在线观看 | 欧产日产国产精品乱噜噜 | 欧美a视频 | 久久精品黄 | 91精品国产九九九久久久亚洲 | 久久在线精品视频 | 福利一区二区三区视频在线观看 | 免费色片 | 久久国产成人午夜av浪潮 | 欧美日韩视频网站 | 色婷婷久久一区二区 | 最新一级毛片 | 黄色高清视频网站 | 久色精品视频 | 日本人乱人乱亲乱色视频观看 | 一级电影免费 | 沉沦的校花奴性郑依婷c到失禁 | 中文字幕www. | 成人福利免费在线观看 | 日韩欧美精品中文字幕 | 校花被肉干高h潮不断 | 一级一片免费 | 国产精品自拍啪啪 | 国产一级午夜 | chinesehd天美原创xxxx |