您的位置:首页 > 其它

【第十四周 项目1(2)—验证分块查找算法】

2016-12-08 10:14 225 查看
问题及代码:

/*     

* Copyright (c)2015级,烟台大学 计算机与控制工程学院     

* All rights reserved.     

* 文件名称:项目1.cpp     

* 作    者:胡馨月    

* 完成日期:2016年12月8日     

* 版 本 号:v1.0      

*问题描述:认真阅读并验证分块查找算法。

*输入描述:无     

*程序输出:测试数据     

*/    

分块查找:

#include <stdio.h>

#define MAXL 100    //数据表的最大长度

#define MAXI 20     //索引表的最大长度

typedef int KeyType;

typedef char InfoType[10];

typedef struct

{

    KeyType key;                //KeyType为关键字的数据类型

    InfoType data;              //其他数据

} NodeType;

typedef NodeType SeqList[MAXL]; //顺序表类型

typedef struct

{

    KeyType key;            //KeyType为关键字的类型

    int link;               //指向对应块的起始下标

} IdxType;

typedef IdxType IDX[MAXI];  //索引表类型

int IdxSearch(IDX I,int m,SeqList R,int n,KeyType k)

{

    int low=0,high=m-1,mid,i;

    int b=n/m;              //b为每块的记录个数

    while (low<=high)       //在索引表中进行二分查找,找到的位置存放在low中

    {

        mid=(low+high)/2;

        if (I[mid].key>=k)

            high=mid-1;

        else

            low=mid+1;

    }

    //应在索引表的high+1块中,再在线性表中进行顺序查找

    i=I[high+1].link;

    while (i<=I[high+1].link+b-1 && R[i].key!=k) i++;

    if (i<=I[high+1].link+b-1)

        return i+1;

    else

        return 0;

}

int main()

{

    int i,n=25,m=5,j;

    SeqList R;

    IDX I= {{14,0},{34,5},{66,10},{85,15},{100,20}};

    KeyType a[]= {8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,94,88,96,87};

    KeyType x=85;

    for (i=0; i<n; i++)

        R[i].key=a[i];

    j=IdxSearch(I,m,R,n,x);

    if (j!=0)

        printf("%d是第%d个数据\n",x,j);

    else

        printf("未找到%d\n",x);

    return 0;

}

运行截图:

  (1)在{8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,94,88,96,87}查找85

 


(2)在{8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,94,88,96,87}查找34



学习心得:

对于代码中索引表IDX I= {{14,0},{34,5},{66,10},{85,15},{100,20}} 包括每块的最大数以及指向分快的下标。

在分块查找中,使用折半查找,折半查找很重要。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: