雜湊表是儲存的是鍵值對,給出乙個鍵值,雜湊表可以在o(1)的時間複雜度查詢。也就是說,它通過把關鍵碼值對映到乙個表中的乙個位置來記錄,加快查詢速度。這個函式叫雜湊函式,存放記錄的陣列叫雜湊陣列。
構造查詢效率高的雜湊表基於以下兩個方面:構造雜湊函式的方法和處理衝突的方法。
構造雜湊函式,即雜湊函式,好的雜湊函式,能使衝突和空間降低。一般有直接定址法,摺疊法,除留餘數法。在acm中,見到的字串hash函式elfhash。一般採用除留餘數法。
在acm中只要設計大規模(10,000以上)的查詢問題,首先應該想到hash。
例如poj2503,給出一串單詞+對應的英文,任意給出乙個單詞,要你查出它的英文。
輸入:
dog ogday
cat atcay
pig igpay
froot ootfray
loops oopslay
atcay
ittenkay
oopslay
輸出:
cat
ehloops
輸入的有10w對,要是每次都從這10w的資料線性比較o(n),每次查詢乙個單詞需要20*100000。查詢多個單詞,顯然效率太低。還可以想到用二分,將輸入的資料按照單詞排序,查詢就只需要log2(n),每次查詢乙個單詞需要20*25。
還可以將單詞hash,雜湊函式採用elfhash,衝突處理採用鍊錶法,這樣,對於要查詢的單詞,先hash,再在hash表中檢視,匹配是否相等。只需要o(1)。
從上面的三種演算法來看,時間複雜度由o(n)-->o(log2n)-->o(1),可見二分查詢還是很牛b的,但hash更強。
對於poj2002,給出n個點的座標(n=1000,-20000<=x,y<=20000),現在要判斷這些點能構成多少個正方形。
首先是如何判斷幾個點能否構成正方形:從n個點中任意選取兩點,求出另外兩點的座標,看另外兩點是否在那n個點中。
列舉每兩個點(o(n*n)),根據兩點算出另外兩點,判斷這兩點是否在集合中。現在問題轉化為:如何判斷某點是否在輸入的集合中。這個問題與2002類似,這裡就不再贅述。
對於poj3349,每片雪花有6個數組成,在這6個樹中,可以從任意乙個數開始,順時針或者逆時針走一遍,認為也是相同的雪花。現在給出n片雪花,判斷這n片雪花中是否有相同的兩片。n=100,000。
最簡單的就是列舉每兩片雪花,判斷他們是否相同。時間複雜度為o(n*n),顯然效果不理想。有沒有更好的演算法呢?
hash:每讀進一片雪花,將雪花hash,判斷hash表裡是否有相同的hash值,有相同的hash值,從鍊錶中一一取出並判斷是否同構,是同構得出結果。然後將該雪花加入到表中,所有雪花讀完也沒有發現相同的,則得出結果。
對於poj3274,每頭牛有乙個特徵值n,將n表示成k位二進位制形式,第i位上的數為1代表該牛擁有特徵i,現在有一排牛,要求出連續的牛,滿足這些牛的k個特徵個數都相同,求出滿足要求的最長的牛序列。n=100,000
很直接的想法就是列舉所有的牛,求和,判斷每個屬性是否相等,複雜度為o(n*n)。
將資料處理:
//對於sample的資料的處理
//前導零 000 000
//7---->111---->111---->000
//6---->110---->221---->110(*)
//7---->111---->332---->110
//2---->010---->342---->120
//1---->001---->343---->010
//4---->100---->443---->110(*)
//2---->010---->453---->120
//443 - 221 = 222說明在這個範圍內3中特色都有相同的個數2
//每個2進製結果所有位減去他們當中的任意位,上面例子取減去最右邊那一位
//這樣將問題轉化為判重,,只要找兩位他們是相同的並且距離是最遠的即可(加*為答案),用hash來解決是o(nk)
對於poj2151,也是類似的。
可見,遇到這類題意簡單並且沒有好的演算法時,用hash往往能達到好的效果。
資料結構雜湊表在查詢中的使用
雜湊表的原理是將全部資料通過某個函式來確定獨特的乙個儲存位置,在查詢某個資料時通過該函式來直接得到該資料的儲存位置。所以在理想情況下該種查詢方法的期望時間為o 1 衝突是雜湊表使用過程不可避免的存在,在資料較為龐大時,通過固定的乙個函式轉換很可能得到相同的結果,就發生了儲存位置的衝突。所以在雜湊表使...
雜湊表的查詢
對給定的關鍵字key,用乙個函式h key 計算出元素位址,由此而得雜湊表 hash表,雜湊表 其中函式h key 稱為雜湊函式 此函式值稱為雜湊位址。然而,在實際應用中,會出現這樣的情況 k1 k2,但h k1 h k2 稱這種現象為衝突現象,k1,k2為同義詞。針對衝突 如何解決衝突呢?構造好的...
雜湊表的查詢
雜湊函式 把關鍵字為ki的物件存放在相對應的雜湊位址中 雜湊表 長度為m m n 的連續記憶體單元 雜湊衝突 對於兩個關鍵字分別為ki和kj i j 的記錄,有ki kj 但h ki h kj 我們把這種現象稱為雜湊衝突.雜湊衝突是很難避免的 正因為雜湊衝突,所以雜湊表的實際主要就是解決雜湊衝突.但...