sqrt函式實現 二分法 牛頓迭代法

2021-08-28 06:00:19 字數 844 閱讀 6818

在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...