1. 程式人生 > >【算法系列】-開根號

【算法系列】-開根號

package com.daojia.math;

public class SquereTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long t1 =System.currentTimeMillis();     
		double srt = Math.sqrt(100000000.0);
		System.out.println("jdkuse:"+(System.currentTimeMillis()-t1)+":"+srt);
		double jingdu = 0.001;
		long t2 =System.currentTimeMillis();     
		double srt1 =  sq1(100000000.0,0.001);
		System.out.println("迴圈use:"+(System.currentTimeMillis()-t2)+":"+srt1);
		System.out.println(Math.abs(srt1-srt)<jingdu);
		long t3 =System.currentTimeMillis();
		double srt2 =  sq2(100000000.0,0.001);
		System.out.println("二分法use:"+(System.currentTimeMillis()-t3)+":"+srt2);
		System.out.println(Math.abs(srt2-srt)<jingdu);
		long t4 =System.currentTimeMillis();
		double srt3 = sq3(100000000.0,0.001);
		System.out.println("牛頓法use:"+(System.currentTimeMillis()-t4)+":"+srt3);
		System.out.println(Math.abs(srt3-srt)<jingdu);
	}
    /**
     * 暴力迴圈法
     * @param num
     * @param jingdu
     * @return
     */
	public static double sq1(double num,double jingdu){		
		if(num<0)
		{
			return -1;
		}
		double step =jingdu/5;
		System.out.println(step);
		double res =0.000;
	
		while(res*res<(num-jingdu))
		{
			res =res+step;
		}
		return res;		
	}
	/*
	 * 二分法
	 * 
	 */
	public static double sq2(double num,double jingdu){		
		if(num<0)
		{
			return -1;
		}
		
		double last =0.0000;
		double low=0;
		double mid;
		double up=(num>=1?num:1); 
		  mid=(low+up)/2; 
		  do{
			  if(mid*mid>num)
			  {
				  up = mid;
			  }else{
				  low = mid;
			  }
			  last=mid;
			  mid=(up+low)/2;        
		  }while(Math.abs(mid-last)>jingdu);
		  
		
		return mid;		
	}
	
	/*
	 * 牛頓迭代法
	 * 
	 */
	public static double sq3(double num,double jingdu){		
		if(num<0)
		{
			return -1;
		}
		
		double x=num,y=0.0;
	    while(Math.abs(x-y)>0.00001){
	        y=x;
	        x=0.5*(x+num/x);
	    }
	    return x;	
	}
}
jdkuse:0:10000.0
2.0E-4
迴圈use:147:10000.000011057207
true
二分法use:0:9999.999747378752
true
牛頓法use:0:10000.0
true
我們可以看出,現在計算機還是很快的,對於1億,精度要求0.001的情況下。用了147毫秒。

相關推薦

系列-根號

package com.daojia.math; public class SquereTest { public static void main(String[] args) { // TODO Auto-generated method stub long t1 =System.curre

系列——Java實現冒泡&&快速

/** * @Title: quickSort.java * @Package cn.xiaojia.test * @Description: * @author 賈文靜 * @date 2017年8月8日 下午5:24:54 * @version V1.0 * Up

系列之枚舉生理周期

pac cin 輸出 peak 給定 cout 指定 eno d+ 題目     人有體力、情商、智商的高峰日子,它們分別每隔 23天、28天和33天出現一次。對於每個人,我們想 知道何時三個高峰落在同一天。給定三個高峰出現 的日子p,e和i(不一定是第一次高峰出

面試系列已知二叉樹的前序和中序遍歷重建二叉樹

已知一二叉樹的前序遍歷和中序遍歷重建二叉樹 1. 輸入前序遍歷陣列和中序遍歷陣列 2. 由前序遍歷順序可得,第一個節點是該二叉樹的根節點。 3. 在中序遍歷中尋找該根節點位置,該節點左邊是它的左子樹上的節點,右邊節點是它右子樹上的節點。 4. 獲取該節點左邊的節點數n,前序

面試系列逆序輸出一個單鏈表

將一個單鏈表的內容逆序輸出,考慮到當一個連結串列的元素列印之前將該元素的前一個元素列印,運用這個思路可以使用遞迴來實現該功能,(不過該方法仍然存在,問題,當連結串列過長會導致棧溢位問題)程式碼如下: </pre><pre name="code" clas

模板二叉樹

treenode tor bsp res stack ack 算法 == oid 模板: 1.先序遍歷三種方法 1)叠代: class Solution { public: /** * @param root: The root of binary tr

學習03---分析學習

循環 log 對數 子集 empty 分析 bsp 結果 -a 算法分析 算法分析 科學方法 細致的觀察真實世界的特點 根據觀察結果提出假設模型 根據模型預測未來的事件 繼續觀察並核實預測的準確性 反復直到確認預測和觀察一致 一般程序

拾遺最大數和最小數

eas null 第k大 方法 track 兩個 str 最大值和次大值 數位 轉載請註明出處:http://blog.csdn.net/ns_code/article/details/28735533 求一個數組中的最大值和最小值。我們一般的做法是掃描一遍數組求的

最長公共子序列--導論

pan end art blog src http size ret bdc 最長公共子序列:一個序列 S 。假設各自是兩個或多個已知序列的子序列,且是全部符合此條件序列中最長的,則 S 稱為已知序列的最長公共子序列。 其核心非常easy: 這樣,構造子結構就比較簡

學習,新姿勢,STL——Heap

內存 str 關系 priority bug 普通 數組 關於 cto “堆”是一個大家很熟悉的數據結構,它可以在\(O(log\;n)\)的時間內維護集合的極值。 這都是老套路了,具體的內部實現我也就不談了。 我一般來說,都是用queue庫中的priority_queue

日記Dijkstra最短路徑

其余 散點 jks 節點 while logs 最終 不能 基礎 上一篇再說廣度優先搜索的適合提到了圖。 狄克斯拉特算法是在圖的基礎上增加了 加權圖的概念。就是節點和節點之間是有不同距離的 1.算法實例 用Dijkstra算法找出以A為起點的單源最短路徑步驟如下 算法實

導論第六章、堆排序

兩個 高度 位置 思想 n) 隊列 sigma 復雜 max 基本過程: 1、保持最大堆的性質:假設兩個子堆都滿足,只需要根節點依次換下去,復雜度O(lg n) 2、初始化堆:後半段都是葉子,在前半段從後往前,依次執行上述最大堆性質的操作,名義復雜度是O(n lg n),

導論第七章、快速排序

很好 補充 第七章 而是 合並 art 元素 一個 排序 快排的優勢: 1、期望為O(n lgn) 2、常數因子比較小 3、就地排序 4、在虛存環境很好工作 與合並排序一樣是分治思想,但是不是從中間截斷,而是通過partition過程實現的 每次選擇最後一個元素為q,然

學習雙調歐幾裏得旅行商問題(動態規劃)(轉)

png .com 16px 我們 pan 子結構 最小 而且 復雜度 雙調歐幾裏得旅行商問題是一個經典動態規劃問題。《算法導論(第二版)》思考題15-1和北京大學OJ2677都出現了這個題目。 旅行商問題描述:平面上n個點,確定一條連接各點的最短閉合旅程。這個解的一般形式

專題卡特蘭數(計數數列)

n-1 映射 點分治 blog -s 方法 .org div n-k Catalan數列:1 1 1 2 5 14 42 132 429 1430 4862 16796 【計數映射思想】 參考:卡特蘭數 — 計數的映射方法的偉大勝利 計數映射:將難以統計的數映射為另一種形式

學習後綴數組

適合 class 初學 從大到小 更新 continue log printf post 一個字符串的題,有姿勢水平的OIers的腦中應該要浮現出許多算法…… 但是我沒有姿勢,也沒有水平,除了KMP和trie樹,什麽也想不起來。 直到我學了它——後綴數組! 多虧這玩意兒,我

專題多項式相關

學習筆記 itl 專題 int title 分享 www 理解 ade 【快速傅裏葉變換】 參考:從多項式乘法到快速傅裏葉變換 by miskcoo FFT 學習筆記 by Menci 特點:FFT用於O(n log n)解決多項式乘法。 (一)多項式的表示法: 系數表示法

學習Fhq-Treap(無旋Treap)

遍歷 功能 很多 www 代碼 二叉查找樹 說明 命名 例題 Treap——大名鼎鼎的隨機二叉查找樹,以優異的性能和簡單的實現在OIer們中廣泛流傳。 這篇blog介紹一種不需要旋轉操作來維護的Treap,即無旋Treap,也稱Fhq-Treap。 它的巧妙之處在於只需要分

總結博弈論相關

jsoi2009 algo n-k 流操作 sg函數 span HA font color 〖相關資料〗 《博弈論 SG函數》 〖相關題目〗 1.【bzoj1188】[HNOI2007]分裂遊戲 題意:共有n個瓶子,標號為0,1,2.....n-1,第i個瓶子中裝有

總結概率與期望相關

else tle 選擇 def mem html ros 也不能 algorithm 〖相關資料〗 《淺析競賽中一類數學期望問題的解決方法》 〖相關題目〗 1.【bzoj1415】[NOI2005] 聰聰和可可 題意:在一個魔法森林裏,住著一只聰明的小貓聰聰和一只可