分块查找
来源:互联网 发布:无线耳机推荐 知乎 编辑:程序博客网 时间:2024/05/17 14:27
分块查找(Blocking Search)又称索引顺序查找,是前面两种查找方法的综合。
1 查找表的组织
① 将查找表分成几块。块间有序,即第i+1块的所有记录关键字均大于(或小于)第i块记录关键字;块内无序;
② 在查找表的基础上附加一个索引表,索引表是按关键字有序的,索引表中记录的构成是:最大关键字+起始指针;
2 查找思想
先确定待查记录所在块,再在块内查找(顺序查找)。
3 算法实现
typedef struct IndexType
{
keyType maxkey ; /* 块中最大的关键字 */
int startpos ; /* 块的起始位置指针 */
}Index;
int Block_search(RecType ST[] , Index ind[] , KeyType key , int n , int b)
/* 在分块索引表中查找关键字为key的记录 */
/*表长为n ,块数为b */
{
int i=0 , j , k ;
while ((i<b)&<(ind[i].maxkey, key) ) i++ ;
if (i>b)
{
printf("\nNot found");
return(0);
}
j=ind[i].startpos ;
while ((j<n)&&LQ(ST[j].key, ind[i].maxkey) )
{
if ( EQ(ST[j].key, key) ) break ;
j++ ;
} /* 在块内查找 */
if (j>n||!EQ(ST[j].key, key) )
{
j=0;
printf("\nNot found");
}
return(j);
}
4 算法分析
设表长为n个记录,均分为b块,每块记录数为s,则b=⌈n/s⌉。设记录的查找概率相等,每块的查找概率为1/b,块中记录的查找概率为1/s,则平均查找长度ASL: