查找算法

1. 顺序查找: 在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。

     算法如下:

       1. 让关键字与队列中的数从第后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。

2. 折半查找: 从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分. 其优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表

     算法如下:

      1. 待查找数据值与中间元素值正好相等,则放回中间元素值的索引。
      2. 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。
      3. 待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值
      4. 如果最后找不到相等的值,则返回错误提示信息。

3. 二叉数查找: 二叉查找树它或者是一棵空树;或者是具有下列性质的二叉树: 1.若左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2.若右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3.左、右子树也分别为二叉排序树;

     算法如下:

     1. 若根结点的关键字值等于查找的关键字,成功。
     2. 否则,若小于根结点的关键字值,递归查左子树。
     3. 若大于根结点的关键字值,递归查右子树

4. 索引查找 :在索引表和主表(即线性表的索引存储结构)上进行的查找.   

  索引术语
     1,主表。即要查找的对象。
     2,索引项。一般我们会将主表分成几个子表,每个子表建立一个索引,这个索引就叫索引项。
     3,索引表。即索引项的集合。

     索引项包括以下三点。
     1,index,即索引指向主表的关键字。
     2,start,即index在主表中的位置。
     3,length,即子表的区间长度。

     算法如下:
     1.首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定K1对应的子表在主表中的开始位置和长度
     2.然后再根据给定的关键字K2,在对应的子表中查找出关键字等于K2的元素(结点)。

5. 哈希查找: 根据当前待查找数据的特征,以记录关键字为自变量,设计一个哈希函数,依该函数按关键码计算元素的存储位置,并按此存放;查找时,由同一个函数对给定值key计算地址,将key与地址单元中元素关键码进行比较,确定查找是否成功。哈希方法中使用的转换函数称为哈希函数(杂凑函数),按这个思想构造的表称为哈希表.哈希查找的产生有这样一种背景——有些数据本身是无法排序的(如图像),有些数据是很难比较的(如图像)。如果数据本身是无法排序的,就不能或比较难对它们进行比较查找。  

     算法如下
      1.用给定的哈希函数构造哈希表;
      2.根据选择的冲突处理方法解决地址冲突;
      3.在哈希表的基础上执行哈希查找

     建立哈希表算法:

      1. 取数据元素的关键字key,计算其哈希函数值。若该地址对应的存储空间还没有被占用,则将该元素存入;否则执行step2解决冲突。
      2. 根据选择的冲突处理方法,计算关键字key的下一个存储地址。若下一个存储地址仍被占用,则继续执行step2,直到找到能用的存储地址为止。

     哈希查找方法:

      1. 设哈希表为HST[0~M-1], 哈希函数取H(key), 解决冲突的方法为R(x)对给定k值, 计算哈希地址 Di=H(k); 若HST为空,则查找失败; 若HST=k, 则查找成功;否则, 执行step2(处理冲突).
      2. 重复计算处理冲突的下一个存储地址 Dk=R(Dk-1), 直到HST[Dk]为空, 或HST[Dk]=k为止. 若HST[Dk]=K,则查找成功,否则查找失败。 1

     解决哈希冲突方法:

      1. 开放地址法: 当发生地址冲突时,按照某种方法R(x)继续探测哈希表中的其他存储单元,直到找到空位置为止。

      2. 链地址法: 将哈希值相同的数据元素存放在一个链表中,在查找哈希表的过程中,当查找到这个链表时,必须采用线性查找方法。

posted on 2014-04-13 20:25  kangbry  阅读(438)  评论(0编辑  收藏  举报

导航