使用二分法与牛顿迭代实现sqrt(int)

发布时间:2024-12-09 12:31

使用精益方法快速迭代产品 #生活技巧# #创意技巧# #设计思维应用#

最新推荐文章于 2023-03-11 22:36:53 发布

qustJHJ 于 2017-09-03 14:16:02 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

二分法实现sqrt(int)
使用二分法逼近求解sqrt(x)
x的根不大于x/2+1,只需在[0,X/2+1]内二分查找即可
证明:
假设 sqrt(x)<=x/2+1
则有 => x<= (x/2+1)^2 => x<=x^2/4+1+x => x^2/4+1 =>0
而 x^2/4+1 =>0恒成立。
由于实现的代码返回值 即x的根为int 型的,舍去了小数部分

int mySqrt(int x) { long long left=0; long long right=x/2+1; while(left<=right) { long long mid=(left+right)>>1; long long sq=mid*mid; if(sq==x) return mid; else if(sq<x)left=mid+1; else right=mid-1; } return right; }12345678910111213

牛顿迭代实现sqrt(int)
牛顿法(英语:Newton’s method)又称为牛顿-拉弗森方法(英语:Newton-Raphson method),它是一种在实数域和复数域上近似求解方程的方法。方法使用函数 f(x)的泰勒级数的前面几项来寻找方程 f(y)=0的根。

这里写图片描述
首先,选择一个接近函数f(x)零点的 x0,计算相应的 f(x0)和切线斜率 f’(x0)(这里 f’表示函数 f的导数)。然后我们计算穿过点 (x0,f(x0)并且斜率为 f’(x0)的直线和 x轴的交点的 x坐标,也就是求如下方程的解:
0=(x-x0)f’(x0})+f(x0)
我们将新求得的点的x坐标命名为x_1,通常 x_1会比 x0更接近方程 f(x)=0的解。因此我们现在可以利用 x_1开始下一轮迭代。迭代公式可化简为如下所示:
Xn+1=Xn - f(Xn)/f’(Xn)
如果 f’是连续的,并且待求的零点 x是孤立的,那么在零点 x周围存在一个区域,只要初始值x_{0}位于这个邻近区域内,那么牛顿法必定收敛。
并且,如果 f’(x)!=0,那么牛顿法将具有平方收敛的性能。粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

sqrt(int)的实现:
x^2=r => f(x)=x^2-r 当f(x)=0时的解,设(Xi,Xi^2-r)为f(x)上的一点,过该点的切线
方程为 f(x)-f(Xi)=f’(Xi)*(x-Xi),令切线方程等于0,即可求得x=x-f(Xi)/f’(Xi)
=> x=x-(Xi^2-r)/(2*Xi)=(Xi+r/Xi)/2
通过每次判断前后两次迭代出的结果是否相等来结束迭代

牛顿迭代中的重点之重在于初始点的选取,尽量选取靠近f(x)=0的x点,这样会节省计算次数。

int mySqrt2(int x){ long r=x/2+1; while(r*r > x) { r=(r+x/r)>>1; } return r; }12345678

网址:使用二分法与牛顿迭代实现sqrt(int) https://www.yuejiaxmz.com/news/view/423312

相关内容

常见的几种最优化方法(梯度下降法、牛顿法、拟牛顿法、共轭梯度法等)
用迭代法求x=√a求平方根的迭代公式为
牛顿法在非线性优化问题中的应用与挑战1.背景介绍 非线性优化问题在现实生活中非常常见,例如机器学习、图像处理、物理学等领
浅谈*迭代加深*深度优先搜索
C语言二分法实现
NYOJ
matlab 使用各种迭代法解分线性方程x^3+2*x^2+10*x
新消费产品如何实现持续迭代与创新?
8个 Python 加速运行优化技巧
手把手教你强化学习 (四)动态规划与策略迭代、值迭代

随便看看