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