前提条件:查找表中的所有记录是按关键字有序(升序或降序) 。
1 查找思想
用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。
⑴ 取中间位置Mid:Mid=(Low+High)/2 ;
⑵ 比较中间位置记录的关键字与给定的K值:
① 相等: 查找成功;
② 大于:待查记录在区间的前半段,修改上界指针: High=Mid-1,转⑴ ;
③ 小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1,转⑴ ;
直到越界(Low>High),查找失败。
int Bin_Search(SSTable ST , KeyType key)
{
int Low=1,High=ST.length, Mid ;
while (Low<High)
{
Mid=(Low+High)/2 ;
if (EQ(ST. elem[Mid].key, key))
return(Mid) ;
else if (LT(ST. elem[Mid].key, key))
Low=Mid+1 ;
else High=Mid-1 ;
}
return(0) ; /* 查找失败 */
}
2 算法分析
① 查找时每经过一次比较,查找范围就缩小一半,该过程可用一棵二叉树表示:
◆ 根结点就是第一次进行比较的中间位置的记录;
◆ 排在中间位置前面的作为左子树的结点;
◆ 排在中间位置后面的作为右子树的结点;
对各子树来说都是相同的。这样所得到的二叉树称为判定树(Decision Tree)。
② 将二叉判定树的第ë㏒2nû+1层上的结点补齐就成为一棵满二叉树,深度不变,h= ë㏒2(n+1)û 。
③ 由满二叉树性质知,第i 层上的结点数为2i-1(i≤h) ,设表中每个记录的查找概率相等,即Pi=1/n,查找成功时的平均查找长度ASL: ,当n很大 (n>50)时, ASL≈ ㏒2(n+1)-1。