关注下方公众号,分享硬核知识

作者 | 小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?相关推荐

  1. 搬砖:算法经典面试题

    算法经典面试题 https://blog.csdn.net/pcpanchen/article/details/16851151 1.把二元查找树转变成排序的双向链表  题目: 输入一棵二元查找树,将 ...

  2. 左神讲算法——异或的高级操作(两数交换+经典面试题)

    目录 1. 异或的性质 2. 两数交换 3. 经典面试例题 参考链接:2021最新左神数据结构算法全家桶 1. 异或的性质 异或可以看成相同为1,不同为0:也可以看作无进位相加,有奇数个1则结果为1, ...

  3. Python工程师求职必知的经典面试题

    最近几年,学习Python语言的同学越来越多,学成之后大家对于后期的面试都遇到了很多难题,小编这次为大家整理了一份关于Python工程师求职必知的经典面试题!希望能够帮助到正在找Python工作的同学 ...

  4. Top 10国际大厂人工智能岗位经典面试题精选

    Top 10国际大厂人工智能岗位经典面试题精选 https://www.toutiao.com/a6635196559355019780/ 2018-12-15 20:31:25 AI专业应届毕业生年 ...

  5. 面试题:如何求根号2

    来源:算法面试题 问题 小E最近找实习的时候,被面试官问了这样一道题:如何求根号2的值? 小E没能答上来,回来后向老师请教. 思路 点评:以上介绍了二分法和牛顿迭代法来求解根号2,另外我们还可以通过泰 ...

  6. Python工程师求职必知的经典面试题分享

    Python开发求职必知什么?有哪些经典的面试题?Python语法简单.功能强大,人才需求旺盛,是很多入行IT人士首选的编程语言.然而在学习理论技能.积累实战经验之余,想要拿到高薪,我们一定要经历一道 ...

  7. Python工程师求职必知的经典面试题!

    最近几年,学习Python语言的同学越来越多,学成之后大家对于后期的面试都遇到了很多难题,小编这次为大家整理了一份关于Python工程师求职必知的经典面试题!希望能够帮助到正在找Python工作的同学 ...

  8. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  9. java 1.8有没有jshell_收藏了800道Java后端经典面试题,分享给大家,希望你找到自己理想的Offer呀~...

    前言 在茫茫的互联网海洋中寻寻觅觅,我收藏了800+道Java经典面试题,分享给你们.建议大家收藏起来,在茶余饭后拿出来读一读,以备未雨绸缪之需.另外,面试题答案的话,我打算后面慢慢完善在github ...

最新文章

  1. 机器学习系列 5:特征缩放
  2. 计算机复试通知学校,提醒:部分学校复试通知已经出了!教育部关于21考研复试的规定!...
  3. 如何在Ubuntu里安装Helm
  4. SpringBoot 自带工具类~CollectionUtils
  5. java steam filter 动态条件_Filter解决全站编码问题
  6. (132)FPGA面试题-Verilog实现格雷码转二进制
  7. bambook引起的adb启动异常的问题
  8. JavaScript数据结构——集合(Set)
  9. Vue 中的列表渲染
  10. Dapper.NET—轻量ORM
  11. 说说Thread的interrupt()
  12. 用EEupdate修改Intel网卡类型
  13. 大数据技术就在生活中: 登机牌、阅卷与 Map-Reduce(归约)
  14. 常用性能测试工具有哪些
  15. 十大思想实验(思维风暴)
  16. 竑观资产合伙人孙霄汉:区块链经济三个系统的X关系
  17. B站哔哩哔哩:11 月 22 日上午九时正起恢复在香港联交所买卖
  18. 费曼技巧在学习中的应用
  19. 字节还能如何“跳动”
  20. idea中的jar包在哪里导入?

热门文章

  1. 直播liveapp Android,Rockett Live
  2. python实现lfm_推荐系统之隐语义模型(LFM)
  3. python连接redis数据库
  4. ArcGIS安装报错 Error: Error 1935: An error occurred during the installation of assembly
  5. 一天测血压的最佳时间_一天二十四小时,什么时候身体时间测量血压最准确?...
  6. 人工智能Java SDK:大数据与AI技术相结合 - kafka-人脸检测
  7. 阿里云安装配置kafka
  8. 互动直播之WebRTC服务开源技术选型
  9. elk部署 win_ELK安装--Win10环境
  10. php中readfile的用法,怎么在php中利用readfile() 函数设置文件的大小