插值查找和斐波那契查找

这篇具有很好参考价值的文章主要介绍了插值查找和斐波那契查找。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插值查找

一种基于二分查找的优化算法,与二分查找相比,插值查找更加适用于数据分布较为均匀的有序数组。

插值查找算法基本思想

根据要查找的值与数组中最小值和最大值的比较,估算出要查找的值在数组中的大致位置,然后按照二分查找的方式进行查找。

插值查找算法的具体实现步骤如下:

在要查找的有序数组中,确定要查找的值的范围,即最小值和最大值;
根据要查找的值与最小值和最大值的比较,估算要查找的值在数组中的位置,计算出中间值;
将中间值与要查找的值进行比较,如果相等,则返回中间值所在的位置;
如果中间值大于要查找的值,则在左侧范围内继续查找,将最大值更新为中间值减一;
如果中间值小于要查找的值,则在右侧范围内继续查找,将最小值更新为中间值加一;
如果要查找的值在数组中不存在,则返回查找失败的结果。
与二分查找相比,插值查找算法的优点在于对于数据分布较为均匀的有序数组,查找速度更快,而且时间复杂度也能达到O(log log n)级别。但是,对于数据分布不均匀的数组,插值查找算法的性能可能会劣于二分查找。

下面是插值查找算法的Python实现代码:

def interpolation_search(arr, low, high, x):
    """
    插值查找算法
    :param arr: 要查找的有序数组
    :param low: 查找范围的最小值
    :param high: 查找范围的最大值
    :param x: 要查找的值
    :return: 查找结果,如果找到,则返回元素的下标,否则返回-1
    """
    while low <= high and arr[low] <= x <= arr[high]:
        mid = low + (x - arr[low]) * (high - low) // (arr[high] - arr[low])
        if arr[mid] == x:
            return mid
        elif arr[mid] < x:
            low = mid + 1
        else:
            high = mid - 1
    return -1

斐波那契查找

一种基于斐波那契数列的查找算法,与二分查找类似,只是每次将数组分成比例不同的两部分,而不是像二分查找一样分成相等的两部分。

斐波那契查找的思路如下:

使用斐波那契数列作为分割点的数组下标。
将目标值与斐波那契数列上的元素比较,根据比较结果向左或向右查找。
如果目标值在左半边,则将区间范围缩小到左半边,重新计算斐波那契数列上的分割点;如果目标值在右半边,则将区间范围缩小到右半边,重新计算斐波那契数列上的分割点;如果目标值等于当前查找的元素,则返回该元素的下标。
斐波那契查找的优点是能够在数组长度较大时,更快地找到目标元素,但其缺点是需要在查找前计算斐波那契数列,时间复杂度较高。

以下是使用Python实现的斐波那契查找的代码:文章来源地址https://www.toymoban.com/news/detail-421603.html

def fib_search(arr, target):
    # 计算斐波那契数列
    fib = [0, 1]
    while fib[-1] < len(arr):
        fib.append(fib[-1] + fib[-2])
    
    # 初始化左右边界和斐波那契分割点
    left, right = 0, len(arr) - 1
    k = len(fib) - 1
    
    # 在斐波那契分割点附近查找
    while k > 0:
        # 计算新的左右边界和斐波那契分割点
        idx = min(left + fib[k - 1], len(arr) - 1)
        if target < arr[idx]:
            k -= 1
            right = idx - 1
        elif target > arr[idx]:
            k -= 2
            left = idx + 1
        else:
            return idx
    
    # 没有找到目标元素
    return -1

到了这里,关于插值查找和斐波那契查找的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于C语言用递归思想实现斐波那契数列的函数设计

    用C语言并利用递归思想实现设计一个程序,完成斐波那契数列的函数设计,利用递归实现!

    2024年04月08日
    浏览(43)
  • 【动态规划】是泰波那契数,不是斐波那契数

    Problem: 1137. 第 N 个泰波那契数 首先我们来解读一下本题的意思🔍 相信读者在看到【泰波那契数】的时候,不禁会联想到【斐波那契数】,它们呢是一对孪生兄弟,这个 泰波那契数 相当于是 斐波那契数 的加强版 我们首先可以来看到这个递推公式 Tn+3 = Tn + Tn+1 + Tn+2 ,读者可

    2024年02月08日
    浏览(47)
  • 力扣 509. 斐波那契数

    题目来源:https://leetcode.cn/problems/fibonacci-number/description/    C++题解1:根据题意,直接用递归函数。 C++题解2(来源代码随想录):动态规划。动规五部曲:这里我们要用一个一维dp数组来保存递归的结果。 确定dp数组以及下标的含义:dp[i]的定义为第i个数的斐波那契数值是

    2024年02月15日
    浏览(40)
  • 509. 斐波那契数

    斐波那契数  (通常用  F(n)  表示)形成的序列称为  斐波那契数列  。该数列由  0  和  1  开始,后面的每一项数字都是前面两项数字的和。也就是: 给定  n  ,请计算  F(n)  。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 30

    2024年02月06日
    浏览(40)
  • 动态规划-斐波那契数

    斐波那契数是一个很好的熟悉和理解动态规划的例子,通过斐波那契数可以更好的理解动态规划的精髓,动态规划是后面的计算是如何借助于前面的计算结果来加快计算速度的。 斐波那契数和斐波那契数列其实可以看成是一道题,只不过两题的限制性条件稍微有差别 斐波那

    2024年02月14日
    浏览(35)
  • Python斐波那契数列

    斐波那契数列是一个经典的数学问题,在 Python 中可以使用多种方法来实现,下面是几个常见的实现方式: 1. 使用递归 ```python def fibonacci_recursive(n):     if n = 1:         return n     else:         return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) ``` 2. 使用循环 ```python def fibonacci_i

    2024年02月02日
    浏览(46)
  • 斐波那契数列应用2

    目录 斐波那契数列应用2 程序设计 程序分析  系列文章 【问题描述】定义如下序列:f(1)=1,f(2)=1;f(n)=(A*f(n-1)+B*f(n-2))mod7     给定A和B,请你计算f(n)的值。 【输

    2023年04月10日
    浏览(55)
  • JAVA-斐波那契数列

    输入一个整数 n ,求斐波那契数列的第 n 项。 假定从 0 开始,第 0 项为 0 。 数据范围 0≤n≤39 样例

    2024年02月10日
    浏览(53)
  • 斐波那契算法的理解

    1.斐波那契数列  : 数组:int[] F= {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }; 特点: 从第三个数开始,后边每一个数都是前两个数的和 。 F[k]=F[k-1]+F[k-2]; 如图所示:         ①low、mid、high都是F数组的索引,F[k]-1表示长度。         ②为了方便计算出mid,变形:F[k]-1 = (F[k-1]-1) + (F

    2024年02月08日
    浏览(45)
  • c 斐波那契数列输出

    在C语言中,我们可以通过递归或循环的方法来实现斐波那契数列的输出。首先,我们需要明白斐波那契数列的定义:任一项数字是前两项的和(最开始两项均定义为1)。下面是具体的实现方式。 使用递归方法: #include stdio.h int main() {     int m = 0, n = 1, sum;     printf(\\\"请输入

    2024年02月06日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包