当前位置: 首页 > news >正文

算法-查找算法

下面是使用 Java 实现的四种查找算法

  1. 线性查找(Linear Search)
  2. 二分查找(Binary Search)
  3. 插值查找(Interpolation Search)
  4. 斐波那契查找(Fibonacci Search)

✅ 1. 线性查找(Linear Search)

说明:

从数组的第一个元素开始,逐个比较,直到找到目标值或遍历完整个数组。

Java 实现:

public class LinearSearch {public static int linearSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) {return i; // 返回索引}}return -1; // 未找到}public static void main(String[] args) {int[] arr = {4, 2, 7, 1, 9, 3};int target = 7;System.out.println("Index of " + target + ": " + linearSearch(arr, target)); // 输出 2}
}

✅ 2. 二分查找(Binary Search)

说明:

适用于有序数组。每次将查找区间缩小一半,效率高,时间复杂度为 O(log n)

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, 11};int target = 7;System.out.println("Index of " + target + ": " + binarySearch(arr, target)); // 输出 3}
}

✅ 3. 插值查找(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 = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};int target = 60;System.out.println("Index of " + target + ": " + interpolationSearch(arr, target)); // 输出 5}
}

✅ 4. 斐波那契查找(Fibonacci Search)

说明:

基于斐波那契数列对数组进行分割,也是一种适用于有序数组的查找算法,平均性能与二分查找相当,但减少除法运算,在某些硬件环境下效率更高。

Java 实现:

public class FibonacciSearch {public static int fibonacciSearch(int[] arr, int target) {int n = arr.length;int[] fib = new int[20];fib[0] = 0;fib[1] = 1;int i = 1;while (fib[i] < n) {fib[++i] = fib[i - 1] + fib[i - 2];}int offset = 0;while (fib[i] > 1) {int k = Math.min(offset + fib[i - 2], n - 1);if (arr[k] < target) {offset = k;fib[i] = fib[i - 1];fib[i - 1] = fib[i - 2];i--;} else if (arr[k] > target) {fib[i] = fib[i - 2];fib[i - 1] = fib[i - 1] - fib[i - 2];i--;} else {return k;}}if (fib[i - 1] == 1 && arr[offset + 1] == target) {return offset + 1;}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15};int target = 9;System.out.println("Index of " + target + ": " + fibonacciSearch(arr, target)); // 输出 4}
}

✅ 查找算法对比表

查找算法数据要求时间复杂度空间复杂度特点
线性查找无序数组O(n)O(1)简单,适合小数据量
二分查找有序数组O(log n)O(1)高效,常用
插值查找有序数组(分布均匀)O(log log n) ~ O(n)O(1)数据均匀时性能更好
斐波那契查找有序数组O(log n)O(1)避免除法,适合特定环境

✅ 总结

  • 线性查找:最简单,但效率低,适合小数据或无序数组。
  • 二分查找:最常用,适用于有序数组,效率高。
  • 插值查找:适用于数据分布均匀的场景,性能优于二分查找。
  • 斐波那契查找:减少除法操作,适合某些硬件环境,实现稍复杂。

在实际开发中,根据数据是否有序、数据分布、性能需求等选择合适的查找算法。

http://www.dtcms.com/a/285802.html

相关文章:

  • Git分支管理与Stash技巧:从基础到高级工作流详解
  • C++ - 仿 RabbitMQ 实现消息队列--需求分析与模块设计
  • # Redis-stable 如何在Linux系统上安装和配置
  • 文件流导出文件
  • 小米深圳大厦正式开园,为全球化竞争注入新动能
  • Golang 中 JSON 和 XML 解析与生成的完全指南
  • 一段黄昏小感
  • Linux地址空间
  • 论文分享 | LABRADOR:响应引导的针对物联网设备的黑盒模糊测试
  • 基于ASP.NET+SQL Server的网站登录注册功能设计与实现
  • 软件工程中的《资本论》
  • 文档处理控件TX Text Control系列教程:使用 C# .NET 将二维码添加到 PDF 文档
  • stack and queue 之牛刀小试
  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • PDF批量拆分、合并、转图、加密一站式解决方案
  • 文件上传 ,显示文件列
  • 区别下IO多路复用,reactor,事件循环(EventLoop),Epoll这几个的概念以及之间的关系
  • uni-app 跳转外部连接
  • JS获取 CSS 中定义var变量值
  • Android性能优化之网络优化
  • LangChain 源码剖析(三):连接提示词与大语言模型的核心纽带——LLMChain
  • Jmeter使用教程
  • 闭包的定义和应用场景
  • [安洵杯 2019]easy_web
  • 深度学习×第10卷:她用一块小滤镜,在图像中找到你
  • DOM 文档对象模型
  • 【移动端知识】移动端多 WebView 互访方案:Android、iOS 与鸿蒙实现
  • Esbuild-新一代极速前端构建打包工具
  • 基于单片机多功能称重电子称设计
  • 前端下载文件并按GBK编码解析内容