查找算法——索引查找

简介: 查找算法——索引查找

一、索引查找

1.1.索引查找简介
  • 索引查找又称为分块查找,其实是顺序查找和二分查找的结合,时间复杂度在二者之间
  • 整个表中的元素未必有序,但划分若干块后,每一块中的元素为有序的

索引查找时的存储结构。索引查找需要对数据列表建立一个主表和一个索引表。

  1. 主表:既要查找的序列
  2. 索引表:索引项的集合
1.2.索引查找思路

在这里插入图片描述

💡💡思路:

  1. 查找索引表。由于索引表是有序表,可采用二分查找或顺序查找,以确定查找的节点在哪一块。
  2. 在已确定的块中进行顺序查找。由于主表分块内为无序状态,进行顺序查找
  • 根据上图我们分析如下:
  1. 主表R中,第1块中最大关键字22小于第2块中最小关键字24,第2块中最大关键字48小于第3块中最小关键字49,第3块中的最大关键字是86。
  2. 如果我们查找关键字key=24。

    • 首先将key依次与索引表中各个关键字进行比较。找到索引表第1个关键字的值小于K值,因此节点不在主表第1块中。
    • 由于key<48,所以关键字为24的节点如果存在的话,则必定在第2块中。然后找到第2块的起始地址为7,从该地址开始在主表R[7…12]中进行顺序查找,直到R[11]=key为止。
    1. 查找任何元素都是如此,先确定区间。再进行查找,如果该块中查找不成功,因此说明表中不存在关键字为30的节点,给出出错提示。这样大大提高了查找效率!
1.3.时间复杂度
索引查找的时间效率介于顺序查找和二分查找之间O(log2n)~O(n)
1.4.空间复杂度
索引查找每次分块不唯一,需要的储存空间也不确定
1.5.代码实现

C++代码:

#include <stdio.h>
//定义块的结构
struct index    
{
    //块的关键字
    int key;    
    //块的起始值
    int start;
    //块的结束值   
    int end;   
}index_table[4];    
int block_search(int key,int a[])    
{
    int i,j;
    i=1;
    // 确定在哪个块中
    while(i<=3 && key>index_table[i].key)   
        i++;
     // 大于分得的块数,则返回0
    if(i>3)    
        return 0;
    //j等于块范围的起始值
    j=index_table[i].start;   
    //在确定的块内进行顺序查找
    while(j<=index_table[i].end&&a[j]!=key)  
        j++;
    //  如果大于块范围的结束值,则说明没有要査找的数,j=0
    if(j>index_table[i].end)  
        j = 0;
    return j;
}
int main() 
{
    int i,j=0,k;
    int a[18] = {22, 12, 13, 3, 9, 20, 33, 42, 44, 38, 24, 48, 60, 58, 74, 49, 86, 53};/
    int key = 12;
    for(i=1;i<=3;i++)
    {
        //确定每个块范围的起始值
        index_table[i].start=j+1;    
        j=j+1;
        //确定每个块范围的结束值
       index_table[i].end=j+4;    
        j=j + 4;
        //确定每个块范围中元素的最大值
        index_table[i].key=a[j];    
    }
    k = block_search(key,a); 
    if(k!=0)
    {
        printf("查找位置是:%d\n",k);    
    }
    else
    {
        printf("查找失败!");    
    }
    return 0;
}
1.6.优缺点

优点:

块内记录随意存放,插入或删除较容易,无须移动大量记录。

缺点:

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