首頁 > 學院 > 邏輯算法 > 正文

算法系列15天速成 第五天 五大經典查找【中】

2020-10-08 16:14:38
字體:
來源:轉載
供稿:網友
哈希查找:

    對的,他就是哈希查找,說到哈希,大家肯定要提到哈希函數,呵呵,這東西已經在我們腦子里面形成
固有思維了。大家一定要知道“哈?!爸械膶P系。
     比如說: ”5“是一個要保存的數,然后我丟給哈希函數,哈希函數給我返回一個”2",那么此時的”5“
和“2”就建立一種對應關系,這種關系就是所謂的“哈希關系”,在實際應用中也就形成了”2“是key,”5“是value。
    那么有的朋友就會問如何做哈希,首先做哈希必須要遵守兩點原則:
          ①:  key盡可能的分散,也就是我丟一個“6”和“5”給你,你都返回一個“2”,那么這樣的哈希函數不盡完美。
          ②: 哈希函數盡可能的簡單,也就是說丟一個“6”給你,你哈希函數要搞1小時才能給我,這樣也是不好的。

其實常用的做哈希的手法有“五種”:
第一種:”直接定址法“。
                  很容易理解,key=Value+C; 這個“C"是常量。Value+C其實就是一個簡單的哈希函數。
第二種:“除法取余法”。
                  很容易理解, key=value%C;解釋同上。
第三種:“數字分析法”。
                  這種蠻有意思,比如有一組value1=112233,value2=112633,value3=119033,
                  針對這樣的數我們分析數中間兩個數比較波動,其他數不變。那么我們取key的值就可以是
                  key1=22,key2=26,key3=90。
第四種:“平方取中法”。此處忽略,見名識意。
第五種:“折疊法”。
                 這種蠻有意思,比如value=135790,要求key是2位數的散列值。那么我們將value變為13+57+90=160,
                 然后去掉高位“1”,此時key=60,哈哈,這就是他們的哈希關系,這樣做的目的就是key與每一位value都相
                 關,來做到“散列地址”盡可能分散的目地。

正所謂常在河邊走,哪有不濕鞋。哈希也一樣,你哈希函數設計的再好,搞不好哪一次就撞樓了,那么拋給我們的問題
就是如果來解決“散列地址“的沖突。

其實解決沖突常用的手法也就2種:

第一種: “開放地址法“。
                 所謂”開放地址“,其實就是數組中未使用的地址。也就是說,在發生沖突的地方,后到的那個元素(可采用兩種方式
                 :①線性探測,②函數探測)向數組后尋找"開放地址“然后把自己插進入。

第二種:”鏈接法“。
                這個大家暫時不懂也沒關系,我就先介紹一下原理,就是在每個元素上放一個”指針域“,在發生沖突的地方,后到的那
               個元素將自己的數據域拋給沖突中的元素,此時沖突的地方就形成了一個鏈表。

上面金玫玫床戏