Java习题之实现平方根(sqrt)函数

news2024/11/23 12:33:40

目录

前言

二分查找

牛顿迭代法

总结


 

🎁博主介绍:博客名为tq02,已学C语言、JavaSE,目前学了MySQL和JavaWed

🎥学习专栏:  C语言        JavaSE      MySQL基础

🎄博主链接:tq02的博客_CSDN博客-C语言,Java,MySQL领域博主

前言

        可使用java.lang.Math类的sqrt(double)方法求平方根。Math是java.lang包中的类,而Double为对象中的基本类型。但是如果不使用库函数呢?有什么办法实现平方根函数呢?

        方法:二分查找牛顿迭代法、利用平方数的性质


利用平方数的性质

        平方数的性质:n²=1+1+2+2+....+n-1+n-1+n。例如4²=1+1+2+2+3+3+4=16。

1+3为2的平方,1+3+5为3的平方,

也就是说每一次加一个奇数,再设置一个变量记录加了多少个奇数。 

复杂度分析:
时间复杂度:O(N),每次+2的循环,为(1/2)N的时间复杂度,去掉系数,为O(N)
空间复杂度: O(1),只使用了有限常数个变量;

int sqrt(int x) {
     if(x<=0) return 0;  //小于等于0 返回0
     int ans = 1; 
     int num = 1;
     int  i = 3;
     while(num+i<=x){
         num+=i;  
          ans ++; // 每加一个奇数,ans+1
          i += 2;
        }
        return ans;
    }

二分查找

        如果求解一个数的平方根,这个结果肯定是在1到这个数的范围,因此我们可以使用二分查找的方法。例如求解x的平方根,思路

  1. 初始范围:1 ~ x,使用left标记1,right标记x ,取left~right的中间值,为 middle
  2. middle*middle <= x && (middle+1)*(middle+1) > x时,返回结果
  3. 当 middle*middle < x时,到右半部分继续寻找,范围改成 middle+1 ~ right
  4. middle*middle > x时,到左半部分继续寻找,范围改成 left ~ middle+1

注: 这种方法只能使用于整数的开跟

复杂度分析:
时间复杂度:O(logn),二分查找的复杂度,每次循环减少一半
空间复杂度;O(1),只使用了有限常数个变量;

代码实现: 

public int mySqrt(int x) {
    if (x <= 0) {
        return 0;
    }
    int left = 1, right = x;
    while (true) {
        int middle = (left + right) >> 1;
        if (middle <= x / middle && (middle+1) > x / (middle+1)) {
            return (int) middle;
        } else if (middle < x / middle) {
            left = middle + 1;
        } else {
            right = middle - 1;
        }
    }
}

牛顿迭代法

牛顿迭代法简介

         假设方程 F(x)=0  在 x 附近有一个根,那么用以下迭代式子:

 依次计算X1、X2、X3、...........那么序列将无限逼近方程的根。

  牛顿迭代法的原理很简单,其实是根据f(x)在x0附近的值和斜率,估计f(x)和x轴的交点,看下面的动态图:

 代码示例:

public class Solution {
	public int sqrt (int x) {//牛顿迭代法
        if(x==0||x==1) return x;//题中告诉我们x的范围: 0 <= x < 2^31-1
		long X0 = x;//使用int进行加法运算可能溢出,所以采用long型
		long X1 = 0;//下一个迭代变量,为了方便理解,也可只使用X0
		while(X0 > x/X0 ) {    // X0^2>x循环
			X1=(X0+x/X0) >> 1;//由迭代公式得,采用右移1位操作代替除以2,运算更快
			X0=X1;//把下一个迭代变量赋给X0,统一操作,方便继续处理
		}
		return (int)X0;//返回值类型为int,因此需要做强制类型转换
    }
}

       

总结

        牛顿迭代法不像二分查找法、平方数,需要唤醒一下各位哥哥姐姐们的高中数学知识,只有这样才能理解该公式。如果唤醒失败,推荐使用二分查找法,不要逞强哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第四章 flutter-初识flutter】

文章目录 一、目录结构二、创建一个flutter项目三、创建自定义组件四、Container组件 就是divalignment 内容对齐方式decoration 类似border 为BoxDecoration的类 五、Text属性六、image组件总结、 一、目录结构 android、ios各自平台的资源文件 lib 项目目录 linux macos PC平…

Linux宝塔Mysql读写分离配置,两台服务器,服务器存在多个库

Linux宝塔Mysql读写分离配置&#xff0c;两台服务器&#xff0c;服务器存在多个库 一、主库操作 #登录数据库&#xff0c;用root登录方便&#xff0c;用其他账号会提示权限不足&#xff0c;需要登录root给予权限 mysql -u root -p 密码#创建一个账号&#xff0c;供从库用该账…

电商企业需要部署WMS仓储管理系统吗

随着电子商务行业的迅速发展&#xff0c;电商企业面临着日益增长的订单量和复杂的物流流程。为了提高仓储管理的效率和准确性&#xff0c;许多电商企业开始考虑部署WMS仓储管理系统。然而&#xff0c;是否真的需要部署WMS仓储管理系统&#xff0c;仍然是一个值得探讨的问题。本…

vLLM大模型推理加速方案原理(PagedAttention)

一、vLLM 简介 vLLM 用于大模型并行推理加速&#xff0c;核心是 PagedAttention 算法&#xff0c;官网为&#xff1a;https://vllm.ai/。 vLLM 主要特性&#xff1a; 先进的服务吞吐量通过 PagedAttention 对注意力 key 和 value 进行内存管理对传入请求的批处理针对 CUDA 内…

纯代码和低代码的本质区别

一、前言 纯代码和低代码是现代软件开发中两种不同的方法。 纯代码需要专业的编程技能&#xff0c;掌握编程语言、算法和数据结构等专业知识。而低代码则是一种新兴的开发方法&#xff0c;它大大降低了对编程技能的要求&#xff0c;让非技术人员也能够创建应用程序。随着低代码…

【SpringBoot】--03.数据访问、基础特性(外部化和内部外配置、整合JUnit)

文章目录 SpringBoot3-数据访问1.整合SSM场景1.1创建SSM整合项目1.2配置数据源1.3配置MyBatis1.4CRUD编写 2.自动配置原理3.扩展&#xff1a;整合其他数据源3.1 Druid 数据源 SpringBoot3-基础特性1. SpringApplication1.1 自定义 banner1.2.自定义 SpringApplication1.3Fluent…

nvm 管理node 环境配置

nvm安装&#xff1a; nvm&#xff08;Node Version Manager&#xff09;是一个用来管理node版本的工具。我们之所以需要使用node&#xff0c;是因为我们需要使用node中的npm(Node Package Manager)&#xff0c;使用npm的目的是为了能够方便的管理一些前端开发的包&#xff01;…

ColorOS凭什么夺冠?

摘要&#xff1a;五大主流安卓系统流畅度PK&#xff0c;谁的体验最好&#xff1f; 评价一款手机&#xff0c;你最先看的是什么&#xff1f; 是处理器平台&#xff1f;CPU核心频率&#xff1f;还是内存配置&#xff1f; 虽然这些硬件参数能够清晰地反映几款不同配置手机之间的性…

20230712-----阻塞IO驱动按键控制LED灯的亮灭

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/device.h> #include <linux/cdev.h> #include <linux/slab.h> #include <linux/uaccess.h> #include <linux/of.h> #in…

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

敢不敢和AI比猜拳?能赢算我输----基于手势识别的AI猜拳游戏【含python源码+PyqtUI界面+原理详解】-python手势识别 深度学习实战项目

功能演示 摘要&#xff1a;手势识别是一种通过技术手段识别视频图像中人物手势的技术。本文详细介绍了手势识别实现的技术原理&#xff0c;同时基于python与pyqt开发了一款带UI界面的基于手势识别的猜拳游戏。手势识别采用了mediapipe的深度学习算法进行手掌检测与手部的关键点…

字符设备驱动开发(最初方式)

目录&#xff1a; 1.字符设备驱动简介2.字符设备驱动开发步骤2.1. 驱动模块的加载与卸载2.2. Makefile的编写2.3.字符设备的注册与注销2.3.1.设备号的组成2.3.2.设备号的分配 2.4.具体操作函数的实现2.4.1.进行打开和关闭操作2.4.2.对chrdev进行读写操作 3.具体程序的实现3.1.驱…

第十一章——使用类

运算符重载 运算符重载是一种形式的C多态。之前介绍过的函数重载&#xff08;定义多个名称相同但特征标不同的函数&#xff09;让程序员能够用同名的函数来完成相同的基本操作&#xff0c;即使这些操作被用于不同的数据类型。 运算符重载将重载的概念扩展到运算符上&#xff0…

gulimall-性能监控与压力测试

性能监控与压力测试 前言一、性能监控1.1 jvm 内存模型1.2 jvisualvm 作用1.3 监控指标 二、压力测试2.1 概念2.2 性能指标2.3 JMeter 压测工具 前言 本文继续记录B站谷粒商城项目视频 P141-150 的内容&#xff0c;做到知识点的梳理和总结的作用。 一、性能监控 1.1 jvm 内存…

灯具小程序怎么制作

灯具小程序怎么制作&#xff0c;有什么功能 1. 商品展示&#xff1a;灯具小程序商城提供了丰富多样的灯具产品&#xff0c;并通过清晰的商品展示页面展示给用户。用户可以浏览不同种类的灯具&#xff0c;包括吊灯、台灯、壁灯等&#xff0c;了解产品的图片、规格、价格等详细信…

python 文件夹py文件相互引用

文章目录 前言Python文件相互调用情况一&#xff1a;同级文件情况二&#xff1a;非同级文件上层调用下层下层调用上层sys.path.append(.)详细测试同名测试引入结论 跨文件夹调用 总结 前言 我之前学过一些别的语言&#xff0c;例如Java,C#,JS。所以我上手python还是挺快的&…

Threejs模型切片转3DTiles加载

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。获取模型或源码请点赞收藏加留言&#xff0c;有问…

Scala中的集合

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 一、集合简介 二、集合关系继承图 一、集合简介 Java中的集合&#xff1a; Scala中的集合&#xff1a; Scala的集合有三大类&#xff1a;序列Seq、集Set、映射Map&#xff0c;所有的集合…

Vue3+Vite+Pinia+Naive后台管理系统搭建之七:utils 工具构建

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步Vue3.0 基础入门&#xff0c;快速入门。 1. cookie 保存工具 1.1 安装依赖 yarn add js-cookie // or npm install js-cookie 1.2 编写 src/utils/cookie.js // src/utils/cookie.js import Cookies from "js-co…

操作系统_计算机系统

目录 1. 操作系统的基本概念 1.1 操作系统的特征 1.1.1 并发&#xff08;Concurrence&#xff09; 1.1.2 共享&#xff08;Sharing&#xff09; 1.1.3 虚拟&#xff08;Virtual&#xff09; 1.1.4 异步&#xff08;Asynchronism&#xff09; 1.2 操作系统的目标和功能 …