Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)

Java实现查找算法的示例代码

在Java中,实现查找算法的方式有很多,包括线性查找、二分查找、插值查找、哈希查找等等。本文将详细讲解Java中实现三种常见的查找算法:二分查找、插值查找、斐波那契查找。

二分查找

二分查找也称为折半查找,是一种效率较高的查找算法。二分查找的条件是数据必须是有序的,每次查找都是将查找区间缩小一半,直到查找到目标或者查找区间为空为止。

二分查找的实现可以采用循环或递归的方式,下面是二分查找的示例代码:

public int binarySearch(int[] arr, int target) {
    int left = 0, right = arr.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] < target) {
            left = mid + 1;
        } else if (arr[mid] > target) {
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

示例说明:

在上面的代码中,首先定义了左右两个指针left和right,表示查找区间的左右两端。在每一次查找过程中,计算出mid=left+(right-left)/2表示中间位置,然后通过比较mid和target的大小,将查找区间缩小一半。如果arr[mid]target,则在左半区间查找,即将右指针right移动到mid-1位置。如果arr[mid]==target,则找到目标,返回mid。

插值查找

插值查找是对二分查找的改进,它是根据查找值在数组中的大致位置进行估算,从而缩小查找区间。如果数组中的元素分布比较均匀,那么插值查找的效率会比二分查找更高。

插值查找的实现也可以采用循环或递归的方式,下面是插值查找的示例代码:

public int interpolationSearch(int[] arr, int target) {
    int left = 0, right = arr.length - 1;
    while (left <= right) {
        int mid = left + (right - left) * (target - arr[left]) / (arr[right] - arr[left]);
        if (arr[mid] < target) {
            left = mid + 1;
        } else if (arr[mid] > target) {
            right = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

示例说明:

在上面的代码中,首先定义了左右两个指针left和right,表示查找区间的左右两端。在每一次查找过程中,计算出mid=left+(right-left)*(target-arr[left])/(arr[right]-arr[left]),表示平均分配,因此可以将查找区间近似看作等差数列,从而可以比较平均地猜测目标元素所在的位置。然后通过比较mid和target的大小,将查找区间缩小。如果arr[mid]target,则在左半区间查找,即将右指针right移动到mid-1位置。如果arr[mid]==target,则找到目标,返回mid。

斐波那契查找

斐波那契查找是利用斐波那契数列进行查找的一种方法,与二分查找和插值查找不同,它不是通过平均分配的方式来确定查找点,而是利用黄金分割原理来确定查找点。

斐波那契查找的实现可以采用递归或非递归的方式,下面是斐波那契查找的示例代码:

public int fibonacciSearch(int[] arr, int target) {
    int n = arr.length;
    int k = 0;
    while (fibonacci(k + 1) - 1 < n) k++;
    int left = 0, right = n - 1;
    while (left <= right) {
        int mid = left + fibonacci(k - 1) - 1;
        if (arr[mid] < target) {
            left = mid + 1;
            k -= 2;
        } else if (arr[mid] > target) {
            right = mid - 1;
            k--;
        } else {
            return mid;
        }
    }
    return -1;
}

private int fibonacci(int n) {
    if (n == 0 || n == 1) {
        return n;
    }
    int a = 0, b = 1;
    int res = 0;
    for (int i = 2; i <= n; i++) {
        res = a + b;
        a = b;
        b = res;
    }
    return res;
}

示例说明:

在上面的代码中,首先定义了斐波那契数列,在计算出n<=斐波那契数列第k个数的最大下标k后,初始化左右两个指针left和right,表示查找区间的左右两端。在每一次查找过程中,计算mid=left+fibonacci(k-1)-1,其中fibonacci(k-1)-1用来确定黄金分割点,并将查找区间缩小。如果arr[mid]target,则在左半区间查找,即将右指针right移动到mid-1位置,并且k=k-1;如果arr[mid]==target,则找到目标,返回mid。

以上三种查找算法都是较常用的查找算法,特别是在大数据量、组织有序时,查找算法的效果更为明显。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 三种Java求最大值的方法

    当我们在Java中处理数据时,经常需要找到一组数据中的最大值。本文将介绍三种Java求最大值的方法: 方法一:将数组转换为 List,使用 Collections.max() 方法 这种方法主要是针对数组中的元素进行比较,使用了Java提供的工具类 Collections 中的max()方法,并将数组转换成List类型。具体实现代码如下: import ja…

    Java 2023年5月26日
    00
  • JavaI/O深入学习之输入和输出

    Java I/O深入学习之输入和输出攻略 Java I/O(Input/Output)是 Java 语言标准库的一部分,被设计为灵活和通用的系统,用于读取和写入各种不同类型的数据,包括文件和网络连接等。本文将深入探讨 Java I/O 的输入输出流,包括常见的字节流和字符流及其使用方法。 字节流和字符流 Java I/O 基本上可以分为两种类型: 字节流和字…

    Java 2023年5月26日
    00
  • springboot学习之Thymeleaf模板引擎及原理介绍

    下面我会详细讲解“springboot学习之Thymeleaf模板引擎及原理介绍”的完整攻略。 一、Thymeleaf模板引擎的介绍 1.1 什么是Thymeleaf? Thymeleaf是一个流行的Java模板引擎,它允许开发人员使用自然模板语言在Web和非Web应用程序中构建HTML,XML,JavaScript,CSS和文本。它被广泛用于Spring …

    Java 2023年6月15日
    00
  • Java Springboot整合支付宝接口的教程详解

    Java Springboot整合支付宝接口的教程详解 介绍: Java Springboot是当前广泛使用的Java开发框架之一,兼容了Spring框架的优势并整合了大量解决方案,易用易扩展,本文将详细讲解如何在Java Springboot应用中整合支付宝接口。 准备工作: 1. 开通支付宝开放平台账号: 首先访问 支付宝开放平台官方网站,进行开发者注册…

    Java 2023年5月19日
    00
  • Spring概述和快速构建的方式

    作为Spring框架的作者,我很乐意为您详细讲解Spring的概述和快速构建的方式。 Spring框架概述 Spring框架是Java开发的企业级应用程序框架,提供了诸如IOC(Inversion of Control),AOP(Aspect Oriented Programming),事务管理等功能,旨在使开发者构建Java应用程序变得更加简单。Sprin…

    Java 2023年5月19日
    00
  • Spring Data Jpa 自动生成表结构的方法示例

    首先,我们需要先了解Spring Data Jpa自动生成表结构的方法。Spring Data Jpa是Spring框架中的一个重要组成部分,它提供了一种方便快捷的方式来管理和操作数据库中的数据。 Spring Data Jpa可以自动生成表结构,这样就不需要手动编写SQL语句来创建表了。具体的步骤如下: 配置数据源 在你的Spring应用程序中,你需要首先…

    Java 2023年5月20日
    00
  • SpringMVC异步处理的 5 种方式示例详解

    针对“SpringMVC异步处理的 5 种方式示例详解”的完整攻略,我将从以下几个方面进行详细讲解: 什么是SpringMVC异步处理 SpringMVC异步处理的5种方式 异步处理方式的示例说明 总结 1. 什么是SpringMVC异步处理 在SpringMVC中,一般的请求处理是同步的,也就是说请求到达后一直会占用线程,等待响应并返回结果。但是面对一些复…

    Java 2023年5月16日
    00
  • WEB应用脆弱性防止策略 常见的16种WEB攻击以及解决方案

    WEB应用脆弱性防止策略: 常见的16种WEB攻击以及解决方案 1. SQL注入攻击 SQL注入攻击:利用特殊的字符与代码注入技术,在后台窃取数据和控制后台操作。防范措施:使用参数化查询,避免直接拼接SQL语句;过滤掉用户的输入特殊字符,如单引号;使用ORM框架。 示例:在登录页面中,输入如下语句,可以绕过登录验证,进入后台管理界面 ‘ or ‘1’=’1 …

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部