索引查找(分块查找)

索引查找思想是分块查找,它其实是顺序查找和二分查找的结合,即时间复杂度在两者之间。

索引查找表两部分构成
  • 索引表存储的是各块记录中的最大关键字值和各块的其实存储地址
  • 块表中存储查找表中所有的记录并按块有序,建议用链式存储

这里写图片描述

这里写图片描述

        #include <stdio.h>
        #include <malloc.h>
        typedef int keytype;
        typedef struct bnode{//块链结点类型
            keytype key;
            struct bnode *next;
        }Bnode,*Bnode2;

        typedef struct{//索引表
            keytype Maxkey;
            Bnode *head;
        }Snode;

        typedef struct{
            Snode r[100];
            int length;
        }Stable;

        int FindBlock(Stable ST,keytype key)//利用二分确定在哪一块
        {
            int low,high,mid;
            low=1;high=ST.length;
            while(low<=high)
            {
                mid=(low+high)/2;
                if(key==ST.r[mid].Maxkey)
                    return mid;
                else if(key<ST.r[mid].Maxkey)
                    high=mid-1;
                else
                    low=mid+1;
            }
            return high+1;
        }

        void FindRec(Stable ST,keytype key)//顺序查找块链
        {
            Bnode2 p;
            int Bno;
            int count=0;
            Bno=FindBlock(ST,key);
            p=ST.r[Bno].head->next;
            while(p&&p->key!=key)
            {
                p=p->next;
                ++count;
            }
            if(p)
                printf("%d找到,在第%d块,从大到小第%d个数\n",p->key,Bno,count);
            else
                printf("找不到\n");
        }

        Bnode2 Init_head(Bnode2 head,int n)//头插法创建块链
        {
            Bnode2 p;
            int i=0;
            head=(Bnode2)malloc(sizeof(Bnode));
            head->next=NULL;
            while(i<n)
            {
                p=(Bnode2)malloc(sizeof(Bnode));
                scanf("%d",&p->key);
                p->next=head->next;
                head->next=p;
                i++;
            }
            return head;
        }

        int main()
        {
            Stable ST;
            Bnode2 T;
            Bnode2 p;
            int key2;
            int get;
            int i;
            //赋值索引表长度
            ST.length=6;
            //索引表的值
            ST.r[1].Maxkey=4;
            //该值的地址,方便找到这个块的内容元素,2代表该块中元素个数
            ST.r[1].head=Init_head(T,2);
            ST.r[2].Maxkey=9;
            ST.r[2].head=Init_head(T,2);
            ST.r[3].Maxkey=14;
            ST.r[3].head=Init_head(T,3);
            ST.r[4].Maxkey=20;
            ST.r[4].head=Init_head(T,3);
            ST.r[5].Maxkey=26;
            ST.r[5].head=Init_head(T,2);
            ST.r[6].Maxkey=33;
            ST.r[6].head=Init_head(T,2);



            for(i=1;i<=ST.length;i++)
            {
                printf("第%d块数据最大关键字  ",i);
                printf("%d",ST.r[i].Maxkey);
                printf("\n第%d块数据  ",i);
                p=ST.r[i].head->next;
                while(p)
                {
                    printf("%d  ",p->key);
                    p=p->next;
                }
                printf("\n");
            }
                printf("input KEY\n");
                while(1)
                {
                    scanf("%d",&key2);
                    FindRec(ST,key2);
                }
        }

运行结果

这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值