Bootstrap

查找——线性表之折半查找与分块查找

本篇文章主要介绍线性表中的折半查找与分块查找算法。

线性表的查找:

        1,查找的基本概念及顺序查找

        2,折半查找

折半查找:每次将待查记录所在区间缩小一半。(有序表表示静态查找表)

下面给出一个例子分析折半查找的过程,一共用到了两个指针high和low,mid始终等于(high+low)/2。

若k==R[mid].key,查找成功;若k<R[mid].key,则high=mid-1;若k>R[mid].key,则low=mid+1

k==R[mid].key,查找成功

k<R[mid].key,则high=mid-1

k>R[mid].key,则low=mid+1

直至low>high时,查找失败

 由上述实例我们可以总结出折半查找的步骤:

 

以下是代码实例 

int Search_Bin(SSTable ST,KeyType key)
{
	//若找到,则函数值为该元素在表中的位置,否则为0
    low=1;high=ST.length;						 while(low<=high){
        mid=(low+high)/2;
        if(key==ST.R[mid].key) return mid; 
        else if(key<ST.R[mid].key) high=mid-1;    //前一子表查找
        else low=mid+1;                       		    //后一子表查找
    }									    return 0;		//表中不存在待查元素
}		

下面是使用递归算法

int Search_Bin (SSTable ST, keyType key, int low, int high) 
{ 
  if(low>high) return 0;   //查找不到时返回0 
  mid=(low+high)/2; 
  if(key等于ST.elem[mid].key)  return mid; 
  else if(key小于ST.elem[mid].key)  
    ……..//递归
  else…….  //递归
} 

实际上我们可以使用二叉判定树来理解折半查找的过程

  比较的次数<=树的深度

下面是一个练习

折半查找的性能分析:

 我们可以总结出折半查找的特点:

 

        3,分块查找 

分块查找的特点是分块有序,块内无序。分块有序,即分成若干子表,要求每个子表中的数值都比后一块中数值小(但子表内部未必有序)。然后将各子表中的最大关键字构成一个索引表,表中还要包含每个子表的起始地址(即头指针)。我们通过下面这个图来理解。

 分块查找的过程:

对索引表使用折半查找法(因为索引表是有序表);

确定了待查关键字所在的子表后,在子表内采用顺序查找法(因为各子表内部是无序表);

 分块查找的优缺点:

 4,线性表三种查找方法的比较:

折半折半查找的性能分析查找的性能分析 

 

 

直至直至low>high时,查找

直至low>high时,查找失败 

 直至low>high时,查找失败

直至low>high时,查找失败 

直至low>high时,查找失 

;