散列表中

如何設(shè)計(jì)散列函數(shù)

  • 散列函數(shù)的設(shè)計(jì)不能太復(fù)雜
  • 散列函數(shù)生成的值要盡可能隨機(jī)并且均勻分布

裝載因子過大了怎么辦?

  • 對于沒有頻繁插入和刪除的靜態(tài)數(shù)據(jù)集合來說皂冰,我們很容易根據(jù)數(shù)據(jù)的特點(diǎn)鹊奖、分布等苛聘,設(shè)計(jì)出完美的、極少沖突的散列函數(shù)忠聚,因?yàn)楫吘怪皵?shù)據(jù)都是已知的焰盗。
  • 對于動態(tài)散列表來說,數(shù)據(jù)集合是頻繁變動的咒林,我們事先無法預(yù)估將要加入的數(shù)據(jù)個數(shù),所以我們也無法事先申請一個足夠大的散列表爷光。隨著數(shù)據(jù)慢慢加入垫竞,裝載因子就會慢慢變大。當(dāng)裝載因子大到一定程度之后蛀序,散列沖突就會變得不可接受欢瞪。這個時候,我們需要“動態(tài)擴(kuò)容”徐裸。

裝載因子閾值的設(shè)置要權(quán)衡時間遣鼓、空間復(fù)雜度。如果內(nèi)存空間不緊張重贺,對執(zhí)行效率要求很高骑祟,可以降低負(fù)載因子的閾值;相反气笙,如果內(nèi)存空間緊張次企,對執(zhí)行效率要求又不高,可以增加負(fù)載因子的值潜圃,甚至可以大于 1缸棵。

如何避免低效地擴(kuò)容?

大部分情況下谭期,動態(tài)擴(kuò)容的散列表插入一個數(shù)據(jù)都很快堵第,但是在特殊情況下,當(dāng)裝載因子已經(jīng)到達(dá)閾值隧出,需要先進(jìn)行擴(kuò)容踏志,再插入數(shù)據(jù)。這個時候胀瞪,插入數(shù)據(jù)就會變得很慢狰贯,甚至?xí)o法接受。

  • 為了解決一次性擴(kuò)容耗時過多的情況,我們可以將擴(kuò)容操作穿插在插入操作的過程中涵紊,分批完成傍妒。當(dāng)裝載因子觸達(dá)閾值之后,我們只申請新空間摸柄,但并不將老的數(shù)據(jù)搬移到新散列表中颤练。
  • 當(dāng)有新數(shù)據(jù)要插入時,我們將新數(shù)據(jù)插入新散列表中驱负,并且從老的散列表中拿出一個數(shù)據(jù)放入到新散列表嗦玖。每次插入一個數(shù)據(jù)到散列表,我們都重復(fù)上面的過程跃脊。經(jīng)過多次插入操作之后宇挫,老的散列表中的數(shù)據(jù)就一點(diǎn)一點(diǎn)全部搬移到新散列表中了。這樣沒有了集中的一次性數(shù)據(jù)搬移酪术,插入操作就都變得很快了器瘪。

如何選擇沖突解決方法?

1. 開放尋址法

當(dāng)數(shù)據(jù)量比較小绘雁、裝載因子小的時候橡疼,適合采用開放尋址法。這也是Java 中的ThreadLocalMap使用開放尋址法解決散列沖突的原因庐舟。

2. 鏈表法

基于鏈表的散列沖突處理方法比較適合存儲大對象欣除、大數(shù)據(jù)量的散列表,而且挪略,比起開放尋址法历帚,它更加靈活,支持更多的優(yōu)化策略杠娱,比如用紅黑樹代替鏈表抹缕。

工業(yè)級的散列表應(yīng)該具有哪些特性?

  • 支持快速的查詢墨辛、插入卓研、刪除操作;
  • 內(nèi)存占用合理睹簇,不能浪費(fèi)過多的內(nèi)存空間奏赘;
  • 性能穩(wěn)定,極端情況下太惠,散列表的性能也不會退化到無法接受的情況磨淌。

如何實(shí)現(xiàn)這樣一個散列表呢?

  • 設(shè)計(jì)一個合適的散列函數(shù)凿渊;
  • 定義裝載因子閾值梁只,并且設(shè)計(jì)動態(tài)擴(kuò)容策略缚柳;
  • 選擇合適的散列沖突解決方法。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搪锣,一起剝皮案震驚了整個濱河市秋忙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌构舟,老刑警劉巖灰追,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狗超,居然都是意外死亡弹澎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門努咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苦蒿,“玉大人,你說我怎么就攤上這事渗稍∨宄伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵免胃,是天一觀的道長。 經(jīng)常有香客問我惫撰,道長羔沙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任厨钻,我火速辦了婚禮扼雏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夯膀。我一直安慰自己诗充,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布诱建。 她就那樣靜靜地躺著蝴蜓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俺猿。 梳的紋絲不亂的頭發(fā)上茎匠,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音押袍,去河邊找鬼诵冒。 笑死,一個胖子當(dāng)著我的面吹牛谊惭,可吹牛的內(nèi)容都是我干的汽馋。 我是一名探鬼主播侮东,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豹芯!你這毒婦竟也來了悄雅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤告组,失蹤者是張志新(化名)和其女友劉穎煤伟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體木缝,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡便锨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了我碟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片放案。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖矫俺,靈堂內(nèi)的尸體忽然破棺而出吱殉,到底是詐尸還是另有隱情,我是刑警寧澤厘托,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布友雳,位于F島的核電站,受9級特大地震影響铅匹,放射性物質(zhì)發(fā)生泄漏押赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一包斑、第九天 我趴在偏房一處隱蔽的房頂上張望流礁。 院中可真熱鬧,春花似錦罗丰、人聲如沸神帅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽找御。三九已至,卻和暖如春绍填,著一層夾襖步出監(jiān)牢的瞬間萎坷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工沐兰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哆档,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓住闯,卻偏偏與公主長得像瓜浸,于是被迫代替她去往敵國和親澳淑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353