【数据结构】分块查找

分块查找(也称为索引顺序查找)是一种改进的顺序查找方法,它将查找表分成若干个块,并要求块内的元素有序排序,但块与块之间不要求有序。每个块内的最大元素构成一个索引表。分块查找的过程是先查找索引,确定待查元素所在的块,然后在该块内进行顺序查找。

分块查找的平均查找长度介于顺序查找和二分查找之间,适用于查找次数相对较少,而插入和删除操作频繁的线性表。

分块查找的步骤如下:

  1. 建立索引:首先将查找表分成若干个块,每个块内的元素不必有序,但块间必须是有序的,即第i块的每个元素都必须小于第i+1块的所有元素。

  2. 构建索引表:对于每个块,选择一个元素(通常是该块的最大值)放入索引表中。索引表是排序的。

  3. 查找过程

    • 首先在索引表中查找待查关键字所在的块,由于索引表是有序的,可以使用二分查找或顺序查找。
    • 确定了所在的块后,在相应的块内进行顺序查找。

分块查找的时间复杂度主要取决于两个部分:索引查找和块内查找。如果索引表使用二分查找,那么索引查找的时间复杂度为O(log m),其中m是块的个数。块内查找的时间复杂度为O(n/m),其中n是元素总数。因此,平均查找长度约为O(log m + n/m)。

分块查找的优点是插入和删除操作比较方便,只需要在块内进行,而不需要移动块外的元素。这使得分块查找在某些动态变化的数据库中比较适用。

1.索引表

typedef struct
{
        int max ; // 这块里的最大值是多少
        int post ; // 记录这块的起始下标
} index_t ;

2.源数据表

int a [ 19 ] = { 18 , 10 , 9 , 8 , 21 , 20 , 38 , 42 , 19 , 50 , 51 , 72 , 56 , 55 , 76 , 100 , 90 , 88 , 108 };
块间有序,块内无序
0 -- 3 18 , 10 , 9 , 8 // 0 18
4 -- 8 21 20 38 42 19 // 1 42
9 -- 13 50 , 51 , 72 , 56 , 55 // 2 72
14 - 18 76 , 100 , 90 , 88 , 108 // 3 108

3.示例代码

#include <stdio.h>
typedef struct
{
    int max;//每一块的最大值
    int post;//每一块的起始下标
}index_t;
int findByBlock(int* a, int n1, index_t* b, int n2, int x)
{
    int start,end;//用来保存块的起始和终止下标
    //1.先确定x可能在哪一块中
    int i;
    for(i = 0; i < n2; i++)
    {
        if(x <= b[i].max)//说明可能在b[i]块中
            break;
    }
    if(i == n2)//说明没有执行过break,说明x,比最后一块的最大值还要大
        return -1;//没找到
    //2.锁定这一块的起始和终止下标,去源数据表中进行顺序查找
    start = b[i].post;
    if(i == n2-1)//说明在最后一块,最后一块没有后一块
        end = n1-1;//数组长度-1,就是最后一个有效元素下标
    else
        end = b[i+1].post - 1; //后一块的起始下标-1 得到前一块的终止下标
    //取源数据表 在start --- end之间取查找
    for(i = start; i <= end; i++)
    {
        if(x == a[i])
            return i;
    }
    return -1;//没有找到
}
int main(int argc, const char *argv[])
{
    //源数据表 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    int a[19] = { 18, 10, 9, 8, 21, 20, 38,42, 19, 50, 51, 72, 56, 55, 76,100,
90, 88, 108};
    //索引表
    index_t b[4] = {{18, 0},{42, 4},{72, 9},{108, 14}};
    //将数组中的每个元素都查找一遍
    int i;
    for(i = 0; i < 19; i++)
    {
        printf("%d的位置下标%d\n",a[i], findByBlock(a, 19, b, 4, a[i]));
    }
    printf("%d的位置下标%d\n",66,findByBlock(a, 19, b, 4, 66));
    return 0;
}
结语
以上就是分块查找的使用方法,本次代码分享到此结束。
最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

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

相关文章

Mybatis的注解开发

1、概述 mybatis中也提供了注解式开发方式&#xff0c;采用注解可以减少Sql映射文件的配置。 使用注解式开发的话&#xff0c;sql语句是写在java程序中的&#xff0c;这种方式也给sql语句的维护带来成本。 使用注解来映射简单语句会使代码显得更加简洁&#xff0c;但对于稍微…

ASP.NET基于WEB的工作计划流程管理系统的设计与实现

摘 要 信息技术的飞速发展&#xff0c;尤其是网络通讯技术、数据库技术及自动化技术的日新月异&#xff0c;为单位、企业的办公带来了极大的便利。但是由于单位、企业的工作性质众多&#xff0c;工作流程各有差异&#xff0c;企业、单位、部门之间的管理机制各不相同&#xf…

OpenHarmony实战开发-Web自定义长按菜单案例。

介绍 本示例介绍了给Webview页面中可点击元素&#xff08;超链接/图片&#xff09;绑定长按/鼠标右击时的自定义菜单的方案。 效果预览图 使用说明 长按Web页面中的图片或者链接元素&#xff0c;弹出自定义的Menu菜单&#xff0c;创建自定义的操作&#xff0c;如复制图片、使…

定时器详解

定时器&#xff1a;Timer类 常用方法方法&#xff1a; 1.schedule(TimeTask timetask,long delay,(long period)): TimeTask&#xff1a;实现了Runnable类&#xff0c;实现时需要重写run方法 delay&#xff1a;表示延迟多少(decay)后开始执行任务&#xff0c;单位是毫秒&#x…

密码学 | 椭圆曲线密码学 ECC 入门(四)

目录 正文 1 曲线方程 2 点的运算 3 求解过程 4 补充&#xff1a;有限域 ⚠️ 知乎&#xff1a;【密码专栏】动手计算双线性对&#xff08;中&#xff09; - 知乎 ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。注意&#xff0c;这篇博客与前三…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决&#xff0c;本文给出两种方法的代码实现。 示例&#xff1a; 图1 岛屿数量输入输出示意图 方法一&#xff1a;广度优先搜索(bfs) 代码&#xff1a; class Solution:def numIslands(self, grid):if not grid:return 0…

【WSL报错】执行:wsl --list --online;错误:0x80072ee7

【WSL报错】执行:wsl --list --online&#xff1b;错误:0x80072ee7 问题情况解决方法详细过程 问题情况 C:\Users\17569>wsl --list --online 错误: 0x80072ee7 解决方法 开系统代理&#xff0c;到外网即可修复&#xff01;&#xff01;&#xff01;&#xff01;&#x…

Yolov8项目实践——基于yolov8与OpenCV实现目标物体运动热力图

概述 在数据驱动和定位的世界中&#xff0c;对数据进行解释、可视化和决策的能力变得日益重要。这表明&#xff0c;使用正确的工具和技术可能是项目成功的关键。在计算机视觉领域&#xff0c;存在许多技术来解释从视频&#xff08;包括录像、流媒体或实时视频&#xff09;中获…

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析&#xff08;Software Composition Analysis&#xff0c;SCA&#xff09;是一种用于识别和分析软件内部组件及其关系的技术&#xff0c;旨在帮助开发人员更好地了解和管理其软件的构建过程&#xff0c;同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展…

递归、搜索与回溯算法:回溯,决策树

回溯算法是⼀种经典的递归算法&#xff0c;通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想&#xff1a;从⼀个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;当搜索到某个状态⽆法前进时&#xff0c;回退到前⼀个状态&#xff0c;再按照其他…

【计算机组成原理】运算方法和运算器

数据与文字的表示方法 1. 数据格式1.1 定点数表示方法1.1.1 定点小数1.1.2 定点整数 1.2 浮点数表示方法1.2.1 浮点数表示1.2.2 浮点数的规格化1.2.2.1 尾数为原码表示的规格化1.2.2.2 尾数为补码表示的规格化 1.2.3 IEEE754标准⭐ 1.3 十进制数串的表示方法1.3.1 字符串形式1.…

网盘——私聊

在私聊这个功能实现中&#xff0c;具体步骤如下&#xff1a; 1、实现步骤&#xff1a; A、客户端A发送私聊信息请求&#xff08;发送的信息包括双方的用户名&#xff0c;聊天信息&#xff09; B、如果双方在线则直接转发给B&#xff0c;不在线则回复私聊失败&#xff0c;对方…

ProgressFlowmon的confluence接口存在任意命令执行漏洞(CVE-2024-2389)

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 ProgressFlowmon是一整套用于网络映射、应用程序性能…

客户端动态降级系统

本文字数&#xff1a;4576字 预计阅读时间&#xff1a;20分钟 01 背景 无论是iOS还是Android系统的设备&#xff0c;在线上运行时受硬件、网络环境、代码质量等多方面因素影响&#xff0c;可能会导致性能问题&#xff0c;这一类问题有些在开发阶段是发现不了的。如何在线上始终…

大气的免费wordpress模板

国产的wordpress模板&#xff0c;更适合中国人使用习惯&#xff0c;更符合中国老板的审美的大气wordpress企业官网建站模板。 WordPress模板&#xff0c;也称为主题&#xff0c;是用于定义WordPress网站或博客外观和功能的预设计文件集。这些模板使用HTML、CSS和PHP代码构建&a…

上传文件到HDFS

1.创建文件夹 hdfs -dfs -mkdir -p /opt/mydoc 2.查看创建的文件夹 hdfs -dfs -ls /opt 注意改文件夹是创建在hdfs中的&#xff0c;不是本地&#xff0c;查看本地/opt&#xff0c;并没有该文件夹。 3.上传文件 hdfs dfs -put -f file:///usr/local/testspark.txt hdfs://m…

【深度学习】Vision Transformer

一、Vision Transformer Vision Transformer (ViT)将Transformer应用在了CV领域。在学习它之前&#xff0c;需要了解ResNet、LayerNorm、Multi-Head Self-Attention。 ViT的结构图如下&#xff1a; 如图所示&#xff0c;ViT主要包括Embedding、Encoder、Head三大部分。Class …

Docker in Docker的原理与实战

Docker in Docker&#xff08;简称DinD&#xff09;是一种在Docker容器内部运行另一个Docker实例的技术。这种技术允许用户在一个隔离的Docker容器中创建、管理和运行其他Docker容器&#xff0c;从而提供了更灵活和可控的部署选项。以下是DinD的主要特点&#xff1a; 隔离性&am…

力扣打卡第一天

101. 对称二叉树 C&#xff1a; class Solution { public:bool isSymmetric(TreeNode* root) {return check(root->left,root->right);}bool check(TreeNode *p,TreeNode *q){ /**定义check方法用来检查两棵树是否是镜像的*/if (!p && !q) return true; /* 如…

基于SSM的物流快递管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物流快递管理系统2拥有三个角色&#xff1a; 管理员&#xff1a;用户管理、管理员管理、新闻公告管理、留言管理、取件预约管理、收件管理、货物分类管理、发件信息管理等 用户…