经典算法之索引查找

简介: 经典算法之索引查找

在这里插入图片描述

前言:
✌ 作者简介:游坦之 ✌
🏆 大学软件工程在读,希望学到真本领,经世致用 🏆
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:成好人,行好事,做儒猿💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

@TOC

索引查找

在这里插入图片描述

什么是索引查找

​ 索引查找是在索引表和主表进行的查找,存储结构是线性表。索引查找是将表分成几块,并且块内无序,块间有序;先确定待查记录所在的块,再在块内查找。

算法实现

1、用数组存放待查记录,每个数据元素至少含有关键字域

2、建立索引表,每个索引表结点含有最大关键字域和指向本快第一个结点的指针,例如下图。

在这里插入图片描述

举个栗子

​ 对下图查找13,首先现在索引表(最大关键字表)里面查找,因为这个是有序的,第n+1总是比第n块里的所有元素要大。

​ 13是小于18而大于8的,所以如果13在这个表里面,他只可能存在于18该分块中。

​ 于是在18分块,也就是坐标4-8中进行顺序查找,查找了三次找到了13,也就是说总共查找了2+3次。

​ 因此,平均查找长度为ASLbc = Lb + Lc;

​ Lb:查找索引表确定所在块的平均查找长度。

​ Lc:在块中查找元素的平均查找长度。

伪代码

//用数组表示
int a[M][M] = {{8,0},{18,4},{2022,8}};
int b[M] = {8,1,4,7,18,17,13,16,2022,2019,2021,2020};
int key;
int n;//索引表的元素个数
int m;//块中的元素个数
for(int i=0;i<n;i++)
{
    if(key<a[i][0])
    {
        for(int j = a[i][1];j<a[i][1]+m;j++ )
        {
            if(b[j] == key)
            {
                cout<<j<<endl;
                break;
            }
        }
        break;
    }
    
}

实战演练

用程序实现在{8,1,4,7,18,17,13,16,2022,2019,2021,2020}里面查找13的过程。

#include <iostream>
using namespace std;
int n = 3;
int m = 4;
int a[3][2] = {{8,0},{18,4},{2022,8}};
int b[12] = {8,1,4,7,18,17,13,16,2022,2019,2021,2020};
int key = 13;
int length = 0;
int main()
{
    
    for(int i=0;i<n;i++)
    {
        if(a[i][0]>key)
        {
            for(int j=a[i][1];j<a[i][1]+m;j++)
            {
                if(b[j] == 0)
                {
                    break;
                }else{
                    if(b[j] == key)
                    {
                        length = j-a[i][1] + i + 2;
                        cout<<j<<endl;
                    }
                }
            }
            break;
        }
    }
    cout<<"平均查找长度为:"<<length<<endl; 
    return 0;
 } 

效果图:
在这里插入图片描述

✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$ <br/>
👍 $\textcolor{green}{点赞,你的认可是我创作的动力!}$ <br/>
⭐️ $\textcolor{green}{收藏,你的青睐是我努力的方向!}$ <br/>
✏️ $\textcolor{green}{评论,你的意见是我进步的财富!}$ <br/>

在这里插入图片描述

相关文章
|
存储 算法 关系型数据库
深入理解InnoDB索引数据结构和算法
1. **索引定义**:索引是提升查询速度的有序数据结构,帮助数据库系统快速找到数据。 2. **索引类型**:包括普通索引、唯一索引、主键索引、空间索引和全文索引,每种有特定应用场景。 3. **数据结构**:InnoDB使用B+树作为索引结构,确保所有节点按顺序排列,降低查询时的磁盘I/O。 4. **B+树特性**:所有数据都在叶子节点,非叶子节点仅存储索引,提供高效范围查询。 5. **索引优势**:通过减少查找数据所需的磁盘I/O次数,显著提高查询性能。 **总结:**InnoDB索引通过B+树结构,优化了数据访问,使得查询速度快,尤其适合大数据量的场景。
864 0
深入理解InnoDB索引数据结构和算法
|
算法 索引
|
存储 算法 数据库
经典算法学习之-----顺序查找,折半查找,索引查找(二)
经典算法学习之-----顺序查找,折半查找,索引查找(二)
504 0
|
1月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
155 10
|
1月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
134 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
2月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
115 3
|
7月前
|
存储 算法 C++
Windows共享文件:探秘C++实现的B树索引算法奇境
在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
|
4月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
130 4
|
算法 索引
【算法】二分算法——山脉数组的峰顶索引
【算法】二分算法——山脉数组的峰顶索引
|
存储 算法 物联网
R-Tree算法:空间索引的高效解决方案
【5月更文挑战第17天】R-Tree是用于多维空间索引的数据结构,常用于地理信息系统、数据库和计算机图形学。它通过分层矩形区域组织数据,支持快速查询。文章介绍了R-Tree的工作原理、应用场景,如地理信息存储和查询,以及Python的`rtree`库实现示例。此外,还讨论了R-Tree的优势(如空间效率和查询性能)与挑战(如实现复杂和内存消耗),以及优化和变种,如R* Tree和STR。R-Tree在机器学习、实时数据分析等领域有广泛应用,并与其他数据结构(如kd-trees和quad-trees)进行比较。未来趋势将聚焦于优化算法、动态适应性和分布式并行计算。
722 1

热门文章

最新文章

下一篇
oss云网关配置