雜湊法又稱雜湊法,雜湊法、關鍵字位址計算法,利用雜湊法所構造出來的表叫做雜湊表。雜湊法的基本思想就是,在key和value的儲存位置p之間構造乙個雜湊函式h,使得h(key)=p,h就稱之為雜湊函式。當建立雜湊表時,直接把關鍵字為key的元素存入h(key)的單元,下一次查詢時就可以直接通過h(key)來計算出關鍵字為key的儲存位置從而找到關鍵字為key的元素。
常用的hash函式的構造方法有:數字分析法,平方取中法,分段疊加法、除留餘數法、偽隨機數法。
某學校有學生1000人,學生的學號為10086000-10086999之間,我們要把學生的基本資訊和學號儲存到hash表中然後只需要輸入學號就能查詢出相應的資訊。對於這個案列來說,首先表的長度與關鍵字的集合我們都已經確定了,並且關鍵字分布均勻,那麼就可以使用數字分析法來構造雜湊函式,通過取學號的後3位來作為雜湊函式的key。
/**
* created by zhu on 2017/3/6.
* 儲存key-value的單位
*/public class node
public object getkey()
public object getvalue()
public node getnext()
public void setnext(node next)
public void setvalue(object value)
public int gethash()
}
/**
* 數字分析法:假設key為10086000-10086999之間的數字 ,key的位數值就取數字的後三位
* */
public class digitalanalysis implements hashconstruct
@override
public int construct()
@override
public int hash(object key)
@override
public void put(object key, object value)
int index = hash(key);
node node = new node(key, value,index);
table[index] = node;
}@override
public object get(object key)
}
執行結果:/**
* hash測試客戶端
*/public class client
}
以上例子就是雜湊函式的構造方法資料分析法,數字分析法只能應用於我們事先知道關鍵字的集合,並且關鍵字集合分布均勻的時候才能使用這方法構造雜湊函式。
對於關鍵字分布不均勻的情況下,我們可以通過把關鍵字的平方之後然後取平方後的其中幾位數作為key值,這樣的話就可以保證雜湊函式有較高的概率產生不同的hash值。
某工廠大約個工人,每個工人的名字都是不一樣的,現在需要通過建立雜湊表來通過工人的姓名來查詢出每個工人的工資,這裡我們通過平方取中法來構造雜湊表。
測試客戶端:/**
* 平方取中法 ,取數值的ascii編碼,平方後取7 - 12位
*/public class squaretakelaw implements hashconstruct
@override
public int hash(object key)
long charlong = long.decode(stringbuffer.tostring());
charlong = charlong*charlong;
return integer.parseint(charlong.tostring().substring(7,12));//取平方後取7 - 12位
}@override
public void put(object key, object value)
int index = hash(key);
node node = new node(key, value,index);
table[index] = node;
}@override
public object get(object key)
}
執行結果:/**
* hash測試
*/public class client
}
這種方法是將key分為位數相等的幾部分進行相加,如下所示,最終結果1105,捨棄最高位也就是取相加的位數最終為105
1 2 3
6 0 3
2 4 7
1 1 2
+ 0 2 0
---------------
1 1 0 5
同樣的是上面的例子:某工廠大約100000個工人,每個工人的名字都是不一樣的,現在需要通過建立雜湊表來通過工人的姓名來查詢出每個工人的工資。我們通過分段疊加法來構造雜湊表。
測試客戶端:/**
* 分段疊加法 取5位數進行相加
*/public class segmentedoverlay implements hashconstruct
@override
public int hash(object key)
//取keykey的ascii編碼集的每5位進行相加,並取結果的後5位
string ovelaystring = stringbuffer.substring(0, stringbuffer.length() - stringbuffer.length() % 5);
for (int i = 5; i <= ovelaystring.length(); i = i + 5)
hash = integer.decode(string.valueof(hash).substring(string.valueof(hash).length() - 5, string.valueof(hash).length()));
return hash;
}@override
public void put(object key, object value)
int index = hash(key);
node node = new node(key, value,index);
if (index == -1)
table[index] = node;
}@override
public object get(object key)
return table[index].getvalue();}}
測試結果:/**
* hash測試
*/public class client
}
重溫資料結構 雜湊 雜湊函式 雜湊表
hash 雜湊 又稱 雜湊 雜湊 hash 英文原意是 混雜 拼湊 重新表述 的意思。在某種程度上,雜湊是與排序相反的一種操作,排序是將集合中的元素按照某種方式比如字典順序排列在一起,而雜湊通過計算雜湊值,打破元素之間原有的關係,使集合中的元素按照雜湊函式的分類進行排列。在介紹一些集合時,我們總強調...
資料結構 雜湊
裝填因子 key的個數與表長的比值。雜湊表查詢成功的平均查詢長度,查詢失敗的平均查詢長度都是期望,期望怎麼求,平均查詢長度就怎麼求。雜湊表這裡有兩種實現方式 線性開型定址雜湊,鍊錶雜湊。1.線性開型定址雜湊 陣列實現,資料個數不大於表長,放乙個元素時,若發生衝突,則順次線性掃瞄直到找到乙個空位。2....
資料結構 雜湊
關鍵 不比較關鍵碼,直接搜尋得到需要的數。特點 與搜尋樹不一樣,雜湊結構元素的儲存位置與關鍵碼直接對應,可以不用進行比較遍歷。如圖,建立乙個陣列,把a 4 中的資料按特定的規則儲存到相應的位置,比如a i n,到時候搜尋資料的時候可以按照同樣的規律直接找到這個位置,如果這個位置有數,則存在。比如按照...