演算法學習 雜湊表應用

2021-06-04 18:07:37 字數 1836 閱讀 5006

hash演算法就是一種壓縮對映,壓縮到有鍊表頭函式組成的固定長度陣列中。上實際例子:

例1:100萬條簡訊,有重複,以文字形式儲存,一行一條。找出重複最少的前十條。

解法:雜湊表+推排序。

步驟一:統計重複次數,

建立資料節點:

struct hashnode

node;

hash函式:

int hashfuc(char const *p)

return value%10;//對映的關鍵語句

}圖表說明:

左邊很明顯是個陣列,陣列的每個成員包括乙個指標,指向乙個鍊錶的頭,當然這個鍊錶可能為空,也可能元素很多。我們根據元素的一些特徵把元素分配到不同的鍊錶中去,也是根據這些特徵,找到正確的鍊錶,再從鍊錶中找出這個元素。

注:常用hash函式構造法:

1,除法雜湊法

最直觀的一種,上圖使用的就是這種雜湊法,公式:

index = value % 16

學過彙編的都知道,求模數其實是通過乙個除法運算得到的,所以叫「除法雜湊法」。

2,平方雜湊法

求index是非常頻繁的操作,而乘法的運算要比除法來得省時(對現在的cpu來說,估計我們感覺不出來),所以我們考慮把除法換成乘法和乙個位移操作。公式:

index = (value * value) >> 28右移,除以2^28。記法:左移變大,是乘。右移變小,是除。

如果數值分配比較均勻的話這種方法能得到不錯的結果,但我上面畫的那個圖的各個元素的值算出來的index都是0——非常失敗。也許你還有個問題,value如果很大,value * value不會溢位嗎?答案是會的,但我們這個乘法不關心溢位,因為我們根本不是為了獲取相乘結果,而是為了獲取index。

時間複雜度:o(n)

步驟二:

演算法二:部分排序

題目要求是求出top 10,因此我們沒有必要對所有的簡訊都進行排序,我們只需要維護乙個10個大小的陣列,初始化放入10個簡訊,按照每個簡訊的統計次數由大到小排序,然後遍歷這100萬條記錄,每讀一條記錄就和陣列最後乙個簡訊count對比,如果小於這個count,那麼繼續遍歷,否則,將陣列中最後一條資料淘汰,加入當前的簡訊。最後當所有的資料都遍歷完畢之後,那麼這個陣列中的10個query便是我們要找的top10了。

不難分析出,這樣,演算法的最壞時間複雜度是n*k, 其中k是指top多少。

演算法三:堆

在演算法二中,我們已經將時間複雜度由nlogn優化到nk,不得不說這是乙個比較大的改進了,可是有沒有更好的辦法呢?

分析一下,在演算法二中,每次比較完成之後,需要的操作複雜度都是k,因為要把元素插入到乙個線性表之中,而且採用的是順序比較。這裡我們注意一下,該陣列是有序的,一次我們每次查詢的時候可以採用二分的方法查詢,這樣操作的複雜度就降到了logk,可是,隨之而來的問題就是資料移動,因為移動資料次數增多了。不過,這個演算法還是比演算法二有了改進。

基於以上的分析,我們想想,有沒有一種既能快速查詢,又能快速移動元素的資料結構呢?回答是肯定的,那就是堆。

借助堆結構,我們可以在log量級的時間內查詢和調整/移動。因此到這裡,我們的演算法可以改進為這樣,維護乙個k(該題目中是10)大小的小根堆,然後遍歷300萬的query,分別和根元素進行對比。

思想與上述演算法二一致,只是演算法在演算法三,我們採用了最小堆這種資料結構代替陣列,把查詢目標元素的時間複雜度有o(k)降到了o(logk)。

那麼這樣,採用堆資料結構,演算法三,最終的時間複雜度就降到了n『logk,和演算法二相比,又有了比較大的改進。

總結:參考:從頭到尾測底解決雜湊

演算法學習 雜湊表

雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。也就是說,它通過計算乙個關於鍵值的函式,將所需查詢的資料對映到表中乙個位置來訪問記錄,這加快了查詢速度。這個對映函式稱做雜湊函式,存放記錄的陣列稱做雜湊表。雜湊函式 hashfunction 若關鍵字為...

演算法學習 雜湊表及雜湊查詢

基於樹等的查詢方法,都是通過一系列對比來查詢的,查詢效率由比較一次所縮小的查詢範圍決定。而理想的查詢情況是直接根據關鍵碼得到其對應的資料元素位置。原理 將待儲存元素經過某一函式特定轉換為乙個值,將這個值作為位址,將這個待儲存元素存入這個位址中。當要查詢時,則將待查詢的元素經過同一轉換函式得到乙個轉換...

雜湊表與雜湊演算法學習筆記

雜湊表 於陣列具有下標隨機訪問特性,理解這點非常重要。可以說雜湊表是由陣列進化來的。將輸入的鍵通過雜湊函式對映得出的value作為index去table中查詢,這便是雜湊的思想。graph lr a 鍵值key 雜湊函式 b 結果value 我們了解到為什麼雜湊表的查詢複雜度是o 1 因為key v...