开发工具与关键技术:算法
作者:听民谣的老猫
撰写时间:2020.5.28
我的上一篇博客中有讲到静态查找,这一篇博客中就将查找的另外两种方法粗略讲一下。
- 动态查找
动态查找的结构主要有二叉树结构和树结构俩种类型,我这用二叉树结构进行讲解。
什么是二叉排序树???
上图就是一个简单的二叉排序树了,由关键字值序列{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去做比较,若小于根节点就去左子树继续查找,若是大于就去右子树继续查找。
- 哈希查找(我这里不讲解理论知识,就照个人理解来讲解,理论知识自行度娘)
了解哈希查找主要理解运用一个函数(哈希函数),不同于动态,静态查找,哈希查找是通过给定值运算哈希函数直接获得存储地址。
实列:
关键值{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继续递增,直到找到位置。