Sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x.

 

传说中的牛顿法,请查看百度百科

某人说我偷懒,那我就决定还是翻些资料出来比较好。。。

牛顿法主要用于两方面,一是求方程根,二是最优化处理。

求方程根的原理是利用泰勒公式在x0处展开,且展开到一阶,即f(x) = f(x0)+(x - x0)f'(x0)

 

求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0 - f(x0)/f'(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x - x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比f(x0)更接近f(x)=0。

因此,不断对方程式进行迭代,可以进而推出x(n+1)=x(n)-f(x(n))/f'(x(n)),最后,这个式子必然在f(x*)=0的时候收敛。整个过程如下图:

 

该题要求某数的正平方根,因此可以构造函数 f(x) = x2 - a,f(x) = 0 选取x1 = 1 利用泰勒公式进行展开,可以得出一系列x2,x3,x4....,当x(n-1)和x(n)之间差值近乎为0,这是可以认为已经收敛,x(n)是方程f(x) = x2 - a的解。

 

 1 class Solution {
 2 public:
 3     int sqrt(int a) {
 4         if( a <= 0 ) return 0;
 5         double x1 = 0;
 6         double x2 = 1;
 7         while( abs( x1-x2 ) > 1e-7 ) {
 8             x1 = x2;
 9             x2 = x1/2 + 1.0*a / (2*x1);
10         }
11         return x1;
12     }
13 };

 

posted on 2014-09-06 20:30  bug睡的略爽  阅读(186)  评论(0编辑  收藏  举报

导航