LeetCode | 你不得不瞭解的哈希算法 !

哈希是什麼 ?

問大家一個問題 。如果手機上存儲了 1000 個聯繫人 ,現在要你給小詹打個電話 ,跟他說 ,他老婆喊他回家吃飯 。你會怎麼做 ?

當然是按姓名搜索呀 !(假裝你有小詹電話號碼~)言歸正傳 ,那你能想到這和哈希表有異曲同工之妙嘛 ?

哈希表簡單說可以理解成一個映射關係 ,類似 python 語法中字典的鍵值對 。根據鍵(Key)而直接訪問在內存存儲位置的數據結構。

將任意長度的二進制值串映射爲固定長度的二進制值串 ,這個映射的規則就是哈希算法 。原始數據映射得到的二進制值串就是哈希值

回到通訊錄的例子 ,是不是可以類比 ? 電話號碼是原始數據 ,根據哈希算法(這就是你自定義的規則)存儲爲通訊錄備註 。嚴格來講二者是有區別的 ,只是爲了便於理解 ,若舉例不當 ,槓精讀者輕噴 。

一個優秀的哈希算法主要有以下幾點特徵 :

 ●  單方向推導 ,不能從哈希值反向推導出原始數據 ,或者說很困難 。
 ●  對輸入敏感 ,原始數據的微小變化會導致哈希值的大差異 。
 ●  散列衝突小 ,不同原始數據得到相同哈希值的概率小 。其實最好是避免 ,但是諸如 MD5 這種也難以徹底避免 ,所以只說儘可能小 。
 ●  執行效率高 ,即使是較長的文本 ,也能快速計算出哈希值 。

哈希算法有何用 ?

一般而言 ,算法或產品的使用往往取決於特徵 。所以根據上文的特徵不難想到一些應用如下 。

 ●  安全加密

因爲優秀的哈希算法具有單方向推導散列衝突小兩個特徵 ,這就決定了用來進行安全加密具有很好的應用 。

相信你一定聽過 MD5(MD5 Message-Digest Algorithm ) 和 SHA(Secure Hash Algorithm)吧 ,這就是兩個常用於安全加密的哈希算法 。

 ●  數據結構

其實還有很多應用與安全加密類似 ,比如數據校驗之類的 ,都是利用單向性和衝突小特性 ,就不贅述了 。

其實哈希算法在數據結構中用於查找是一個非常不錯的方法 ,可以快速定位查找到想要查找的數據信息 。這一用法在刷 LeetCode 題的時候遇到的非常多 !

哈希算法刷題

 ●  K數之和

Leetcode第一題就是兩數之和 ,後邊又有三數之和 、四數之和 ,其實 K 數之和原理類似 。

以兩數之和爲例 ,除了簡單暴力的遍歷方法 ,哈希算法能夠極大的提高解題效率 !具體參照第一題推文的第二種解法 :

LeetCode | No.001 兩數之和

LeetCode | No.015 三數之和

 ●  模式匹配

模式匹配問題比較經典 。最簡單的舉例 :數字串「 1 2 1 2 」應該對應英文「 one two one two 」。

現在如果給定一個模式(數字串)和一個輸入(英文),要你寫代碼實現判斷是否模式匹配 ,你該怎麼做呢 ?這一題來個有獎互動 !

其實這就可以考慮使用哈希算法實現了 ,python 中的字典有個鍵值對 ,其實有些類似 ,這裏小詹給出思路 ,不分享代碼 。按照思路用 python 寫出可行代碼的同學歡迎在留言區回覆 ,將在前 3 個親測有效的代碼中選取一個最優的送上實體書一本(下次送書活動預留一個名額)歡迎動腦 ,中獎概率三分之一

思路如下 :

 ●  首先對輸入的英文串分割 ,可以用 input.split(' ') 方法 。
 ●  建立哈希表存儲數據 ,這裏友情提醒下可以建立多個喲 。
 ●  從給定模式逐一循環判斷 。單次判斷邏輯如下列出 。
 ●  首先判斷當前位置的模式(pattern)是否初次出現 ,如果不是第一次出現 ,則說明有一個哈希值與之相對應 ,判斷 input 對應位置是否與該哈希值一致 ,如果不一致則直接返回 false ,肯定不匹配 。
 ●  如果當前模式是第一次出現 ,先不急着直接加入哈希表 ,還需要判斷對應位置的 input 英文單詞是否是其他模式的哈希值 ,如果是說明之前已經和別的模式匹配了 ,不能反覆匹配 ,返回 false 。
 ●  如果當前位置的模式是第一次出現且對應的 input 也沒有和別的模式匹配過 ,則二者作爲一個鍵值對存入哈希表 。
 ●  如果直到循環結束沒有返回 false 說明完全匹配 ,返回 true 。

原文發佈時間爲:2018-11-29
本文來自雲棲社區合作伙伴“小詹學Python”,瞭解相關信息可以關注“小詹學Python”。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章