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

2021-09-11 07:18:34 字數 1913 閱讀 6355

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

jdk1.8後,當鍊表長度大於8,後面的資料存入紅黑樹

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

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,得到的就是等概率的。

delete:

刪掉後存在洞,這些洞影響效能,無法保證o( 1 )。 做法:拿最好乙個值和洞進行交換,size – 。

有失誤率,寧可錯殺三千不可放過乙個。

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

當需要檢驗乙個url在不在黑名單上時,分別對k個雜湊函式進行計算,得到的每個位置假設全部位1,那麼就認為它在黑名單上,否則,認為不在。

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

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

**:需求: 有多台後端伺服器,希望進行負載均衡。舉個例子:現在有3臺伺服器,那麼讀取的請求會均衡的負載在三颱伺服器上。

錯誤做法:一種做法是對請求進行雜湊計算,計算結果對伺服器數量去模,例如3臺伺服器,取模結果為0,1,2。這種做法存在致命的缺點,當伺服器數量進行變化,模的底數變了,那麼雜湊計算出來的值就傳送了改變。那麼在實際中的體現是這樣的:使用者a的讀取個人資料請求一直交給01伺服器處理,現在請求被提交到了02伺服器,那麼就讀取到錯誤的資訊。

矯正資料:收集原來的請求雜湊值對應的伺服器,轉存到新的雜湊值計算的伺服器上。代價是非常大的。

一致性雜湊解決:對每台伺服器的ip位址(唯一標識)進行雜湊演算法,得到乙個值。 根據這個值可以在環上進行劃分區域,這樣每台伺服器掌管一段區間。 當請求發過來時,把請求通過雜湊函式進行計算,得到環上的乙個位置, 然後通過二分演算法找到離他最近的乙個伺服器的位置(超過容器大小,就從0開始),這個請求就交給了某台伺服器。

矯正資料:新增或減少伺服器時,矯正的代價只有乙個結點的資料搬運到另乙個結點的資料而已。

不過伺服器ip在環上的對映並不均衡。很容易對映成這種情況。

那麼解決方案就是:通過虛擬節點進行雜湊計算,使它們均勻的分布在環上。 請求和虛擬節點進行匹配。 虛擬節點和物理伺服器之間是多對一的關係。虛擬節點再發請求傳送到自己對應的伺服器上即可。

左神演算法講堂筆記 05 樹

非遞迴遍歷有點難,目前只能讀懂 裡面的精髓還未真正參透。先序遍歷 不斷地把根入棧,再取出來輸出 根左右,那麼先入棧的肯定是根,要保證輸出左子樹,再輸出右子樹,那麼就要先入棧右子樹。void preorderunrecur node head if node.left null 中序遍歷 必須左子樹走...

左神演算法筆記01

對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...

左神演算法筆記03

可以是函式遞迴,也可以是迴圈實現。將大的陣列對半分為兩個陣列,每個陣列排好序後再合併為大的陣列。如果使用迴圈實現,要提防整形溢位 應用 最小和問題,若陣列的左邊的乙個數比右邊的某乙個數小,在返回結果加上自身的大小 public static intprocess int arr,int l,int ...