W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
key
? ,哈希表能夠在 O(1) 時(shí)間內(nèi)查詢到 ?value
? ,效率非常高。key
? 映射為數(shù)組索引,從而訪問(wèn)對(duì)應(yīng)桶并獲取 ?value
? 。key
? 可能在經(jīng)過(guò)哈希函數(shù)后得到相同的數(shù)組索引,導(dǎo)致查詢結(jié)果出錯(cuò),這種現(xiàn)象被稱為哈希沖突。HashMap
? 使用鏈?zhǔn)降刂罚?Python 的 ?Dict
? 采用開(kāi)放尋址。哈希表的時(shí)間復(fù)雜度為什么不是 O(n) ?
當(dāng)哈希沖突比較嚴(yán)重時(shí),哈希表的時(shí)間復(fù)雜度會(huì)退化至 O(n) 。當(dāng)哈希函數(shù)設(shè)計(jì)的比較好、容量設(shè)置比較合理、沖突比較平均時(shí),時(shí)間復(fù)雜度是 O(1) 。我們使用編程語(yǔ)言內(nèi)置的哈希表時(shí),通常認(rèn)為時(shí)間復(fù)雜度是 O(1) 。
為什么不使用哈希函數(shù) f(x)=x 呢?這樣就不會(huì)有沖突了
在 f(x)=x 哈希函數(shù)下,每個(gè)元素對(duì)應(yīng)唯一的桶索引,這與數(shù)組等價(jià)。然而,輸入空間通常遠(yuǎn)大于輸出空間(數(shù)組長(zhǎng)度),因此哈希函數(shù)的最后一步往往是對(duì)數(shù)組長(zhǎng)度取模。換句話說(shuō),哈希表的目標(biāo)是將一個(gè)較大的狀態(tài)空間映射到一個(gè)較小的空間,并提供 O(1) 的查詢效率。
哈希表底層實(shí)現(xiàn)是數(shù)組、鏈表、二叉樹(shù),但為什么效率可以比他們更高呢?
首先,哈希表的時(shí)間效率變高,但空間效率變低了。哈希表有相當(dāng)一部分的內(nèi)存是未使用的,
其次,只是在特定使用場(chǎng)景下時(shí)間效率變高了。如果一個(gè)功能能夠在相同的時(shí)間復(fù)雜度下使用數(shù)組或鏈表實(shí)現(xiàn),那么通常比哈希表更快。這是因?yàn)楣:瘮?shù)計(jì)算需要開(kāi)銷(xiāo),時(shí)間復(fù)雜度的常數(shù)項(xiàng)更大。
最后,哈希表的時(shí)間復(fù)雜度可能發(fā)生劣化。例如在鏈?zhǔn)降刂分?,我們采取在鏈表或紅黑樹(shù)中執(zhí)行查找操作,仍然有退化至 O(n) 時(shí)間的風(fēng)險(xiǎn)。
多次哈希有不能直接刪除元素的缺陷嗎?對(duì)于標(biāo)記已刪除的空間,這個(gè)空間還能再次使用嗎?
多次哈希是開(kāi)放尋址的一種,開(kāi)放尋址法都有不能直接刪除元素的缺陷,需要通過(guò)標(biāo)記刪除。被標(biāo)記為已刪除的空間是可以再次被使用的。當(dāng)將新元素插入哈希表,并且通過(guò)哈希函數(shù)找到了被標(biāo)記為已刪除的位置時(shí),該位置可以被新的元素使用。這樣做既能保持哈希表的探測(cè)序列不變,又能保證哈希表的空間使用率。
為什么在線性探測(cè)中,查找元素的時(shí)候會(huì)出現(xiàn)哈希沖突呢?
查找的時(shí)候通過(guò)哈希函數(shù)找到對(duì)應(yīng)的桶和鍵值對(duì),發(fā)現(xiàn) ?key
? 不匹配,這就代表有哈希沖突。因此,線性探測(cè)法會(huì)根據(jù)預(yù)先設(shè)定的步長(zhǎng)依次向下查找,直至找到正確的鍵值對(duì)或無(wú)法找到跳出為止。
為什么哈希表擴(kuò)容能夠緩解哈希沖突?
哈希函數(shù)的最后一步往往是對(duì)數(shù)組長(zhǎng)度 n 取余,讓輸出值落入在數(shù)組索引范圍;在擴(kuò)容后,數(shù)組長(zhǎng)度 n 發(fā)生變化,而 ?key
? 對(duì)應(yīng)的索引也可能發(fā)生變化。原先落在同一個(gè)桶的多個(gè) ?key
? ,在擴(kuò)容后可能會(huì)被分配到多個(gè)桶中,從而實(shí)現(xiàn)哈希沖突的緩解。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: