查找(静态查找表)

来源:互联网 发布:js containskey 编辑:程序博客网 时间:2024/06/04 18:43
一:查找(搜索 Search)
所谓查找,就是在数据集合中寻找满足某种条件的数据对象。
 通常称用于搜索的数据集合为搜索结构(查找表),它是由同一数据类型的对象(或记录)组成。
关键字
是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。
若此关键字可以识别唯一的一个记录,则称之谓主关键字
若此关键字能识别若干记录,则称
之谓次关键字
查找的结果通常有两种可能:
 查找成功,即找到满足条件的数据对象。这时,作为结果,可报告该对象在结构中的位置,还可进一步给出该对象中的具体信息。
 查找不成功,或搜索失败。作为结果,也应 报告一些信息,如失败标志、失败位置等。
 
查找表的逻辑结构
查找表是由同一类型的数据元素(或记)构成的集合
由于集合中的数据元素之间存在着松散的关系,因此查找表是一种应用灵便的结构。
二:
查找表可分为两类:
静态查找表 :
仅作查询检索操作的查找表。
动态查找表
有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素。
三:
一、顺序查找
以顺序表或线性链表表示静态查找表
顺序查找 (Sequential Search)
所谓顺序查找,又称线性查找,主要用于在线性结构中进行查找。
设若表中有n个对象,则顺序查找从表的先(后)端开始,顺序用各对象的关键字与给定值x进行比较,直到找到与其值相等的对象,则查找成功,给出该对象在表中的位置。
若整个表都已检测完仍未找到关键字与x相等的对象,则查找失败。给出失败信息。
 
平均比较次数(1+2+3+……+n-1 +n)/n = (n+1)/2
查找算法的平均查找长度(AverageSearch Length)
   约为表长的一半。
 
二、有序查找
 
上述顺序查找表的查找算法简单,
 但平均查找长度较大,即查找效率太低,特别不适用于表长较大的查找表。
 
若以有序表表示静态查找表,则查找过程可以基于折半进行。
 
基于有序顺序表的折半搜索
 
n个对象存放在一个有序顺序表中,并按其关键字从小到大排好了序。
采用折半查找时,先求位于查找区间正中的对象的下标mid,用其关键码与给定值x比较:
 Elem[mid].Key = x,查找成功;
 Elem[mid].Key > x,把查找区间缩小到表的前半部分,再继续进行折半查找;
 Elem[mid].Key < x,把查找区间缩小到表的后半部分,再继续进行折半查找。
每比较一次,查找区间缩小一半。如果查找区间已缩小到一个对象,仍未找到想要查找的对象,则查找失败。
 
key=64的查找过程如下
 
 
low 指示查找区间的下界
high 指示查找区间的上界
mid = (low+high)/2
折半查找过程可用二叉判定树来描述
一般情况下,表长为 n的折半查找的判定树的深度和含有 n个结点的完全二叉树的深度相同。
在有序表中查找记录的过程就是走了一条从根结点到与该记录相应的结点的路径,和给定值进行的比较次数就是该结点在判定树上的层次数。
折半查找在查找成功时关键字比较次数不超过树的深度,log2+ 1
 
 
折半查找的效率比顺序查找高,但折半查找只适用于有序表,且限于顺序存储结构。
 
综合上一节讨论的几种查找表的特性:
 
可得如下结论:
1)从查找性能看,最好情况能达
      O(logn),此时要求表有序
2)从插入删除的性能看,最好
      情况能达O(1),此时要求存储
      结构是链表
 
原创粉丝点击