2.6 數(shù)據(jù)結(jié)構(gòu) --1.5 哈希表

數(shù)據(jù)結(jié)構(gòu)子目錄http://www.reibang.com/p/a344fa483655

哈希表

在了解哈希表之前,我們要先認(rèn)識一下直接尋址表狠毯。

什么是直接尋址表

直接尋址表

我們確定key值就在某個范圍之內(nèi)嚼松,那么直接尋址就是一個很有效的辦法献酗。
這個圖確定了key值只能在0--9之內(nèi)罕偎,就可以建立一個0--9的列表,用來存儲相應(yīng)的key與value的指針京闰。

直接尋址表的缺點(diǎn)

當(dāng)U很大時颜及,會消耗很大的內(nèi)存终议,不實(shí)際凸主。
當(dāng)U很大,key很小時,很大的空間將會被浪費(fèi)损敷。
無法處理key不是數(shù)字的情況。

改進(jìn)直接尋址表

將直接尋址表的key通過函數(shù)h()處理后放在h(key)的位置上沟沙,他將域映射在了表T上面嗡呼。
這種處理就是哈希處理,哈希處理后的表反浓,就是哈希表萌丈。

什么是哈希表

哈希表是一個通過哈希函數(shù)計(jì)算數(shù)據(jù)存儲位置的數(shù)據(jù)結(jié)構(gòu)。
哈希表雷则,又稱散列表辆雾,是一種線性數(shù)據(jù)結(jié)構(gòu)月劈,哈希表是由一個直接尋址表和一個哈希函數(shù)組成的惭墓,哈希函數(shù)h(k)將key作為自變量,返回元素的存儲下標(biāo)钧萍。

簡單的例子

除法哈希:h(k)=k mod m
乘法哈希:h(k)=floor(m(kA mod 1))

假設(shè)有一個長度為7的列表,哈希函數(shù)是h(k)=k mod 7弛秋,那么列表[5,3,22,14]的存儲方式是:
[14,22,3,,5,,_]

然后現(xiàn)在思考一個問題,我們再把7存進(jìn)去, 7 mod 7 該把他放在0這個位置意敛,但是0這個位置已經(jīng)有元素了钓猬。這就是哈希沖突综膀。

哈希沖突

為了解決哈希沖突橄登,引入了一個方法:開放尋址法。
如果哈希函數(shù)返回到位置已經(jīng)有值了面褐,則可以向后探查新的位置來存儲這個值。
線性探查:如果i被占用觉痛,則探查i+1,i+2...
二度探查:如果i被占用俐芯,則探查i+12唠雕,i-12,i+22,i-22...
二度哈希:有n個哈希函數(shù),當(dāng)h1哈希后有沖突邓夕,則嘗試h2净薛,h3.

但是開放尋址之后痴腌,那么哈希表的作用就被無限弱化了,如果我要存的元素經(jīng)過哈希后都在一個位置上呢?

這就有了第二個方法:拉鏈法。
哈希表的每一個位置都連接著一個鏈表慈缔,當(dāng)沖突發(fā)生時娱节,沖突的元素將被放到鏈表的最后。


拉鏈法

代碼

class HashMap(object):
    def __init__(self):
        # 初始化總表為,容量為2的表格(含兩個子表)
        self.maps = BetterMap(2)
        self.num = 0        # 表中數(shù)據(jù)個數(shù)
      
    def get(self,k):        
        return self.maps.get(k)
      
    def add(self, k, v):
        # 若當(dāng)前元素?cái)?shù)量達(dá)到臨界值(子表總數(shù))時,進(jìn)行重排操作
        # 對總表進(jìn)行擴(kuò)張纠炮,增加子表的個數(shù)為當(dāng)前元素個數(shù)的兩倍穷躁!
        if self.num == len(self.maps.maps): 
            self.resize()
         
        # 往重排過后的 self.map 添加新的元素
        self.maps.add(k, v)
        self.num += 1
         
    def resize(self):
        #重排操作梳虽,添加新表, 注意重排需要線性的時間
        # 先建立一個新的表,子表數(shù) = 2 * 元素個數(shù)
        new_maps = BetterMap(self.num * 2)
         
        for m in self.maps.maps:  # 檢索每個舊的子表
            for k,v in m.items:   # 將子表的元素復(fù)制到新子表
                new_maps.add(k, v)
         
        self.maps = new_maps      # 令當(dāng)前的表為新表
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竖螃,一起剝皮案震驚了整個濱河市录粱,隨后出現(xiàn)的幾起案子旗闽,更是在濱河造成了極大的恐慌捣辆,老刑警劉巖忍些,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異开仰,居然都是意外死亡谓娃,警方通過查閱死者的電腦和手機(jī)锌订,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聋亡,你說我怎么就攤上這事投蝉∮褂椋” “怎么了斤儿?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長嗦篱,這世上最難降的妖魔是什么荒叼? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任亦渗,我火速辦了婚禮搂蜓,結(jié)果婚禮上殉挽,老公的妹妹穿的比我還像新娘投慈。我一直安慰自己带族,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般辜王。 火紅的嫁衣襯著肌膚如雪续膳。 梳的紋絲不亂的頭發(fā)上炮车,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼柳爽。 笑死腋粥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洽腺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼局义,長吁一口氣:“原來是場噩夢啊……” “哼轿塔!你這毒婦竟也來了俩由?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搅裙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宫盔,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寄悯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洒擦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秘遏。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出聊疲,到底是詐尸還是另有隱情阱表,我是刑警寧澤糠悯,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布判帮,位于F島的核電站局嘁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晦墙。R本人自食惡果不足惜悦昵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晌畅。 院中可真熱鬧但指,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剩岳,卻和暖如春贞滨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拍棕。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工晓铆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绰播。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓骄噪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蠢箩。 傳聞我的和親對象是個殘疾皇子腰池,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容