数据结构:查找表
静态查找:对查找表只查找、不改变;
动态查找:对查找表既查找也改变
查找表:由同一类型的数据元素(或记录)构成的集合
关键字:由数据元素(或记录)中某个数据项的值,用它可以标识(识别)一个数据元素(或记录)。
主关键字:若次关键字可唯一标识一个记录,则称为主关键字
次关键字:用以标识若干记录的关键字
注:当数据元素只有一个数据项时,其关键字即为该数据元素的值;由于集合是一个松散的关系,给查找带来不便,为此,需要在数据元素之间人为的加上一些关系
我们的查找方法取决于表中数据的排列方式,针对静态、动态查找方法有所不同
平均查找长度:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值称为查找算法在查找成功时的平均查找长度(ASL)。ASL值越小,时间效率越高。
1.静态查找
以顺序表或线性链表表示静态查找表
顺序查找、折半查找、分块查找
1.1 顺序表的查找
顺序查找的基本思想:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;繁殖,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。
改进:往往可以设置哨,目的在于免去查找过程中每一步都要检测正标是否查找完毕,实践证明,这个改进能是顺序表在表长>=1000时,进行一次查找所需的平均时间几乎减少一半。
当各个记录查找概率相等时,ASL=(n+1)/2,(n为记录个数);有时,表中各个记录的查找概率并不相等,因此,对记录的查找概率不等的查找表若能预先得知每个记录的查找概率,则应先对记录的查找概率进行排序,是表中记录案查找概率由小至大重新排列,以便提高查找效率。为了提高查找效率,我们可以在每个记录中附设一个访问频度域,或者在每次查找之后都将刚查到的记录移至表尾。
顺序查找和我们后面要讨论的其他算法相比,其缺点是ASL较大,特别是当n很大时,查找效率极低;其很大的优点是:算法简单且适应面广。它对表的结构无任何要求,无论记录是否按关键字有序均可应用,而且上述讨论对线性链表也同样适用。
1.2 有序表的查找
折半查找的基本思想:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。 由此可见,折半查找只适用于有序表,且限于顺序存储结构(对线性链表无法进行查找)。
主要操作:假设指针low和hign分别指示待查元素所在范围的下界和上界,指针mid指示区间的中间位置,即mid=(low+hign)/2。给定值key,若key>mid(所指元素),则low=mid+1,mid=(low+hign)/2;反之,若小于,则hign=mid-1,mid=(low+hign)/2;若等于则查找成功,若low>hign,则查找失败。
折半查找的性能分析:
查找过程可用二叉树来描述,树中每个结点表示表中一个记录,结点中的值为该记录在表中的位置,通常称这个描述查找过程的二叉树为判定树。因此,折半查找法在查找成功时进行比较的关键字个数最多不超过树的深度,而具有n个结点的判定树的深度为[log(2)n]+1,所以,折半查找法在查找成功时和给定值进行比较的关键字个数至多为[log(2)n]+1。由此,判定树只于元素个数n有关。
当个记录查找概率相等时,折半查找最优;概率不相等时,折半查找未必最优。
1.3索引顺序表的查找
分块查找又称索引顺序查找,这是顺序查找的一种改进方法。
两表:索引表(最大关键字,最大关键字对应的地址)(有序)
表
分块查找分两步进行:先确定待查记录所在的块(子表),然后在块中顺序查找。
ASL=La+Lb;(La:查找索引表确定所在块的平均查找长度;Lb:在块中查找元素的平均查找长度)
一般情况下,为进行分块查找,可以将长度为n的表均匀地分为b块,每块含有s个记录,即b=[n/s];又假定表中每个记录的查找概率相等,则每块查找的概率为1/b,块中每个记录的查找概率均为1/s。
1.若用顺序查找确定所在快,则分块查找的平均查找长度为:ASL=(n/s+s)/2+1;
课件,此时的平均查找长度不仅和表长n有关,而且和每一块中的记录个数s有关。在给定n的前提下,s是可以选择的。容易证明,当s取根号n时,ASL取最小值(根号n+1)。这个值比顺序查找有了很大改进,但远不及折半查找。
2.若用折半查找确定所在块,则分块查找的平均查找长度为:ASL=log(2)(n/s+1)+s/2;