python 跳转搜索(Jump Search)

跳转搜索算法详解:原理、性能比较与应用,
本文介绍了跳转搜索算法,一种针对排序数组的搜索策略,通过跳跃式查找减少比较次数。相比于线性搜索,其性能更好,但不如二分搜索。文章探讨了最优块大小选择及其实现步骤,并与线性搜索和二分搜索进行了性能对比。

        与二分搜索一样,跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素(比线性搜索)。例如,假设我们有一个大小为 n 的数组 arr[] 和一个大小为 m 的块(要跳转)。然后我们在索引 arr[0]、arr[m]、arr[2m]…..arr[km] 等中搜索。一旦找到区间 (arr[km] < x < arr[(k+1)m]),我们就从索引 km 执行线性搜索操作来查找元素 x。让我们考虑以下数组:(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610)。数组长度为 16。

假设要跳转的块大小为 4,跳转搜索将找到值 55,步骤如下:

步骤 1:从索引 0 跳转到索引 4;

步骤2:从索引4跳转到索引8;

步骤3:从索引8跳转到索引12;

步骤 4:由于索引 12 处的元素大于 55,因此我们将跳回到索引 8。

步骤 5:从索引 8 执行线性搜索以获取元素 55。

插图非示例

与线性搜索和二分搜索相比的性能:
        如果我们将它与线性搜索和二分搜索进行比较,那么它比线性搜索更好,但不比二分搜索更好。
性能递增顺序为:
        线性搜索 < 跳转搜索 < 二分搜索
要跳过的最佳块大小是多少?在最坏的情况下,我们必须进行 n/m 次跳转,如果最后检查的值大于要搜索的元素,我们会为线性搜索多执行 m-1 次比较。因此,最坏情况下的总比较次数将为((n/m) + m-1)。当 m = ?n 时,函数 ((n/m) + m-1) 的值最小。因此,最佳步长为 m = ?n。 

算法步骤
1、跳转搜索是一种通过跳过数组中的某些步骤来查找已排序数组中的特定值的算法。
2、步骤由数组长度的 sqrt 确定。 
以下是跳跃搜索的分步算法:
1、通过取数组 n 长度的 sqrt 来确定步长 m。
2、从数组的第一个元素开始,跳 m 步,直到该位置的值大于目标值。
        一旦找到大于目标的值,就从上一步开始进行线性搜索,直到找到目标或者明确目标不在数组中。
        如果找到目标,则返回其索引。如果没有,则返回 -1 表示在数组中未找到目标。 

示例:

# Python3 code to implement Jump Search
import math
 
def jumpSearch( arr , x , n ):
     
    # Finding block size to be jumped
    step = math.sqrt(n)
     
    # Finding the block where element is
    # present (if it is present)
    prev = 0
    while arr[int(min(step, n)-1)] < x:
        prev = step
        step += math.sqrt(n)
        if prev >= n:
            return -1
     
    # Doing a linear search for x in 
    # block beginning with prev.
    while arr[int(prev)] < x:
        prev += 1
         
        # If we reached next block or end 
        # of array, element is not present.
        if prev == min(step, n):
            return -1
     
    # If element is found
    if arr[int(prev)] == x:
        return prev
     
    return -1
 
# Driver code to test function
arr = [ 0, 1, 1, 2, 3, 5, 8, 13, 21,
    34, 55, 89, 144, 233, 377, 610 ]
x = 55
n = len(arr)
 
# Find the index of 'x' using Jump Search
index = jumpSearch(arr, x, n)
 
# Print the index where 'x' is located
print("Number" , x, "is at index" ,"%.0f"%index)
 
# This code is contributed by "Sharad_Bhardwaj". 

输出:
        数字 55 位于索引 10
时间复杂度:O(?n) 
辅助空间:O(1)

跳转搜索的优点:
        1、比元素均匀分布的数组的线性搜索更好。
        2、与大型数组的线性搜索相比,跳跃搜索的时间复杂度较低。
        3、跳跃搜索的步数与数组大小的平方根成正比,对于大型数组来说效率更高。
        4、与二分搜索或三元搜索等其他搜索算法相比,它更容易实现。
        5、跳转搜索适用于元素有序且均匀分布的数组,因为它可以在每次迭代时跳转到数组中更接近的位置。

要点:
        1、仅适用于排序数组。
        2、所要跳转的块的最佳大小是(?n)。这使得跳转搜索的时间复杂度为O(?n)。
        3、跳转搜索的时间复杂度介于线性搜索 ((O(n)) 和二分搜索 (O(Log n)) 之间。
        4、二分查找比跳转查找要好,但是跳转查找的优点是我们只需要回溯一次(二分查找可能需要最多 O(Log n) 次跳转,考虑要查找的元素是最小元素或者更大的元素的情况比最小的)。因此,在二分搜索成本高昂的系统中,我们使用跳转搜索。 

在讨论“jump base functionality or implementation”时,可能涉及多个领域,包括编程、游戏开发、网络跳转逻辑或低级系统功能实现。以下是几个常见场景的解释和实现方法: 1. **游戏开发中的跳跃功能实现** 在游戏开发中,跳跃功能通常涉及物理模拟和动画控制。例如,在Unity引擎中,可以通过调整刚体组件的垂直速度来实现跳跃: ```csharp if (Input.GetButtonDown("Jump") && isGrounded) { GetComponent<Rigidbody>().velocity = new Vector3(0, jumpForce, 0); } ``` 上述代码检测跳跃输入并确保角色在地面上,然后施加一个向上的速度。 2. **网页开发中的跳转功能实现** 在前端开发中,跳转通常指页面之间的导航。使用JavaScript可以实现延迟跳转或条件跳转。例如: ```javascript window.location.href = "https://example.com"; ``` 此代码将当前页面跳转到指定的URL。 3. **低级语言中的跳转指令** 在汇编语言或机器码中,jump指令用于改变程序执行流程。例如,在x86汇编中,`JMP`指令会无条件跳转到指定的地址: ```assembly JMP label_name ``` 这将控制流转移到标签`label_name`所标识的位置。 4. **算法中的跳跃逻辑** 在某些算法中,例如跳跃搜索Jump Search),其核心思想是通过固定步长跳跃来提高搜索效率。该算法的时间复杂度为$O(\sqrt{n})$。实现如下: ```python import math def jump_search(arr, x): n = len(arr) step = math.sqrt(n) prev = 0 while arr[int(min(step, n) - 1)] < x: prev = step step += math.sqrt(n) while arr[int(prev)] < x: prev += 1 if arr[int(prev)] == x: return int(prev) return -1 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hefeng_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值