• 【21天算法挑战赛】查找算法——索引查找



    ​💬💬作者有话想说:

    💟作者简介:我目前是一个在校学生,想通过自己的学习努力让自己的技术、知识都慢慢提升,希望我们一起学习呀~💜💜💜

    ☂️兴趣领域:目前偏向于前端学习 💜💜💜

    🎬> 活动地址:CSDN21天学习挑战赛

    💜有话想说:写博客、记笔记并不是一种自我感动,把学到的东西记在脑子里才是最重要的,在这个过程中,不要浮躁,希望我们都可以越来越优秀!💜💜💜

    🪀语言说明:代码实现我会用Python/C++~

    一、索引查找

    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 
    //定义块的结构
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    1.6.优缺点

    优点:

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

    缺点:

    增加了一个辅助数组的存储空间,以及初始表的分块排序运算。

  • 相关阅读:
    6套台式组装机电脑配置清单大全(2022年618)
    2020年研究生数学建模竞赛E题—— 基于视频数据的能见度估计与预测——研读笔记
    卓豪再签洛钼集团,实现AD域自动化管理有效降低管理人员工作负荷
    给 hugo 博客添加搜索功能
    gulp打包vue3+jsx+less插件
    JAR 文件规范详解
    深入了解 npm 命令
    软考高项第四版教材整合管理(第8章)重点内容
    物联网-物联前端安全加密技术简介
    1.16 - 校验码
  • 原文地址:https://blog.csdn.net/m0_62159662/article/details/126397958