java数据结构 基本查找,二分查找,分块查找

news2024/12/23 12:50:49

目录

  • 算法查找
    • 基本查找
    • 二分查找
      • 优化方式 插值查找了解即可
      • 斐波那契查找 了解
        • 以上总结
    • 分块查找

算法查找

基本查找

又叫顺序查找 从0索引开始挨个往后查找
需求 定义一个方法利用基本查找 查找某个元素是否存在
{132,135,65,86,89,6}

  public static void main(String[] args) {

        int arr[]={132,135,65,86,89,6};
        int searchNumber=65;
        boolean b = basicSearch(arr, searchNumber);
        System.out.println(b);


    }

    private static boolean basicSearch(int arr[], int searchNumber) {

        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==searchNumber){
                return true;
            }

        }
        return false;

    }

定义一个方法利用基本查找 查询某个元素在数组中的索引
烤炉数组中元素有重复的可能性
int arr[]={6,135,65,86,89,6} 我要查询6 返回索引为0和5

public static void main(String[] args) {
        //定义一个方法利用基本查找 查询某个元素在数组中的索引
        //烤炉数组中元素有重复的可能性
        //int arr[]={6,135,65,86,89,6} 我要查询6  返回索引为0和5

        int arr[]={6,135,65,86,89,6};
        int searchNumber=6;
        ArrayList<Integer> integers = basicSearch(arr, searchNumber);

        for (int i = 0; i < integers.size(); i++) {
            Integer integer = integers.get(i);
            System.out.println(integer);
        }


    }

    private static ArrayList<Integer> basicSearch(int arr[], int searchNumber) {

        ArrayList<Integer>list=new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==searchNumber){
                list.add(i);
            }

        }
        return list;

二分查找

二分查找1的数组中数据必须是有序的
核心思想:每次排除一半的查找范围

在这里插入图片描述

    public static void main(String[] args) {

        int arr[]={4,23,67,14,126,33};
        int number=67;
        int i = binarySearch(arr, number);
        System.out.println(i);


    }

    public static int binarySearch(int arr[], int number) {
        
        //定义两个变量记录要查找到范围
        int min=0;
        int max=arr.length-1;
        //2利用循环不断求要找到的数据
        while (true){
            if(min>max){//如果遇到这个条件相当于循环完了
                return -1;
            }

            //找到 mid位置
            int mid=(min+max)/2;

            //拿着mid指向元素跟查找的元素比较
            if(arr[mid]>number){
                //number在mid左边  min不变 max等于mid-1
                max=mid-1;

            }else if(arr[mid]<number) {
                //number在mid又边  max不变 min等于mid+1)
                min = mid + 1;

            }else{
                //number和mid指向元素一样 找到了
                return mid;
            }


        }

    }

优化方式 插值查找了解即可

在这里插入图片描述

斐波那契查找 了解

在这里插入图片描述

以上总结

在这里插入图片描述

分块查找

在这里插入图片描述

把获得到的数据分成若干个小块
第一块是最小 第一块中最大数据值不会大于第二块所有数据,第二快中最大数据不会大于第三块所有数据…

在这里插入图片描述

思路:分成四块每块定义成一个类 类的内容记录了 该块的最大值起始索引和结束索引,然后把这四块对象存在数组内进行调用.如下图
在这里插入图片描述

  public static void main(String[] args) {

        int arr[]={16,5,9,12,21,18,
                32,23,37,26,45,34,
                50,48,61,52,73,66};
        //分成了三块.分块思路总数开根号 这个是16个  开根号等于4.5左右


        //定义一个类存储三个组
        Block b1=new Block(21,0,5);
        Block b2=new Block(45,6,11);
        Block b3=new Block(73,12,17);

        //定义一个数组存储管理上面三个组(索引表)

        Block[]blockarr={b1,b2,b3};

        int number=37;
        //要查询的数

        //调用方法传递索引表 要查询的数据 arr数组
        int index = getIndex(blockarr, arr, number);
        System.out.println(index);


    }

    private static int getIndex(Block[] blockarr, int[] arr, int number) {
        //在这之前要知道要查询的数number在哪个组里
        //定义一个方法
        int numberIndex = getNumberIndex(blockarr, number);
        //numberIndex就是找到的符合的组块索引
        //获取这块索引得最大值 起始索引和结束
        int endIndex = blockarr[numberIndex].getEndIndex();
        int maxIndex = blockarr[numberIndex].getMaxIndex();
        int startIndex = blockarr[numberIndex].getStartIndex();

        //遍历该组
        for (int i = startIndex; i < endIndex; i++) {
            if(arr[i]==number){
                return i;
            }

        }
        return -1;


    }

    private static int getNumberIndex(Block[] blockarr, int number) {

        for (int i = 0; i < blockarr.length; i++) {
            //思路 获取每个组中最大数  找到比要查询的数小的哪个就是



            if(blockarr[i].getMaxIndex()>number){
                return i;
            }



        }



        return -1;//找不到直接返会-1结束代码

    }
}
class Block{
    private int maxIndex;
    private int startIndex;
    private int endIndex;


    public Block() {
    }

    public Block(int maxIndex, int startIndex, int endIndex) {
        this.maxIndex = maxIndex;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }

    /**
     * 获取
     * @return maxIndex
     */
    public int getMaxIndex() {
        return maxIndex;
    }

    /**
     * 设置
     * @param maxIndex
     */
    public void setMaxIndex(int maxIndex) {
        this.maxIndex = maxIndex;
    }

    /**
     * 获取
     * @return startIndex
     */
    public int getStartIndex() {
        return startIndex;
    }

    /**
     * 设置
     * @param startIndex
     */
    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    /**
     * 获取
     * @return endIndex
     */
    public int getEndIndex() {
        return endIndex;
    }

    /**
     * 设置
     * @param endIndex
     */
    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }

    public String toString() {
        return "Block{maxIndex = " + maxIndex + ", startIndex = " + startIndex + ", endIndex = " + endIndex + "}";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java--while循环

1.while循环 2.示例 3.执行的流程&#xff1a; ①循环一开始&#xff0c;执行int i 0一次 ②此时 i0&#xff0c;接着计算机执行循环条件语句&#xff1a;0 < 3 返回true&#xff0c;计算机就进到循环体中执行&#xff0c;输出&#xff1a;"Hello World",然后执…

SpringBoot 源码分析(四) 内置Tomcat分析

一、Tomcat相关知识 1. tomcat目录结构 Tomcat文件的目录结构 2.启动流程 启动一个Tomcat服务是执行的bin目录下的脚本程序&#xff0c;startup.bat和 startup.sh.一个是windows的脚本&#xff0c;一个是Linux下的脚本&#xff0c;同样还可以看到两个停止的脚本 shutdown.ba…

AIGC是什么?一文读懂人工智能生成内容技术!

文章目录 前言一、AIGC是什么&#xff1f;二、AIGC的4个主要特征1、文本生成2、图像生成3、语音生成4、视频生成 三、AIGC如何运作&#xff1f;步骤1&#xff1a;收集数据步骤2&#xff1a;模型训练步骤3&#xff1a;内容生成步骤4&#xff1a;反馈和改进 四、AIGC关键技术能力…

智慧社区燃气管网监测系统

燃气易燃易爆&#xff0c;一旦操作不当或疏忽大意&#xff0c;极易引发燃气安全事故&#xff0c;造成严重后果&#xff0c;2023年10月24日&#xff0c;在吉林某小区&#xff0c;发生了燃气使用不当产生的爆炸导致了1人死亡&#xff0c;1人重伤&#xff0c;15人轻伤&#xff0c;…

网络监控硬盘录像机!

目录 认识录像机以及选购前小知识&#xff01; 1.网络监控摄像头的像素和分辨率对照参考&#xff1a; 2.录像视频的大小主要受摄像头的像素和存储编码影响&#xff0c;这些在设置录像的时候&#xff0c;都是可以改的。 3.关于录像机存储能力咨询 4.关于存储编码简介 认识录…

网页的基本结构

标签的结构 HTML网页是由HTML标签组成的描述性文本&#xff0c;HTML标签可以说明文字&#xff0c;图形、动画、声音、表格、链接等。 一个标签由开始标签&#xff0c;结束标签、标签名、标签属性组成 <div><a href"https://www.creatorblue.com/">创蓝…

酷开科技依托酷开系统推动家庭智能化加速发展

为什么越来越多的人会选择智能家居&#xff1f;因为智能家居的出现&#xff0c;大大方便了我们的生活&#xff0c;为生活提供便利舒适的体验&#xff1b;就如同洗衣机与洗碗机解放了我们的双手是一样的道理&#xff0c;智能家居是在生活的方方面面为我们提供更加便利化的可能性…

C++数据结构X篇_24_归并排序(稳定的排序)

本篇参考十大经典排序算法-归并排序算法详解进行整理和补充。 文章目录 1. 什么是归并排序1.1 概念1.2 算法原理1.3 算法实现 2. 归并排序算法特点2.1 时间复杂度2.2 空间复杂度2.3 稳定性 1. 什么是归并排序 1.1 概念 归并排序&#xff08;Merge sort&#xff09; 是建立在…

NFTScan 获 Optimism 基金会 Cycle 14 Grant 支持 35,000 枚 OP !

近期&#xff0c;Optimism 基金会官方公布了 Grants Program Cycle 14 的最终入选项目名单&#xff0c;NFTScan 团队获得了 35k OP 的 Grant 资金支持。 Cycle 14 Final: https://app.charmverse.io/op-grants/page-47078316203750115 作为 Optimism 生态的 NFT 基础设施&…

内网渗透——macOS上搭建Web服务器

# 公网访问macOS本地web服务器【内网穿透】 文章目录 1. 启动Apache服务器2. 公网访问本地web服务2.1 本地安装配置cpolar2.2 创建隧道2.3 测试访问公网地址3. 配置固定二级子域名3.1 保留一个二级子域名3.2 配置二级子域名4. 测试访问公网固定二级子域名 以macOS自带的Apache…

惊艳,这个html5播放器支持视频切换、倍速切换、视频预览

很赞哇&#xff01;&#xff01; 本文将对视频播放相关的功能进行说明&#xff08;基于云平台&#xff09;&#xff0c;包括初始化播放器、播放器尺寸设置、视频切换、倍速切换、视频预览、自定义视频播放的开始/结束时间、禁止拖拽进度、播放器皮肤、控件按钮以及播放控制等。…

使用群晖Synology Office提升生产力:多人同时编辑一个文件

使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件 文章目录 使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制…

Inbound marketing的完美闭环:将官网作为营销枢纽,从集客进化为入站

Inbound marketing即入站营销的运作方式不同于付费广告&#xff0c;你需要不断地投入才能获得持续的访问量。而你的生意表达内容一经创建、发布&#xff0c;就能远远不断地带来流量。 Inbound marketing也被翻译作集客营销&#xff0c;也就是美国知名的营销SaaS企业hubspot所主…

react-组件间的通讯

一、父传子 父组件在使用子组件时&#xff0c;提供要传递的数据子组件通过props接收数据 class Parent extends React.Component {render() {return (<div><div>我是父组件</div><Child name"张" age{16} /></div>)} }const Child …

OJ练习第183题——天际线问题

天际线问题 力扣链接&#xff1a;218. 天际线问题 题目描述 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 示例 官解思路&#xff08;扫描线优先队列&#xff09; 观…

【httpd】 Apache http服务器目录显示不全解决

文章目录 1. 文件名过长问题1.1 在centos中文件所谓位置etc/httpd/conf.d/httpd-autoindex.conf1.2 在配置文件httpd-autoindex.conf中的修改&#xff1a;1.3 修改完成后重启Apache&#xff1a; 1. 文件名过长问题 1.1 在centos中文件所谓位置etc/httpd/conf.d/httpd-autoindex…

android开发使用OkHttp自带的WebSocket实现IM功能

一、背景 android app开发经常会有IM需求&#xff0c;很多新手不晓得如何入手&#xff0c;难点在于通讯不中断。其实android发展到今天&#xff0c;很多技术都很完善&#xff0c;有很多类似框架可以实现。例如有&#xff1a;okhttp自带的websocket框架、easysocket等等。本文主…

69 划分字母区间

划分字母区间 题解1 贪心1&#xff08;方法略笨&#xff0c;性能很差&#xff09;题解2 贪心2&#xff08;参考标答&#xff09; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&am…

Visual C++编程初学者疑难问题大集合(二)

初学者在学习visual c时问题很多&#xff0c;有意思的是&#xff0c;很多问题教材上都不说&#xff0c;后台有不少小伙伴问我相关问题&#xff0c;我于是总结一下。以供学习visual c的小伙伴少走弯路。 问题六&#xff1a;怎么理解visual c中函数的声明和定义 在复杂的程序中&…

SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 宾馆客房管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统…