java 哨兵线性搜索

        顾名思义,哨兵线性搜索是线性搜索的一种,与传统线性搜索相比,比较次数减少了。在传统的线性搜索中,仅进行N次比较,而在哨兵线性搜索中,哨兵值用于避免任何越界比较,但没有专门针对正在搜索的元素的索引进行额外的比较。
        在这种搜索中,将数组的最后一个元素替换为要搜索的元素,然后对数组进行线性搜索,而不检查当前索引是否在数组的索引范围内,因为要搜索的元素即使它不存在于原始数组中,也肯定会在数组中找到,因为最后一个元素被替换为它。因此,要检查的索引永远不会超出数组的范围。最坏情况下的比较次数将为(N+2)。
        哨兵线性搜索是标准线性搜索算法的变体,用于在数组或列表中查找目标值。该算法背后的基本思想是在数组末尾添加一个标记值,该值等于我们正在查找的目标值。这有助于避免在循环的每次迭代期间检查数组边界条件,因为哨兵值充当循环的停止器。
        尽管在最坏情况下时间复杂度这两种算法都是 O(n)。只是哨兵线性搜索比线性搜索少了比较次数。
使用哨兵线性搜索:
        在搜索数组中的元素时,哨兵线性搜索是线性搜索算法的变体,它使用哨兵值来优化搜索过程。

        哨兵线性搜索的基本思想是在数组末尾添加一个与搜索键匹配的额外元素(即哨兵值)。通过这样做,我们可以避免在循环中对数组末尾进行条件检查,并在找到哨兵元素后尽早终止搜索。这消除了对数组末尾进行单独检查的需要,从而使算法的平均情况性能略有提高。
Sentinel线性搜索算法的步骤如下:
        1、将搜索索引变量 i 初始化为 0。
        2、将数组的最后一个元素设置为搜索键。
        3、当搜索键不等于数组的当前元素(即 arr[i])时,增加搜索索引 i。
        4、如果 i 小于数组大小或 arr[i] 等于搜索键,则返回 i 的值(即搜索键在数组中的索引)。
        5、否则,搜索键不存在于数组中,因此返回 -1(或任何其他适当的值来指示未找到该键)。
        Sentinel 线性搜索算法的主要好处是它不需要单独检查数组末尾,这可以提高算法的平均情况性能。然而,它并没有改善最坏情况下的性能,仍然是 O(n)(其中 n 是数组的大小),因为我们可能需要扫描整个数组才能找到哨兵值。

例子: 
输入: arr[] = {10, 20, 180, 30, 60, 50, 110, 100, 70}, x = 180 
输出: 180 出现在索引 2
输入: arr[] = {10, 20, 180, 30, 60, 50, 110, 100, 70}, x = 90 
输出:未找到 

下面是上述方法的实现:

// Java implementation of the approach
class GFG {
 
    // Function to search x in the given array
    static void sentinelSearch(int arr[], int n, int key)
    {
 
        // Last element of the array
        int last = arr[n - 1];
 
        // Element to be searched is
        // placed at the last index
        arr[n - 1] = key;
        int i = 0;
 
        while (arr[i] != key)
            i++;
 
        // Put the last element back
        arr[n - 1] = last;
 
        if ((i < n - 1) || (arr[n - 1] == key))
            System.out.println(key + " is present at index "
                               + i);
        else
            System.out.println("Element Not found");
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[]
            = { 10, 20, 180, 30, 60, 50, 110, 100, 70 };
        int n = arr.length;
        int key = 180;
 
        sentinelSearch(arr, n, key);
    }
}
 
// This code is contributed by Ankit Rai, Mandeep Dalavi 

输出
180 出现在索引 2 处
时间复杂度: O(N)
辅助空间: O(1)

方法二:
以下是哨兵线性搜索算法涉及的步骤:
        1.将数组的最后一个元素设置为目标值。这称为哨兵值。
        2.将索引变量“i”设置为数组的第一个元素。
        3.使用循环迭代数组,将每个元素与目标值进行比较。
        4.如果当前元素等于目标值,则返回当前元素的索引。
        5.每次循环迭代后将索引变量“i”增加 1。
        6.如果循环完成但未找到目标值,则返回 -1 以指示该值不存在于数组中。
        哨兵线性搜索算法对于具有大量元素的数组非常有用,其中目标值可能位于数组的末尾。通过在数组末尾添加哨兵值,我们可以消除在循环的每次迭代期间检查数组边界条件的需要,从而减少算法的整体运行时间。 

 import java.util.Arrays;
 
public class SentinelLinearSearch {
    public static int sentinelLinearSearch(int[] array, int key) {
        int last = array[array.length - 1];
        array[array.length - 1] = key;
        int i = 0;
        while (array[i] != key) {
            i++;
        }
        array[array.length - 1] = last;
        if (i < array.length - 1 || last == key) {
            return i;
        } else {
            return -1;
        }
    }
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int key = 5;
        int index = sentinelLinearSearch(array, key);
        if (index == -1) {
            System.out.println(key + " is not found in the array: " + Arrays.toString(array));
        } else {
            System.out.println(key + " is found at index " + index + " in the array: " + Arrays.toString(array));
        }
    }
}

输出
5 在数组中的索引 4 处找到:[1, 2, 3, 4, 5, 6, 7, 8, 9]

时间复杂度:
Sentinel 线性搜索算法的时间复杂度在最坏情况下为 O(n)。
在最好的情况下,当第一次迭代找到密钥时,时间复杂度将为 O(1)。
然而,平均时间复杂度仍然是O(n),因为平均来说,key会在。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springMVC自定义类型转换

目录 &#x1f34b;&#x1f34a;自定义的转换类 &#x1f34b;&#x1f34a;xml文件中添加配置 &#x1f34b;&#x1f34a;测试 SpringMVC 底层已经封装了很多的类型转换器&#xff0c;也就是为什么我们页面上传的字符串可以使用 Integer接收或者可以直接转换为数组的原因…

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…

高级语言讲义2010计专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

JavaWeb--Mybatis

一&#xff1a;Mybatis概述 1.Mybatis概念 MyBatis 是一款优秀的 持久层框架 &#xff0c;用于简化 JDBC 开发&#xff1b; MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code&#xff0c;并且改名为 MyB…

《Effective Modern C++》- 极精简版 15-21条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective Modern C》- 极精简版 5-14条。本文列出《Effective Modern C》的15-21条的个人理解的极精简版本。 Item15、尽量使用constexpr constexpr形容对象 constexpr对象都是const&#xff0c;但是const对象不一定是conste…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

C++篇 语 句

到目前为止&#xff0c;我们只见过两种语句&#xff1a; return 语句和表达式语句。根据语句对执行顺 序的影响&#xff0c;C 语言其余语句大多属于以下 3 大类。 选择语句&#xff1a; if 语句和 switch 语句。循环语句&#xff1a; while 语句&#xff0c; do...while 语句和…

SSH移植到BusyBox

手动编译SSH安装挺麻烦的&#xff0c;本文主要是我大量借鉴和实践总结出来的流程&#xff0c;一步一按照做不会有太大问题。 移植平台&#xff1a;IMX6UL(迅为开发板) 根文件系统&#xff1a;BusyBox 所有操作都建议不要在root账户下运行&#xff0c;并且make install的安装路…

【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

文章目录 一、使用 ffmpeg 命令提取 音视频 数据1、提取音频数据 - 保留封装格式2、提取视频数据 - 保留封装格式3、提取视频数据 - 保留编码格式4、提取视频数据 - 重新编码5、提取音频数据 - 保留编码格式6、提取音频数据 - 重新编码 一、使用 ffmpeg 命令提取 音视频 数据 1…

《2024国家自然科学基金青年基金》 相关申请注意事项解读

一 年龄计算 2004 对应 89 2005 对应 90 2006 对应 91 2007 对应 92 2008 对应 93 2009 对应 94 2010 对应 95 .。。 二 资助比例&#xff08;2023&#xff09; 2024年 23.13% 2023年 24% 三 2024年政策变动&#xff0c;只能申请3年的30万&#xff0c;不能像23年一样选择10-20的…

【二十九】springboot高并发示例

本章演示在springboot项目中的高并发demo&#xff0c;演示导致的问题&#xff0c;以及单机部署下的解决方案和集群部署下的解决方式以及分布式下的解决方案。 目录 一、单机模式下高并发问题 二、集群模式下高并发问题 一、单机模式下高并发问题 前提&#xff1a;先写一个减扣…

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1&#xff09;TI IWR 6843 ISK 1块 2&#xff09;Micro USB 数据线 1条 1.2 系统环境 1&#xff09;VMware Workstation 15 Player 虚拟机 2&#xff09;Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统&#xff0c;可通过如下指令进行…

腾讯云轻量服务器流量用完了怎么办?停机吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…

深入了解XSS攻击:原理、防御与应对策略

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

结构体内存对齐详解

目录 结构体对齐&#xff1a; 为什么要进行内存对齐&#xff1f; 关于结构体的详解文章&#xff1a;C语言结构体详解_结构体变量和结构体类型举例-CSDN博客 结构体对齐&#xff1a; 存储的时候和当前存储的成员类型字节大小和默认对齐数比较&#xff0c;取小值 存在该对齐数的…

PodMan容器技术

容器 容器技术 软件应用通常依赖于运行时环境提供的系统库、配置文件或服务。传统上&#xff0c;软件应用的运行时环境安装 在物理主机或虚拟机上运行的操作系统中。 然后&#xff0c;管理员在操作系统上安装应用依赖项。 在RHEL中&#xff0c;诸如 RPM 等打包系统可协助管…

Docker MySQL 报 2059 错误:认证插件 ‘caching_sha2_password‘ 无法加载

使用docker部署的mysql8.0.29再使用Navicat连接myslq报错Authentication plugin ‘xxxxxxx’ cannot be loaded&#xff1a;XXXXXX &#xff08;无法加载身份验证插件&#xff09; 原因&#xff1a;mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规…

嘉绩咨询:八位一体产业创新,赋能品牌新零售

探索新零售领域不断创新高峰的嘉绩咨询在今天全面展现了其“八位一体”产业创新模式&#xff0c;该模式旨在为新零售品牌提供全方位的赋能服务。立足于广州的企业战略导航专家&#xff0c;吹响了帮助中国品牌实现全球化发展的号角。 嘉绩咨询的核心业务涵盖招商教育、招商落地、…

防火墙IPSEC VPN实验

一、实验拓扑 二、实验要求 在上一个实验的基础上增加一条&#xff1a; 在FW5和FW3之间建立一条IPSec通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 三、实验配置 此实验是根据上一个实验拓展&#xff0c;所以前面的配置可以看之前的文章。 先配置FW1…