Leetcode 69 SQRT(X)及びその拡張(はい/いいえ精密二分法、ニュートン法)の詳細

Leetcode 69. SQRT(x)は簡単

https://leetcode.com/problems/sqrtx/

実装  int sqrt(int x)

計算の平方根を返す  X、  xは  非負の整数であることが保証されます。

戻り型が整数であるため、小数点以下の桁が切り捨てられ、その結果の整数部のみが返されます。

例1:

入力:4 
出力:2

例2:

入力:8 
出力:2 
説明:8の平方根は2.82842で...、そして以来、
             小数部分は切り捨てられ、2が返されます。

分析:

整数へleetcodeにすることなく、精度、および出力(実際には、あまり精度として使用することができます)。

二分法:()

この質問のために、最も直感的な方法は、二分法です。二分法を使用している場合、我々は後に前を指して、3つのポインタがあります注意してください(前、中、最後に、感謝書き込み習慣、上、一般的に左、中で、右の表現、またはスタート、途中、終わりを使用します)。また、サイクル条件の終わりはまた、あなたが良いプログラムを書く前に、当然のことながら、これはまた、この問題の難しさだと思うする必要があります。

境界条件を決定するには?
サイクルの左端が右、または右と左戻り、左=右=ミッドこの時間に等しい場合、左<右の時間サイクルを仮定する。あなたは、整数の実験を取ることができます例:8のために。
最初のサイクル:
(1 + 8)。MID = / 2 = 4(既定の整数除算は切り捨て)
。MID> 8 / MID
。右MID = - 3 1 =
左1 =
第二サイクル:
MID =(1 +。 3)= 2/2
MID <8 / MIDは
= MIDを残した。1 + 3 =
3 =右
この時間を、左ので==右ループのリターンのうち3であるが、これは正解であってはなりません。ループ条件は、に等しい場合に加えて、即ち、左<=右、次いで、次のサイクルが存在することになる。
第3サイクル:(新)
MID 3 =。
MID> 8 / MID。
右MID = - = 2 1
左= 3
この場合には、サイクルの> RIGH左端。私はあなたへの書き込み、私たちが見つかりました。そのサイクルの終わりに、この例では、リターンが右より適切である場合。これがケースであるか、あなたはこれを好きですか?

例えばX = 10の場合、プロセスは、中間変更されます:> 3 5-> 2-、この時点で10/3 == 3は、直接返します。X = 11の別の例では、プロセスは半ばを変更します:5->> 3 2-、11/3 == 3この時、直接返します。

X = 12の別の例は、プロセスは、中間を変更します:6-> 3-> 4(4 =左この場合、右= 5) - > 4(左= 4、右= 4) - > 右-1ケース、右= 3、4 =左となり、右返します。
したがって、戻り値は正しいであろう(MID下==非存在下でのX / MID)

、あなたはそれを考えることができる理由については、私は理論的な説明与えられ、理解することが考え。平方根に直感的な感覚を切り捨て、およびリターン右、右、<ただ切り捨てされるように、残されています。

注意:部門の書面の理由を、二つの大きな数字、超簡単メモリを掛ける場合ので。

INT mySqrt(INT X){
     int型左= 1 ;   // 0にすることはできません左、次に、X = 1、(+ 0 1)0/2 = 0、中間の結果が等しい場合、時間分割を行うためにので与えられ
    INT右= X、
     一方(左<= 右){
         // INT半ば=(左+右)/ 2; - >大右、左場合+右の最大の整数を超える可能性があるため、そう書かれていない
        INTミッド= +左(右-左)/ 2;
         IF(X == MID / MID){
             戻りMIDを; 
        } 
        そう IF(MID> X / MID){  = MID - 1 ; 
        } 
         {  // ミッド<X /ミッド 
            左=ミッド+ 1 
        } 
    } 
    戻す権利。
}

方法二:(ニュートン法)

ここではニュートン法/ニュートン反復法。導出を理解するために、ニュートン法丸暗記式を使用しないでください。ニュートン法は、近似式の根を見つけるために使用されます。最初の数Fを見つけるために、テイラー級数のF(X)を使用して(X)=ルートの0。(差があるとニュートン法を使用しxgboost何、考えて)

このシリーズについて:(テイラーは)よく言いました

https://baike.baidu.com/item/%E6%B3%B0%E5%8B%92%E7%BA%A7%E6%95%B0

https://zh.wikipedia.org/wiki/%E6%B3%B0%E5%8B%92%E7%BA%A7%E6%95%B0

ニュートンの法則/ニュートン反復法について:

https://baike.baidu.com/item/%E7%89%9B%E9%A1%BF%E8%BF%AD%E4%BB%A3%E6%B3%95  (ウィキペディアはグレートを記述)

https://www.zhihu.com/question/20690553

https://www.cnblogs.com/wangkundentisy/p/8118007.html 

(ニュートン反復法は、ルート変換を行った後、主要な問題を説明し、その後、x軸と接線との交点を見つけ、そしてここで反復更新ルート/ゼロに適し、かつ以下の最適化アルゴリズムは同じではありませんの)

https://blog.csdn.net/google19890102/article/details/41087931 

(最適化アルゴリズムとしてニュートン法は、全体的なアイデアは、反復点を使用することである)(勾配での一次導関数及び二次導関数(ヘッセン行列)ガイド目的関数をほぼ二次関数であり新しい二次モデルとして最小点点反復、及び、決定近似最小値は精度を満足するまで、このプロセスを繰り返す。機能とXGBoost二次テイラー展開のこの損失は、同じ原理であり、目的関数とF_T-1(X)ニュートン法を使用するように、一次導関数を求めるとXGBoost、紙と、このブログと連動してリーフノード重みの次の更新で得られF_T-1(X)またはw_q(X)です。それが理解するのは非常に簡単です、それは)何度も何度も見て価値があります

 

 なぜ最適化と応援はニュートンの法則と呼ばれますか?明らかに応援して問題をゼロ、それは(私は突然光を参照してください)Baiduの百科事典「答え」を見て、明らかに無テイラー展開ああ接線まあ、次のとおりです。

 注キーワード:方程式、テイラー級数、直線部分を取って、近似式。

 

以下の詳細な分析を行う、(ハンドアプリ導出処理によって)誘導された反復関係、及びコードを与えます。

 

 

 

 

 要約:

私たちは、上記の分析、ニュートン法から見ると接線法による漸化式が同じで来ることができる、してみましょう接線法はニュートン法の幾何学的表現と考えることができます。

この場合、いわゆるニュートン法は、もはや私には神秘的ではありませんので、私はあまりにも、あなたを願っています!

int mySqrt(int x) {
    long long ans = x;
    while (ans * ans > x) {  // 其实,我很疑惑:如果ans很大的情况下,ans*ans不应该会报错吗
        ans = (ans + x / ans) / 2; // 由公式化简得来
    }
    return ans;
}

至此,Leetcode上的这道 “Easy” 题目已经解决。但是往往在面试或实际问题中,要求最后得到的结果具备一定精度,即ans*ans - x < ε。此外,如果要求 ans值满足某一精度,我们就必须使用sqrt()求出其真实开根号值,然后作为判断条件。下面对一种进行代码书写,整体思路和不带精度相同,但是要注意需要把int型转为double型!

二分法:

double mySqrt(double x, double epsilon) {
    double left = 1.0;
    double right = x;
    double mid = left + (right - left) / 2;
    while (fabs(mid * mid - x) > epsilon) {  // 默认mid * mid不会超过范围,否则这道题就麻烦了
        if (mid * mid > x) {
            right = mid;
        }
        else if (mid * mid < x) {
            left = mid;
        }
        else {
            returnミッド; 
        } 
        ミッド =左+(右-左)/ 2 
    } 
    を返す半ばを。
}

ニュートン法:

ダブル mySqrt(デュアル X、ダブルイプシロン){
     ダブル年=のX;
    一方、 - (X)>ファブ(年年* {イプシロン) =(X +年/年)/ 2 
    } 
    戻り年。
}

 

注意:

数学表記の知識イプシロン:のような、ε

 

おすすめ

転載: www.cnblogs.com/Flash-ylf/p/11558567.html