為什么HashMap的負載因子是0.75

網(wǎng)上亂七八糟的答案太多了,這里從直觀感受和數(shù)學方法上對這塊知識做了個整理安寺,數(shù)學方法基于stackoverflow上的答案弄慰,補充了些推導(dǎo)細節(jié)方便理解第美。(內(nèi)容比較精簡,后續(xù)有時間整理下放到個人博客下)

HashMap是用來快速查找內(nèi)容的一種數(shù)據(jù)結(jié)構(gòu)陆爽。使用n個桶存儲數(shù)據(jù)什往,數(shù)據(jù)具體存儲在哪個桶中是由Hash算法決定的,即對原始內(nèi)容執(zhí)行Hash后得出對應(yīng)桶的序號慌闭。

然后這種數(shù)據(jù)結(jié)構(gòu)會遇到一些問題别威,由于內(nèi)存空間有限,所以桶的數(shù)量也是有限制的驴剔。當桶的數(shù)量較小時就容易出現(xiàn)較多內(nèi)容放在同一個桶中的情況省古。HashMap中使用默認的0.75作為桶空間的閾值,如果超過這個大小就需要增加桶的數(shù)量丧失,以防止較多內(nèi)容聚集在相同的桶中豺妓。

關(guān)于為什么0.75就是經(jīng)常被拿來當做面試問題了。首先通過人腦直觀來考慮這個事情布讹,假設(shè)我現(xiàn)在有n個桶琳拭,那么數(shù)據(jù)放到多少我需要增加更多的桶呢。這個時候會出現(xiàn)直觀的數(shù)字0.5炒事,如果桶已經(jīng)裝滿一半了那么之后添加內(nèi)容分配到空桶的概率會低于分配到有內(nèi)容桶的概率臀栈,可想而知從這個點之后將會出現(xiàn)越來越多的內(nèi)容在相同的桶中。從這里來看這個0.5是個非常優(yōu)秀的數(shù)字它是一個趨勢的轉(zhuǎn)折點挠乳。

但是這個0.5和負載因子是不一樣的权薯,這個0.5我們是指已經(jīng)有一半的桶被占用了,而HashMap中的負載因子與我們存入的數(shù)據(jù)總數(shù)量相關(guān)睡扬,并且根據(jù)之前對這種數(shù)據(jù)結(jié)構(gòu)的了解盟蚣,數(shù)據(jù)會存在一定概率出現(xiàn)在一個桶中,所以當一半桶都被占用的時候我們實際存儲的數(shù)據(jù)數(shù)量是大于0.5n的卖怜。

這里假設(shè)對于新的內(nèi)容分配到各個桶的概率是相同的屎开,當前內(nèi)容數(shù)據(jù)大小為s。這里使用二項分布的概念马靠,當我們進行了s次插入操作(實驗)奄抽,那么序號0的桶是空桶的概率是多少呢。即:

P(0) = \tbinom{s}{0}(\frac{1}{n})^0(1-\frac{1}{n})^s

可以明顯看出來當s增加P(0)是空桶的概率也會下降甩鳄,這里用1/2來計算這個分界逞度。即:

\begin{array}{c} (1- \frac{1}{n})^s &\ge& \frac{1}{2} \\ (\frac{n}{n-1})^s & \le & 2 \\ s & \le & \frac{log(2)}{log(\frac{n}{n - 1})}\end{array}

然后算下負載因子f=(s/n)對n取極限:

f \le \lim_{n->\infty}{\frac{log(2)}{log((\frac{n}{n-1})^n)}}

為了解決這個問題可以先解決這個問題

\lim_{n->\infty}(1-\frac{1}{n})^n = \frac{1}{e}

我們得到的結(jié)果就是上面式子的倒數(shù)即e,把log換成ln即得出我們的負載因子界限值\ln2妙啃,這個值約等于0.6931档泽,所以0.75的取值范圍是與這個界限相近的并且由于基礎(chǔ)是16個容量空間俊戳,使用0.75也不會算出小數(shù)是一個不錯的值選取。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馆匿,一起剝皮案震驚了整個濱河市抑胎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渐北,老刑警劉巖阿逃,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腔稀,居然都是意外死亡盆昙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門焊虏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秕磷,你說我怎么就攤上這事诵闭。” “怎么了澎嚣?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵疏尿,是天一觀的道長。 經(jīng)常有香客問我易桃,道長褥琐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任晤郑,我火速辦了婚禮敌呈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘造寝。我一直安慰自己磕洪,他們只是感情好,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布诫龙。 她就那樣靜靜地躺著析显,像睡著了一般。 火紅的嫁衣襯著肌膚如雪签赃。 梳的紋絲不亂的頭發(fā)上谷异,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天,我揣著相機與錄音锦聊,去河邊找鬼歹嘹。 笑死,一個胖子當著我的面吹牛括丁,可吹牛的內(nèi)容都是我干的荞下。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尖昏!你這毒婦竟也來了仰税?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤抽诉,失蹤者是張志新(化名)和其女友劉穎陨簇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迹淌,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡河绽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唉窃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耙饰。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖纹份,靈堂內(nèi)的尸體忽然破棺而出苟跪,到底是詐尸還是另有隱情,我是刑警寧澤蔓涧,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布件已,位于F島的核電站,受9級特大地震影響元暴,放射性物質(zhì)發(fā)生泄漏篷扩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一茉盏、第九天 我趴在偏房一處隱蔽的房頂上張望鉴未。 院中可真熱鬧,春花似錦援岩、人聲如沸歼狼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羽峰。三九已至,卻和暖如春添瓷,著一層夾襖步出監(jiān)牢的瞬間梅屉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工鳞贷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坯汤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓搀愧,卻偏偏與公主長得像惰聂,于是被迫代替她去往敵國和親疆偿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349