索引表的顺序查找

article/2025/10/12 15:18:22

索引表的顺序查找

基本策略

  • 采用建立“目录”的形式,先查找目录,然后根据目录将需要的数据块读入内存,从而实现只需先对小部分数据进行查询,提高查找效率的效果

索引表的建立

  1. 将线索表中数据按关键字分为若干块(块可按升序、降序排序)
  2. 对每块建立索引项,每一个索引项均包含:
    1. 关键字项(该块的最大、最小关键字)
    2. 指针项(记录该块第一个数据在线索表中的位置)
  3. 将所有索引项组成索引表

索引表的查找

  1. 查找目录 (根据索引表的关键字项查找记录所在块;根据指针项确定所在块的第一个记录的物理地址)
  2. 查找数据(在块内部根据关键字查找记录的详细信息)

实例分析

在这里插入图片描述

算法分析

以查找关键字为 38的数据为例:

  • 在索引表中查询,定位关键字为38的数据元素在索引表的第二块中
  • 从线索表的第七个数据开始遍历,直到索引表第二块遍历结束(>12)
  • 如果没有找到,则查找失败,否则,查找成功

算法实现(c语言)

  • 定义索引项、索引表

    #define BLOCK_NUMBER 3/*
    * Struct: IndexNode
    * Description: 索引表的索引项
    * Member: 
    *			data: 该块中最大关键字
    *			link: 该块第一个记录在表中的位置
    */
    typedef struct IndexNode
    {int data;	//数据int link;	//指针
    }IndexNode;//索引表
    IndexNode indextable[BLOCK_NUMBER];
    
  • 建立索引表

    #define BLOCK_NUMBER 3
    #define BLOCK_LENGTH 6/*
    * Function: IndexTable
    * Description: 建立索引表
    * Parameter: int s[]: 线索表int l: 线索表长度IndexNode indextable[]: 索引表数组
    * Return: void
    */
    void IndexTable(int s[], int l, IndexNode indextable[])
    {int j = 0;for (int i = 0; i < BLOCK_NUMBER; i++){indextable[i].data = s[j];indextable[i].link = j;for (j; j < indextable[i].link + BLOCK_LENGTH && j < l; j++){if (s[j] > indextable[i].data){indextable[i].data = s[j];}}}for (int i = 0; i < BLOCK_NUMBER; i++){indextable[i].link++;	}
    }
    
  • 线索表的顺序查找

    #define BLOCK_NUMBER 3/*
    * Function: IndexSequelSearch
    * Description: 顺序表线索查找
    * Parameter: 
    *			int s[]: 线索表
    *			int l: 线索表长度
    *			IndexNode it[]: 索引表
    *			int key: 待查找关键字
    * Return: int
    *			-1: 查找失败
    *			>= 1: 关键字在线索表中的位置
    */
    int IndexSequlSearch(int s[], int l, IndexNode it[], int key)
    {//块间查找int i = 0;while (key > it[i].data && i < BLOCK_NUMBER){i++;}if (i > BLOCK_NUMBER){return -1;}else{//在块间顺序查找int j = it[i].link - 1;	//6while (key != s[j] && j < l) {j++;}if (key == s[j]){return j + 1;}else{return -1;}}
    }
    

性能分析

在这里插入图片描述

算法测试(c语言)

#include <stdio.h>#define BLOCK_NUMBER 3
#define BLOCK_LENGTH 6/*
* Struct: IndexNode
* Description: 索引表的索引项
* Member: 
*			data: 该块中最大关键字
*			link: 该块第一个记录在表中的位置
*/
typedef struct IndexNode
{int data;	//数据int link;	//指针
}IndexNode;//索引表
IndexNode indextable[BLOCK_NUMBER];/*
* Function: IndexSequelSearch
* Description: 顺序表线索查找
* Parameter: 
*			int s[]: 线索表
*			int l: 线索表长度
*			IndexNode it[]: 索引表
*			int key: 待查找关键字
* Return: int
*			-1: 查找失败
*			>= 1: 关键字在线索表中的位置
*/
int IndexSequlSearch(int s[], int l, IndexNode it[], int key)
{//块间查找int i = 0;while (key > it[i].data && i < BLOCK_NUMBER){i++;}if (i > BLOCK_NUMBER){return -1;}else{//在块间顺序查找int j = it[i].link - 1;	//6while (key != s[j] && j < l) {j++;}if (key == s[j]){return j + 1;}else{return -1;}}
}/*
* Function: IndexTable
* Description: 建立索引表
* Parameter: int s[]: 线索表int l: 线索表长度IndexNode indextable[]: 索引表数组
* Return: void
*/
void IndexTable(int s[], int l, IndexNode indextable[])
{int j = 0;for (int i = 0; i < BLOCK_NUMBER; i++){indextable[i].data = s[j];indextable[i].link = j;for (j; j < indextable[i].link + BLOCK_LENGTH && j < l; j++){if (s[j] > indextable[i].data){indextable[i].data = s[j];}}}for (int i = 0; i < BLOCK_NUMBER; i++){indextable[i].link++;}
}/*
* Function: print
* Description: 打印查找的数据元素以及其在线索表中的位置
* Parameter: int searchNumber 查找的数据元素int index		 IndexSequelSearch函数的返回值
* Return: void
*/
void print(int searchNumber, int index)
{if (index == -1){printf("查找元素:%d\n", searchNumber);printf("查找失败!\n");printf("------------------------------\n");return;}else{printf("查找元素:%d\n", searchNumber);printf("元素位置:%d\n", index);printf("------------------------------\n");return;}
}int main()
{int s[18] = {22, 12, 13, 8,   9, 20,33, 42, 44, 38, 24, 48,60, 58, 74, 49, 86, 53};IndexTable(s, 18, indextable);printf("线索表:");for (int i = 0; i < 18; i++){printf("%d ",s[i]);}printf("\n");printf("------------------------------\n");int indexNumber1 = 38;int index1 = IndexSequlSearch(s, 18, indextable, indexNumber1);print(indexNumber1, index1);int indexNumber2 = 28;int index2 = IndexSequlSearch(s, 18, indextable, indexNumber2);print(indexNumber2, index2);return 0;
}

输出如下
在这里插入图片描述

参考资料

  1. 《数据结构与算法》北京大学出版社 2018年版 林劼 刘震 陈端兵 戴波 著

http://chatgpt.dhexx.cn/article/Dw2kZadg.shtml

相关文章

顺序表的查找

前言 首先在这里要解释一下&#xff0c;为什么将顺序表这一种数据结构分为多篇文章去编写。首先我的笔记是根据王道老师的计算机考研——数据结构的视频课程去学习的。其次&#xff0c;我觉得将一种数据结构的知识放在一篇文章中&#xff0c;文章会显得过于冗长&#xff0c;容…

查找(顺序查找)

在java的介绍中&#xff0c;我们常用的查找有两种 1.顺序查找&#xff1a;&#xff08;案例演示&#xff09; 2.二分查找&#xff1a;【二分法】 案例要求&#xff1a; 有一个数列&#xff1a;白眉鹰王&#xff0c;金毛狮王&#xff0c;紫衫龙王&#xff0c;青翼蝠王&#x…

CDH6.0.1高可用

CDH高可用主要是HDFS和YARN&#xff0c;在保证hdfs数据不丢失的情况下&#xff0c;即使有节点宕机&#xff0c;重启即可也不会有影响。 官网文档 目录 HDFS HAHue 设置Hive 设置YARN HAHive HAHBase HA HDFS HA 进入HDFS -> 操作 -> High Availability。 给备用NameNo…

clickhouse 三种高可用方案

简介 本文介绍三种高可用使用&#xff0c;及验证clickhouse的高可用性&#xff0c;三种方案分别如下&#xff1a; 不管是多分片还是多副本都是以集群方式部署&#xff0c;那么对外暴露多台Clickhouse服务&#xff0c;通常会通过LB方式使每台服务器能够均匀的接受到客户端的请…

【RocketMQ】集群的搭建与高可用

RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。 Master和Slave的区别&#xff1a;在Broker的配置文件中&#xff0c;参数brokerId的值为0表明这个Broker是Master&#xff0c;大于0表明这个Broker是Slave&#xff0c;同时brokerRole参数也会说明这个Broker是Mas…

Sentry 高可用部署

Sentry 高可用部署&#xff0c;部署分析基于Sentry 10.1.0.dev 05e720a7 对应dockerhub镜像版本分别为&#xff1a; getsentry/snuba:31c967e774759c0548652d986645fdff844e0a39 getsentry/sentry:8549f2a492c803bab77af26e7417272975b9369a getsentry/symbolicator:94cdbb7b54…

HA高可用

什么事应用程序的高可用 高可用性(high availability)通常用来描述一个系统经过专门的设计,从而减少停工的时间,而保持其服务的高度可用性 高可用程序的类型 主从方式(冷备) 两个相同的应用程序,一个对外提供服务,成为主程序,另一个平时不运行为备程序,就是一个主程序的备份,…

harbor高可用部署

harbor高可用简介 harbor目前有两种主流的高可用方案&#xff1a; 双主复制&#xff0c;harbor自带的镜像复制功能多harbor实例共享后端存储 双主复制架构在遇到大镜像时有同步延迟&#xff0c;并且一个实例故障后需要手动重新开启复制策略才能再次同步&#xff0c;下面以阿里…

HADOOP 高可用搭建

首先先说一下大概的步骤&#xff0c;就用四台为例&#xff0c;简单适合新手操作。 流程是&#xff1a;创建虚拟机&#xff0c;配置好&#xff1b;搭建linux系统&#xff1b;安装jdk&#xff08;因为后面好多都依赖jkd&#xff09;&#xff1b;免密登录ssh&#xff1b;安装zook…

高可用详细概念及三种决策方式分析

文章目录 1.基本概念1.计算高可用2.存储高可用高可用状态决策1.独裁式2.协商式3.民主式 1.基本概念 这个定义的关键在于“无中断”&#xff0c;但恰好难点也在“无中断”上面&#xff0c;因为无论是单个硬件还是单 个软件&#xff0c;都不可能做到无中断&#xff0c;硬件会出故…

Nacos实现高可用

由于Nacos暂不支持Arm架构芯片的Mac集群搭建&#xff0c;本小节用Linxu云主机&#xff08;Nacos比较吃内存&#xff0c;2个Nacos服务器集群&#xff0c;至少2G内存&#xff09;环境演示。 通过前面的学习&#xff0c;我们已经了解了如何使用Nacos以及Nacos的功能等&#xff0c;…

浅谈高可用测试

前言 现今的互联网产品越来越注重可靠性&#xff0c;尤其是在生产环境中使用的系统&#xff0c;对高可用性都有一定的要求。而作为产品的提供方&#xff0c;在交付产品之前&#xff0c;也会对高可用进行验收测试。近期跟进过两个产品曾有高可用测试的需求&#xff0c;在此简单…

nginx高可用

Nginx高可用 为什么要使用nginx的高可用&#xff1a;因为nginx作为反向代理服务器时&#xff0c;有可能出现宕机的情况&#xff0c;而由于其反向代理的特性&#xff0c;就会导致其他服务器&#xff08;tomcat等&#xff09;无法被访问&#xff0c;这样项目就停止工作了。但是使…

RabbitMQ高可用

RabbitMQ高可用 各种消息队列对比使用推荐 RabbitMQ 高可用普通集群模式镜像集群模式保证消息队列的幂等性(消息不被重复消费)消息队列的可靠性传输生产者丢失数据RabbitMQ丢失数据消费者丢失数据 保证消息的顺序性消息积压问题 各种消息队列对比 特性ActiveMQRabbitMQRocketM…

系统高可用

系统高可用 1. 什么是高可用&#xff1f;可用性的判断标准是啥&#xff1f;1.1 可用性的判断标准是啥&#xff1f; 2. 哪些情况会导致系统不可用&#xff1f;3. 有哪些提高系统可用性的方法&#xff1f;3.1 注重代码质量&#xff0c;定时Review代码3.2 使用集群&#xff0c;减少…

HBase高可用

一、HBase高可用简介 HBase集群如果只有一个master&#xff0c;一旦master出现故障&#xff0c;将导致整个集群无法使用&#xff0c;所以在实际的生产环境中&#xff0c;需要搭建HBase的高可用&#xff0c;也就是让HMaster高可用&#xff0c;也就是需要再选择一个或多个节点也…

你管这破玩意儿叫高可用

大家好&#xff0c;我是坤哥 今天我们来聊一下互联网三高&#xff08;高并发、高性能、高可用&#xff09;中的高可用&#xff0c;看完本文相信能解开你关于高可用设计的大部分困惑 前言 高可用&#xff08;High availability&#xff0c;即 HA&#xff09;的主要目的是为了保障…

什么是高可用?高可用介绍:

前言&#xff1a; 高可用&#xff08;High availability&#xff0c;即 HA&#xff09;的主要目的是为了保障「业务的连续性」&#xff0c;即在用户眼里&#xff0c;业务永远是正常&#xff08;或者说基本正常&#xff09;对外提供服务的。高可用主要是针对架构而言&#xff0c…

HTML Responsive Web Page

注&#xff1a;参考网站 https://www.w3schools.com HTML Responsive Web Page index.html <!DOCTYPE html> <html><head><link rel"stylesheet" href"style.css"><title>Responsive web page</title><meta lan…

响应式布局【Responsive】 与 自适应布局 【adaptive】、单页面【SPA】 和多页面【MPA】

1、响应式布局 是一个网址能兼容多个terminate【终端】&#xff0c;而不是为每个终端做一个特定的版本 优点&#xff1a; 用户体验好节约开发时间、节省设计seo友好可以适用所有设备屏幕 缺点 设计与风格有局限性《自由度太低&#xff0c;局部性较大》灵活性有所欠缺 基于不…