由乙個演算法引發的hash講解

2022-08-20 21:03:12 字數 1154 閱讀 1504

請聽題:給n(1最直接反應的解決方法

法一:遍歷

法二:排序+二分

不符合本文標題,也不夠高階...

更高階的做法:開闢乙個陣列,最大下標為n個數中最大的數,將n個數作為陣列的下標,陣列所有值預設0,若該數存在,則將該數下標對應得值改成1,判斷乙個k在不在n個樹中,直接判斷a[k]是否為1即可

舉個栗子:

給定一組數  2,0,17,31,5,判斷10是否在其中。

1、建立陣列a[30]

2、將a[0]~a[29]的值都預設成0

3、將a[2]、a[0]、a[17]、a[31]、a[5]改成1

4、判斷a[10]是否等於1,若是則在其中,否則不在

這就是最基礎的hash演算法

但是。。。。

有個問題:當最大資料過大時,非常浪費空間。如果題目再加個條件,只給10個空間,怎麼辦???

取模:10個數,最多就是10個空間。其實就是hash函式(就是hash函式,不太懂,)

繼續以上述栗子為例

2%10=2 => a[2] = 2

0%10=0 => a[0] = 0

17%10=7 => a[7] = 17

31%10=1 => a[1] = 31

5%10=5 => a[5] = 5

但是。。。。

又有個問題:當有兩個或以上的數取模後值一樣怎麼辦??這就叫hash碰撞,也就是hash衝突

使用hash演算法時,有很多辦法解決hash衝突

法一:使用鍊錶,jdk1.7的hashmap就是用的該演算法

舉個栗子:10,2,32,44,77

a[2]=2,32

缺點:當所有數取模後的值都一樣的時候,就變成了乙個單鏈表,查詢很麻煩

注:hash的效率取決於衝突的數量,衝突越多,效率就越低,所以乙個好的hash函式可以解決hash的效率

法二:使用鍊錶+紅黑樹,當鍊表節點大於8時,用紅黑樹,經過測試後總結。jdk1.8 hashmap用的該演算法

乙個由copyBean引發的血案

一次開發中使用輪子bean互轉突然發生了問題 new setdlevel 1 dto dto new dto dto beancopyutils.copybean dto.class system.out.println dto.getdlevel 列印出輸出結果 輸出結果卻變成null,怎麼肥事呢...

乙個由鬥地主引發的血案

王炸 看到這個小故事我也試著拿筆去算了算,唉,尼瑪,去試一下自己的智商下限 然後得出如下思路 地主20,農民17,一共54張牌.那我直接用 20 54 地主拿一張王牌的概率 19 53 地主在有一張王后再拿到王的概率 然後兩個概率相乘 20 54 19 53不就得出了王炸的概率嘛?13.3 在確定王...

由乙個typedef問題引發的思考

同樣,可以像下面這樣隱藏指標語法 typedef char pstr intmystrcmp const pstr p1,const pstr p3 用gnu的gcc和g 編譯器,是會出現警告的,按照順序,const pstr 被解釋為 char const 乙個指向char的指標常量 而事實上,c...