動態查找 哈希查找

開發工具與關鍵技術:算法 
作者:聽民謠的老貓
撰寫時間: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繼續遞增,直到找到位置。

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