(五)查找
查找是常用的基本运算。查找表是指由同一类型的数据元素(或记录)构成的集合。对查找表经常进行的两种操作:(1)查询某个特定的数据元素是否在查找表中。(2)检索某个特定的数据元素的各种属性。只进行这两种 操作的查找表 称为静态查找表。 对查找表要进行的另外两种操作如下:(1)在查找表中插入一个数据元素。(2)在查找表中删除一个数据元素。 进行这两种操作的查找表为动态查找表。
为确定记录在查找表中的 位置,需和给定关键字值进行比较的次数的期望值称为查找算法在查找成功时的平均查找长度。对于含有n个记录的表,查找成功时的平均查找长度定义为:其中,pi为对表中第i个记录进行查找的概率,且,一般认为pi = 1/n,Ci为找到表中其关键字与给定值相等的记录时,和给定值已进行过比较的关键字个数,Ci随查找方法的不同而不同。
1、静态查找表的查找方法
(1)顺序查找
从表的一端,逐个将记录的关键字和给定值比较,找到则查找成功,若将整个表中的记录均比较过, 仍未能找到关键字等于给定值的记录,则查找失败。
顺序查找对顺序存储方式和链式存储方式的查找表都适用。
(2) 折半查找
设查找表的元素存储在一维数组r[1, ……, n]中, 表中元素已经按照 关键字递增方式排序的情况下,折半查找的而方法是:首先将待查元素的关键字(Key)值与表r中间位置上(下标为mid)记录的关键字进行比较,若相等,则查找成功,若key > r[mid].key,则说明待查记录只肯在后半个子表r[mid + 1, ……, n]中, 下一步应在后半个子表中查找,若key < r[mid].key,则说明待查记录只肯在前半个子表r[1, ……, mid - 1]中, 下一步应在前半个子表中查找, 这样逐步缩小范围,直到查找 成功或子表为空 时失败为止。
折半查找的 过程可以用一棵二叉树描述,方法是当前查找区间的中间位置序号作为根,左半个子表和右半个子表中的记录序号分别作为根的左子树和右子树上的结点,这样构造的二叉树称为折半查找判定树