动态查找 哈希查找

开发工具与关键技术:算法 
作者:听民谣的老猫
撰写时间:2020.5.28

我的上一篇博客中有讲到静态查找,这一篇博客中就将查找的另外两种方法粗略讲一下。

  1. 动态查找

动态查找的结构主要有二叉树结构和树结构俩种类型,我这用二叉树结构进行讲解。

 

什么是二叉排序树???

上图就是一个简单的二叉排序树了,由关键字值序列{50,70,20,10………}构成。

就由图来理解就很可以很清晰的找到二叉树的一些性质,它的分布依据是左子树的所有结点值都小于根节点的值,右节点所有的值又大于根节点的值

图上的50就是根节点,右边的数值是不是大于50,左边数值小于50,就是这样理解。

 

二叉排序树的查找算法代码

BSTree f;
BSTree BSTSearch(BSTree t,KeyType k){
p=t;f=NULL;  /*在根节点为t的二叉排序树中查找关键字值等于k的节点*/
while(p!=NULL){if(k==p->key)
return(p);  /*查找成功*/
else
if(k<p->key)
{f=p;p=p->lchild;}  /*在左子树中继续查找*/
else
{f=p;p=p->rchild:}}  /*在右子树中继续查找*/
return(NULL); /*查找失败*/
}

 

解析:

依据给定值k和根节点t去做比较,若小于根节点就去左子树继续查找,若是大于就去右子树继续查找。

 

  1. 哈希查找(我这里不讲解理论知识,就照个人理解来讲解,理论知识自行度娘)

了解哈希查找主要理解运用一个函数(哈希函数),不同于动态,静态查找,哈希查找是通过给定值运算哈希函数直接获得存储地址。

实列:

 

关键值{42,8,37,24,19,55},表长7(表长一般是1.1倍关键数个数到1.7倍),哈希函数H(k)=k%7(自己设计)k就是给定值。假设给定值是42,那就是42%7=6 余数是0,那么42的存储位置就是0.也就是说依据余数来决定位置。

从上面简单的一个案列就可以知道哈希查找的一些特性了,首先它的的表长是自己设的,就连哈希函数也是自己设置的。

如何设计哈希函数???

哈希函数的设计要注意减少冲突的发生,冲突就是假如不一样的值但是余数相同,就拿上面的案列来讲,如果再来一个关键值为21,21%7=3,余数也是0,那么就一个位置出现两数值了,哈希函数的设置就是要避免这种冲突的发生。

当然也有方法来处理冲突啦,开放地址法!!!

Key(关键值)  m(表长)  i从0开始如果起冲突i递增

也拿上面的案列来了解一下开放地址法,(42+0)%7=6,余数0,位置0。

为了验证这个方法的可行度,添加关键字21来测试一下,(21+0)%7=3,储存位置已经有了值。此时i就要递增,套自己设计的哈希函数就是(21+1)%7=3,余数1,位置1.假如位置1也有了值那么i继续递增,直到找到位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章