Java 查找算法

顺序查找

顺序查找算法是一种最简单的查找算法,它的基本思想是从数组的第一个元素开始,逐个比较,直到找到目标元素或遍历完整个数组。

以下是Java实现的顺序查找算法示例代码:

public class SequentialSearch {public static int search(int[] arr, int key) {for (int i = 0; i < arr.length; i++) {if (arr[i] == key) {return i; // 返回找到元素的索引}}return -1; // 如果未找到,返回-1}public static void main(String[] args) {int[] array = {1, 3, 5, 7, 9};int key = 5;int result = search(array, key);System.out.println("Element found at index: " + result);}
}

在这个示例中,我们定义了一个名为sequentialSearch的方法,它接受一个整数数组和一个目标整数作为参数。方法使用一个循环来遍历整个数组,并在每次迭代中检查当前元素是否等于目标元素。如果找到了目标元素,则返回其索引;否则,返回-1表示未找到目标元素。

二分查找

 

二分查找算法(Binary Search)是一种在有序数组中查找特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。

以下是Java实现的二分查找算法:

public class BinarySearch {public static int binarySearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9};int target = 5;int result = binarySearch(arr, target);System.out.println("目标值 " + target + " 在数组中的索引为: " + result);}
}

这段代码定义了一个名为binarySearch的方法,接受一个整数数组arr和一个整数目标值target作为参数。方法返回目标值在数组中的索引,如果目标值不在数组中,则返回-1。

插值查找

插值查找算法(Interpolation Search)是一种改进的二分查找算法,它根据要查找的关键字在有序数组中的位置来动态调整查找的范围。插值查找的基本思想是:如果要查找的关键字在数组中的位置越靠前,那么查找范围就越大;反之,如果要查找的关键字在数组中的位置越靠后,那么查找范围就越小。

以下是Java实现的插值查找算法:

public class InterpolationSearch {public static int interpolationSearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right && target >= arr[left] && target <= arr[right]) {int pos = left + (target - arr[left]) * (right - left) / (arr[right] - arr[left]);if (arr[pos] == target) {return pos;} else if (arr[pos] < target) {left = pos + 1;} else {right = pos - 1;}}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9};int target = 5;int result = interpolationSearch(arr, target);System.out.println("目标值 " + target + " 在数组中的索引为: " + result);}
}

这段代码定义了一个名为interpolationSearch的方法,接受一个整数数组arr和一个整数目标值target作为参数。方法返回目标值在数组中的索引,如果目标值不在数组中,则返回-1。

斐波那契查找

斐波那契查找(Fibonacci Search)是一种基于斐波那契数列的查找算法,它通过将待查找的数组分成不均等的两部分来提高查找效率。具体来说,它将数组分为两个部分,其中第一部分的长度为斐波那契数列中的一个数,第二部分的长度为斐波那契数列中的另一个数。然后根据要查找的元素与这两个部分的边界值的关系,来确定下一步查找的范围。

以下是Java实现的斐波那契查找算法:

public class FibonacciSearch {public static int fibonacciSearch(int[] arr, int target) {int low = 0;int high = arr.length - 1;int k = 0; // 斐波那契分割数值的下标// 获取斐波那契数列中的分割数值while (high > arr[k] - 1) {k++;low = high;high = high + arr[k];}// 创建临时数组并复制原数组的前k+1个元素int[] temp = new int[k + 1];for (int i = 0; i < k + 1; i++) {temp[i] = arr[i];}// 在临时数组中进行二分查找while (low <= high) {int mid = low + (high - low) / 2;if (target < temp[mid]) {high = mid - 1;} else if (target > temp[mid]) {low = mid + 1;} else {return mid;}}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int target = 7;int result = fibonacciSearch(arr, target);System.out.println("目标值 " + target + " 在数组中的索引为: " + result);}
}

这段代码定义了一个名为fibonacciSearch的方法,接受一个整数数组arr和一个整数目标值target作为参数。方法返回目标值在数组中的索引,如果目标值不在数组中,则返回-1。

分块查找

分块查找(Block Search)是一种改进的二分查找算法,它将待查找的数组分成若干个大小相等的块,然后在每个块内进行二分查找。这种算法适用于数据量较大、分布不均匀的有序数组。

以下是Java实现的分块查找算法:

public class BlockSearch {public static int blockSearch(int[] arr, int target) {int blockSize = (int) Math.sqrt(arr.length); // 计算块的大小int low = 0;int high = arr.length - 1;while (low <= high) {int mid = low + (high - low) / 2;int blockIndex = mid / blockSize; // 计算mid所在的块的索引int blockStart = blockIndex * blockSize; // 计算块的起始位置int blockEnd = Math.min(blockStart + blockSize - 1, arr.length - 1); // 计算块的结束位置if (target >= arr[blockStart] && target <= arr[blockEnd]) {// 如果目标值在当前块内,则在当前块内进行二分查找return binarySearch(arr, target, blockStart, blockEnd);} else if (target < arr[blockStart]) {high = blockStart - 1;} else {low = blockEnd + 1;}}return -1;}private static int binarySearch(int[] arr, int target, int low, int high) {while (low <= high) {int mid = low + (high - low) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int target = 7;int result = blockSearch(arr, target);System.out.println("目标值 " + target + " 在数组中的索引为: " + result);}
}

这段代码定义了一个名为blockSearch的方法,接受一个整数数组arr和一个整数目标值target作为参数。方法返回目标值在数组中的索引,如果目标值不在数组中,则返回-1。

哈希查找

哈希查找(Hash Search)是一种基于哈希表的查找算法,它通过将待查找的元素映射到一个哈希表中的位置,然后直接访问该位置来查找元素。哈希查找的时间复杂度为O(1),因此查找速度非常快。

以下是Java实现的哈希查找算法:

import java.util.HashMap;public class HashSearch {public static int hashSearch(int[] arr, int target) {HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < arr.length; i++) {map.put(arr[i], i); // 将数组元素作为键,下标作为值存入哈希表}return map.getOrDefault(target, -1); // 查找目标值在哈希表中对应的下标,如果不存在则返回-1}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int target = 7;int result = hashSearch(arr, target);System.out.println("目标值 " + target + " 在数组中的索引为: " + result);}
}

这段代码定义了一个名为hashSearch的方法,接受一个整数数组arr和一个整数目标值target作为参数。方法返回目标值在数组中的索引,如果目标值不在数组中,则返回-1。

树表查找

树表查找(Tree Table Search)是一种基于树形结构的查找算法,它通过将待查找的元素与树表中的节点进行比较,然后根据比较结果在树表中进行递归查找。

以下是Java实现的树表查找算法:

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class TreeTableSearch {public static boolean search(TreeNode root, int target) {if (root == null) {return false;}if (root.val == target) {return true;}return search(root.left, target) || search(root.right, target);}public static void main(String[] args) {TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);root.right.left = new TreeNode(6);root.right.right = new TreeNode(7);int target = 5;boolean found = search(root, target);System.out.println("Target " + target + " found: " + found);}
}

这段代码定义了一个名为TreeNode的类,表示树表中的节点。search方法接受一个根节点和一个目标值作为参数,返回一个布尔值表示是否找到了目标值。在main方法中,我们创建了一个简单的树表,并调用search方法查找目标值。

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

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

相关文章

设计模式|访问者模式(Visitor Pattern)

文章目录 结构举例优缺点优点缺点代码示例常见面试题访问者模式是一种行为设计模式,它允许在不改变已有类的情况下定义一组新的操作。 这些操作通常分散在不同的类中,但是希望能够对这些类的对象进行统一的处理。 访问者模式的核心思想是将操作从对象结构中分离出来,使得可以…

请把「睡一个好觉」,当成一天里最重要的事来管理

我发现许多人都有这么一种情况&#xff1a;明明知道睡眠很重要&#xff0c;但却总是有意无意地熬夜。 比如&#xff1a; 给自己排了太多的学习和工作量&#xff0c;一不小心就到了凌晨一两点&#xff1b; 总觉得过去的一天什么都没干&#xff0c;宁愿在网上闲逛&#xff0c;也不…

ChatGPT:提升写作效率的必备工具

ChatGPT无限次数:点击直达 html ChatGPT&#xff1a;提升写作效率的必备工具 作为一名有着10年经验的CSDN网站原创文章优质创作者&#xff0c;写作效率对我来说至关重要。在这篇文章中&#xff0c;我将分享如何利用ChatGPT这一强大工具提升写作效率&#xff0c;以及具体的实…

Nacos源码分析,Nacos如何注册一个服务实例?

作为SpringCloudAlibaba微服务架构实战派上下册和RocketMQ消息中间件实战派上下册的作者&#xff0c;我来给大家带来Nacos源码系列的技术文章。 HTTP方式注册服务实例 Naocs使用InstanceController类的HTTP方法register()提供注册服务实例的功能。 /*** 注册服务实例到注册中…

低代码开发平台权威推荐:创新开发、领跑市场!

Gartner是低代码领域的一家权威机构&#xff0c;该机构常常通过"魔力象限"的研究方法&#xff0c;评选全球范围内IT细分领域的产品&#xff0c;来帮助决策者提供重要的咨询建议。本文盘点了Gartner机构推荐的6款低代码平台&#xff1a;Zoho Creator、Mendix、Oracle、…

Java 中建造者模式,请用代码具体举例

建造者模式是一种创建型设计模式&#xff0c;它允许你创建一个复杂对象的不同部分并将它们组装在一起&#xff0c;以产生最终的对象。以下是一个简单的 Java 示例&#xff0c;演示了建造者模式的用法&#xff1a; // 产品类 class Computer {private String cpu;private String…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢&#xff1f; 1.2. 市场主流 JVM 分析&#xff1f; 1.3. 为什么要学习 JVM&#xff1f; 1.4. 字节码底层是如何执行呢&#xff1f; 如何理解 JIT 呢&#xff1f; 为什么 JVM 中解释执行与编译执行的并存&#xff08;混合模式&…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…

el-drawer二次封装进行可拖拽

1.想要的效果 鼠标放到上面出现箭头显示可拖拽得图标 2.代码实现 2.1封装成自定义指令 // drawerDragDirective.js // 定义指令 const drawerDragDirective {// 指令绑定时的处理函数bind(el, ) {const minWidth 300;const dragDom el.querySelector(.el-drawer);// 创…

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…

【Linux】提升Linux命令行效率:光标移动和文本操作的键盘快捷键

Just 那么年少 还那么骄傲 两眼带刀 不肯求饶 即使越来越少 即使全部都输掉 也要没心没肺地笑 Just 那么年少 我向你招手 让你看到 我混账到老 天涯海角 天荒地老 只等你摔杯为号 &#x1f3b5; 朴树《Forever Young》 Linux命令行界面&#xff08;CLI&am…

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS二次开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点…

故障转移-redis

4.4.故障转移 集群初识状态是这样的&#xff1a; 其中7001、7002、7003都是master&#xff0c;我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢&#xff1f; 直接停止一个redis实例&#xff0c;例如7002&#xff1a; redis-cli -p 7002 sh…

保持微软Microsoft Teams始终在线的方案

保持微软Microsoft Teams始终在线的方案 背景方案 背景 目前使用微软Teams办公的小伙伴很多&#xff0c;但是长时间不操作电脑就被自动设置成离线状态。对于在电脑前学习书本或者在思考问题的小伙伴就显得不太友好&#xff0c;因为即使我们不操作电脑我们也时刻在电脑前&#…

定时器产生延时停止

1&#xff0c;需求&#xff1a; 当按下按钮SB1,输出信号为0N,指示灯点亮;按下按钮SB2,经过10s的延时后,指示灯熄灭 2&#xff0c;关闭使用定时的常闭触电

Python 如何的调试模式使用 Python 的内置调试器 pdb 或者集成开发环境(IDE)如 PyCharm、Visual Studio Code

Python 的调试模式通常是通过使用 Python 的内置调试器 pdb 或者集成开发环境&#xff08;IDE&#xff09;如 PyCharm、Visual Studio Code 等中的调试工具来实现的。 使用 pdb pdb 是 Python 的标准库中的一个模块&#xff0c;它提供了一个交互式的源代码调试器。你可以使用…

Graphql mock 方案

GraphQL API 的强类型本质非常适合模拟。模拟是 GraphQL Code-First 开发过程的重要组成部分&#xff0c;它使前端开发人员能够构建 UI 组件和功能&#xff0c;而无需等待后端实现。 我们期望基于 TS 强类型定义的特点以及中后台常见列表、详情的数据类型共性&#xff0c;实现…

HG泄露(ctfhub)

工具准备&#xff1a;dirsearch、dvcs-ripper 网络安全之渗透测试全套工具篇&#xff08;内含安装以及使用方法&#xff09;_dvcs-ripper-CSDN博客 dvcs-ripper&#xff1a;一款perl的版本控制软件信息泄露利用工具&#xff0c;支持bzr、cvs、git、hg、svn... tree //树状…

APP开发_Android 与 js 互相调用

1 js 调用 Android 方法 当使用 JavaScript 调用 Android 原生方法时&#xff0c;主要涉及到 Android 的 WebView 组件&#xff0c;它允许你在 Android 应用中嵌入网页内容&#xff0c;并提供了 JavaScript 与 Android 代码交互的能力。 &#xff08;1&#xff09;创建JavaSc…

项目升级到jdk21后 SpringBoot相关组件的适配

了解到jdk21是一个LTS版本&#xff0c;可以稳定支持协程的功能。经过调研&#xff0c;将目前线上的jdk8升级到21&#xff0c;使用协程提升并发性能。 目前系统使用springBoot 2.0.3.RELEASE&#xff0c;并且引入了mybatis-spring-boot-starter、spring-boot-starter-data-redi…