左神演算法課總結(hash函式及應用)

2021-09-11 09:26:08 字數 1349 閱讀 8115

hash(雜湊),又稱「雜湊」。

雜湊(hash)英文原意是「混雜」、「拼湊」、「重新表述」的意思。

在某種程度上,雜湊是與排序相反的一種操作,排序是將集合中的元素按照某種方式比如字典順序排列在一起,而雜湊通過計算雜湊值,打破元素之間原有的關係,使集合中的元素按照雜湊函式的分類進行排列。

在介紹一些集合時,我們總強調需要重寫某個類的 equlas() 方法和 hashcode() 方法,確保唯一性。這裡的 hashcode() 表示的是對當前物件的唯一標示。計算 hashcode 的過程就稱作 雜湊。

hash函式性質:

輸入為任意長字串,輸出為固定長字串。

輸入確定,輸出隨之確定。特定輸入對應唯一輸出。(有可能兩個輸入對應乙個輸出 ——hash碰撞)

隨著輸入域增大,輸出域均勻增大,(這種均勻性越好,hash函式越好)

參考:【題目】 設計一種結構,在該結構中有如下三個功能:

insert(key):將某個key加入到該結構,做到不重複加入。

delete(key):將原本在結構中的某個key移除。 getrandom():

等概率隨機返回結構中的任何乙個key。

【要求】 insert、delete和getrandom方法的時間複雜度都是o(1)

做法:insert和getrandom:

構造mapmap1 ,mapmap2 。當第乙個插入o1,就在map1.add(o1,1),map2.add(1,o1)。 當希望進行get時,通過數字進行random,得到的就是等概率的。(保證0 - inreger 是連續的就可以保證等概率)

delete:

刪掉後存在空缺,這些洞影響了 0 - inreger 是連續的。 做法:拿最後一條記錄和空缺進行交換,size – 。

參考:例:建立100億大小的黑名單

做法:設定k個雜湊函式,對於每個黑名單上的url,分別對k個雜湊函式進行計算,得到的hashcode % m (m就是布隆過濾器的大小),對這個位置置1,這樣乙個url會對k個位置進行置1。

後面對全部 url 重複上述操作,使之加入布隆過濾器

當需要檢驗乙個url在不在黑名單上時,分別對k個雜湊函式進行計算,得到的每個位置假設全部為1,那麼就認為它在黑名單上,否則若存在某個雜湊函式結果不為1,認為不在。(有誤殺率p,寧可錯殺三千不可放過乙個)

布隆過濾器只與資料量大小有關,與每個資料項大小無關

知道資料量大小n,和誤殺率p 就能確定乙個布隆過濾器

有關公式:

m = n * lnp / (ln2)^2; m是布隆過濾器的大小(開的bit陣列),p是預期失誤率

k = ln2 * m/n ; 雜湊函式的個數。

真實誤殺率為 (1 - e ^ (- nk / m ) ) ^ k

左神演算法講堂筆記 06 Hash演算法

當通過put方法存入物件時,會呼叫key物件的hashcode 方法計算出hashcode,通過hashcode找到bucket位置儲存entry物件。獲取物件時,通過key計算出hashcode,找到bucket位置,hashmap採用鍊錶解決碰撞,因此遇到衝突時,就訪問bucket位置上鍊表的每...

牛課堂左神演算法題總結

給定乙個無序整型陣列arr,找到陣列中未出現的最小正整數。舉例 arr 1,2,3,4 返回 1 arr 1,2,3,4,返回 5 需求 時間複雜度為o n 額外空間複雜度為o 1 public static intmissnum int arr else if arr l l arr l r ar...

演算法函式 左神演算法基礎 雜湊函式和雜湊表

筆者在讀研剛開始的時候,偶爾看面經,有這樣乙個問題 只用2gb內存在20億個整數中找到出現次數最多的數,當時的我一臉懵逼,怎麼去思考,20億個數?what the 但是,看完今天的文章,你或許就會覺得原來也不過如此啊!其核心就是雜湊函式和雜湊表的應用!雜湊函式又稱為雜湊函式,就是把任意長度的輸入 又...