经典面试题:如何快速求解根号2?
关注下方公众号,分享硬核知识
作者 | 小K
出品 | 公众号:小K算法 (ID:xiaok365)
01
故事起源
有一次小K去面试,面试官问我怎么求解根号2,这还用求,不就是1.414...
原来他是想让我用代码来实现求解根号2。
那还不简单吗,一行代码搞定。
然后,就没有然后了,下一个。。。
02
分析
回到正题,这个肯定不是想问你应该调用哪个函数,而是想问如何自己去实现一个这样的开方函数。
首先我们知道,一个数开方后肯定是某个固定的数。当这个数大于1时,开根号之后的数一定是小于原数的。
对于求解固定的数,且当给出一个数,可以快速判断出所给数是不是我们要的目标数,同时还能确定大小范围,这种问题就可以用二分查找来求解。
03
二分
先在0~n中间取一个数x,如果x^2小于n,则在右边区间继续查找,否则在左边区间继续查找。
如果n小于1,则要在区间[0,1]之间进行查找。
代码实现
bool is_equal(double a, double b) {return abs(a - b) <= 1e-7;
}double search(double n) {double left = 0, right = n;double mid = (left + right) / 2;while (!is_equal(mid * mid, n)) {if (mid * mid > n) {right = mid;} else {left = mid;}mid = (left + right) / 2;}return mid;
}
二分是log(n)的复杂度,已经非常优秀了。要是这时面试官继续挑战你呢?那就得秀一波操作了,即牛顿迭代法。
04
牛顿迭代法
那啥是牛顿迭代法呢,接下来就跟着小K的思路一起来研究一下。
有一个函数y=f(x),图像如下。
在x轴上取一点x0,那在y轴对应的函数值就是f(x0),即y0。
过点(x0,y0)做一条与函数f(x)相切的直线,该直线的斜率k也就是函数在该点的导数,也叫微商(微分之商)。
过点(x0,y0),斜率为k的直线,通过点斜式就可以很容易得到这条直线的方程,即y=k(x-x0)+y0。
该直线与x轴是有一个交点的,记为x1。令直线y=0,就可以轻松解出该直线与x轴的交点了,即x1=x0-y0/k0。
此时我们发现x1相对于x0,在向左移动。
如果重复上面的操作,通过(x1,y1)再作一条直线,得到直线方程。再令y=0,可解得x2,即与x轴的新交点。
我们发现x2又向左移动了,如果多重复几次上面的操作,就会发现xn在无限趋近一个点,那就是最开始曲线函数f(x)与x轴的交点。而这个交点也可以看成是f(x)=0的方程的解。
如此,我们就得到了一种求解方程的迭代法,这就是牛顿迭代法。
那通过牛顿迭代法如何求解根号2呢?
05
求解根号
首先我们需要构造一个函数f(x),把目标数变成求解一个函数与x轴的交点,即方程f(x)=0的根。
再用上面的牛顿迭代法,就可以得到目标数“根号n”了。牛顿迭代法也有它的局限性,可能一些函数无法收敛。
还有一个问题就是第一个点x0的选择,如果第一个点选择了x0=0,这时斜率为0,也不可能与x轴相交,那就只能bbq了。
代码实现
// 判断相等,浮点数要考虑精度的问题
bool is_equal(double a, double b) {return abs(a - b) <= 1e-7;
}
// 函数f(x)
double f(double x, double n) {return x * x - n;
}
// 导数f'(x)
double fd(double x) {return 2 * x;
}
double solve(double n) {double x0 = 0, x1 = n;while (!is_equal(x1, x0)) {x0 = x1;x1 = x0 - f(x0, n) / fd(x0);}return x1;
}
06
总结
二分法通逧易懂,常规操作,时间复杂度也低。而牛顿迭代法收敛速度更快,但函数和初始点的选择都会有影响。两种解法都是不错的思路,领悟了思想,可以用在更多的场景上。
本文原创作者:小K,一个思维独特的写手。
文章首发平台:微信公众号【小K算法】。
如果喜欢小K的文章,请点个关注,分享给更多的人,小K将持续更新,谢谢啦!
关注下方公众号,分享硬核知识
关注我,涨知识
原创不易,感谢分享
转发,点赞,在看!
▼
往期精彩回顾
▼
很幸运,我还有工作
刷题老超时?那是因为你不会开挂
第一次修U盘,没想到...
分享给更多朋友,转发,点赞,在看
经典面试题:如何快速求解根号2?相关推荐
- 搬砖:算法经典面试题
算法经典面试题 https://blog.csdn.net/pcpanchen/article/details/16851151 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将 ...
- 左神讲算法——异或的高级操作(两数交换+经典面试题)
目录 1. 异或的性质 2. 两数交换 3. 经典面试例题 参考链接:2021最新左神数据结构算法全家桶 1. 异或的性质 异或可以看成相同为1,不同为0:也可以看作无进位相加,有奇数个1则结果为1, ...
- Python工程师求职必知的经典面试题
最近几年,学习Python语言的同学越来越多,学成之后大家对于后期的面试都遇到了很多难题,小编这次为大家整理了一份关于Python工程师求职必知的经典面试题!希望能够帮助到正在找Python工作的同学 ...
- Top 10国际大厂人工智能岗位经典面试题精选
Top 10国际大厂人工智能岗位经典面试题精选 https://www.toutiao.com/a6635196559355019780/ 2018-12-15 20:31:25 AI专业应届毕业生年 ...
- 面试题:如何求根号2
来源:算法面试题 问题 小E最近找实习的时候,被面试官问了这样一道题:如何求根号2的值? 小E没能答上来,回来后向老师请教. 思路 点评:以上介绍了二分法和牛顿迭代法来求解根号2,另外我们还可以通过泰 ...
- Python工程师求职必知的经典面试题分享
Python开发求职必知什么?有哪些经典的面试题?Python语法简单.功能强大,人才需求旺盛,是很多入行IT人士首选的编程语言.然而在学习理论技能.积累实战经验之余,想要拿到高薪,我们一定要经历一道 ...
- Python工程师求职必知的经典面试题!
最近几年,学习Python语言的同学越来越多,学成之后大家对于后期的面试都遇到了很多难题,小编这次为大家整理了一份关于Python工程师求职必知的经典面试题!希望能够帮助到正在找Python工作的同学 ...
- java面试题_阿里大厂流出的数百道 Java 经典面试题
BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...
- java 1.8有没有jshell_收藏了800道Java后端经典面试题,分享给大家,希望你找到自己理想的Offer呀~...
前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github ...
最新文章
- 机器学习系列 5:特征缩放
- 计算机复试通知学校,提醒:部分学校复试通知已经出了!教育部关于21考研复试的规定!...
- 如何在Ubuntu里安装Helm
- SpringBoot 自带工具类~CollectionUtils
- java steam filter 动态条件_Filter解决全站编码问题
- (132)FPGA面试题-Verilog实现格雷码转二进制
- bambook引起的adb启动异常的问题
- JavaScript数据结构——集合(Set)
- Vue 中的列表渲染
- Dapper.NET—轻量ORM
- 说说Thread的interrupt()
- 用EEupdate修改Intel网卡类型
- 大数据技术就在生活中: 登机牌、阅卷与 Map-Reduce(归约)
- 常用性能测试工具有哪些
- 十大思想实验(思维风暴)
- 竑观资产合伙人孙霄汉:区块链经济三个系统的X关系
- B站哔哩哔哩:11 月 22 日上午九时正起恢复在香港联交所买卖
- 费曼技巧在学习中的应用
- 字节还能如何“跳动”
- idea中的jar包在哪里导入?
热门文章
- 直播liveapp Android,Rockett Live
- python实现lfm_推荐系统之隐语义模型(LFM)
- python连接redis数据库
- ArcGIS安装报错 Error: Error 1935: An error occurred during the installation of assembly
- 一天测血压的最佳时间_一天二十四小时,什么时候身体时间测量血压最准确?...
- 人工智能Java SDK:大数据与AI技术相结合 - kafka-人脸检测
- 阿里云安装配置kafka
- 互动直播之WebRTC服务开源技术选型
- elk部署 win_ELK安装--Win10环境
- php中readfile的用法,怎么在php中利用readfile() 函数设置文件的大小