在leetcode練習時,碰到一道經典的面試題,如何實現sqrt()開平方函式。當然,很簡單的是呼叫系統函式,但是難道不能自己實現這個函式的功能嗎?於是一番思索和查閱資料,看到下面的方法。
二分法這個應該很熟悉,在二分查詢演算法中就有具體的體現。應用在此題上,也是合適不過的。
首先分析一下這道題:
實現sqrt函式功能,求乙個數的開平方,即求f(x
)=x2
−n
f(x) = x^2 - n
f(x)=x
2−n這個函式f(x
)=
0f(x) = 0
f(x)=0
的非負解。
**實現
int bisectionsqrt(int x)
return int(mid);
}
注:
初始上界為x + 0.25,而非x。(這一點我不是很懂,希望大佬指點)
看概念:
又稱為牛頓-拉弗森方法(英語:newton-raphson method),它是一種在實數域和複數域上近似求解方程的方法。方法使用函式f(x
)f(x)
f(x)
的泰勒級數的前面幾項來尋找方程 f(y
)=
0f(y) = 0
f(y)=0
的根。可以看出滿足上面的題目分析,可以求得根。
int newtonsqrt(int x)
return int(result);
}
通過查閱的資料,以及在leetcode上的實際提交,發現牛頓迭代法的效率要比二分法高。
具體的效率差異請參考:
牛頓迭代法 二分法
牛頓迭代法 用牛頓迭代法求f x 0在x0附近的乙個實根的方法是 1 選乙個接近於x的真實根的近似根x1 2 通過x1求出f x1 在幾何上就是作x x1,交f x 於f x1 3 過f x1 作f x 的切線,交x軸於x2。可以用公式求出x2。由於f x1 f x1 x2 x1 故x2 x1 f ...
二分法和牛頓迭代法
先說乙個面試題 問 1.2 0.2 1 答案是false!為什麼?其原因在於十進位制和二進位制的轉換上,計算機先要把十進位制的數轉化為二進位制,然後再計算。但是,在轉化中,浮點數轉化為二進位制,就出問題了,例如 十進位制的 0.1,轉化為二進位制是 0.00011001100110011001100...
二分法 牛頓法開根號
牛頓法 public static double sqrtn1 double value,double accurary double init 1.0 while math.abs init init value accurary return init 二分法和牛頓法的時間複雜度都是o logn...