哈希表沖突處理制度_第1頁
哈希表沖突處理制度_第2頁
哈希表沖突處理制度_第3頁
哈希表沖突處理制度_第4頁
哈希表沖突處理制度_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

哈希表沖突處理制度一、哈希表沖突處理概述

哈希表是一種高效的數(shù)據(jù)結(jié)構(gòu),通過哈希函數(shù)將鍵映射到表中的特定位置。然而,由于哈希函數(shù)的特性或大量鍵的分布不均,可能會出現(xiàn)多個不同鍵映射到同一位置的情況,這種現(xiàn)象稱為哈希沖突。哈希表沖突處理制度是指一系列策略和方法,用于有效管理和解決哈希沖突,確保哈希表的性能和穩(wěn)定性。

(一)哈希沖突的產(chǎn)生原因

1.哈希函數(shù)設(shè)計(jì)不合理:若哈希函數(shù)未能均勻分布鍵值,可能導(dǎo)致大量鍵值沖突。

2.哈希表容量有限:當(dāng)哈希表容量固定時,鍵值數(shù)量超過容量極限,沖突概率增加。

3.鍵值分布不均:某些鍵值在特定應(yīng)用場景中具有高度相似性,導(dǎo)致頻繁沖突。

二、哈希表沖突處理方法

(一)開放尋址法

開放尋址法通過在發(fā)生沖突時尋找下一個空閑位置來存儲鍵值。具體方法包括:

1.線性探測:

-原理:若位置k發(fā)生沖突,則依次檢查k+1,k+2,...,直到找到空閑位置。

-優(yōu)點(diǎn):實(shí)現(xiàn)簡單,空間利用率高。

-缺點(diǎn):易產(chǎn)生聚集現(xiàn)象,降低查找效率。

2.二次探測:

-原理:若位置k發(fā)生沖突,則依次檢查k+12,k+22,...,直到找到空閑位置。

-優(yōu)點(diǎn):減少聚集現(xiàn)象,提高查找效率。

-缺點(diǎn):可能存在不可達(dá)區(qū)域,影響表容量。

3.雙重哈希:

-原理:使用兩個哈希函數(shù),若第一個函數(shù)沖突,則使用第二個函數(shù)計(jì)算步長。

-優(yōu)點(diǎn):分布均勻,沖突概率低。

-缺點(diǎn):實(shí)現(xiàn)復(fù)雜,計(jì)算開銷大。

(二)鏈地址法

鏈地址法將所有沖突的鍵值存儲在同一個鏈表中,具體步驟如下:

1.初始化:為每個哈希桶分配一個空鏈表。

2.插入操作:

-計(jì)算鍵值的哈希值,確定存儲桶。

-若桶為空,直接插入;若不為空,插入鏈表末尾。

3.查找操作:

-計(jì)算鍵值的哈希值,定位鏈表。

-遍歷鏈表,查找匹配鍵值。

優(yōu)點(diǎn):實(shí)現(xiàn)簡單,沖突處理靈活,空間利用率高。

缺點(diǎn):鏈表操作可能影響效率,內(nèi)存開銷較大。

(三)再哈希法

再哈希法在發(fā)生沖突時,使用另一個哈希函數(shù)重新計(jì)算存儲位置,具體步驟如下:

1.設(shè)計(jì)多個哈希函數(shù):為每個鍵值設(shè)計(jì)多個備選哈希函數(shù)。

2.沖突處理:若第一個函數(shù)沖突,則使用第二個函數(shù),依此類推。

3.動態(tài)擴(kuò)展:當(dāng)沖突率過高時,重新設(shè)計(jì)哈希表并遷移所有鍵值。

優(yōu)點(diǎn):沖突概率低,查找效率高。

缺點(diǎn):設(shè)計(jì)復(fù)雜,計(jì)算開銷大,動態(tài)擴(kuò)展成本高。

三、哈希表沖突處理性能分析

(一)沖突率與查找效率

-沖突率:沖突次數(shù)與總插入次數(shù)的比值,直接影響查找效率。

-低沖突率(<5%)時,查找效率接近O(1)。

-高沖突率(>20%)時,查找效率降至O(n)。

(二)不同方法的適用場景

1.開放尋址法:

-適用于小規(guī)模數(shù)據(jù)集,對內(nèi)存連續(xù)性要求高。

-不適用于高沖突率場景,易產(chǎn)生聚集。

2.鏈地址法:

-適用于大規(guī)模數(shù)據(jù)集,對內(nèi)存分配靈活。

-適用于動態(tài)變化的數(shù)據(jù),支持高效插入和刪除。

3.再哈希法:

-適用于對查找效率要求極高的場景。

-適用于靜態(tài)數(shù)據(jù)集,避免動態(tài)擴(kuò)展開銷。

四、總結(jié)

哈希表沖突處理制度是確保哈希表性能的關(guān)鍵環(huán)節(jié)。通過選擇合適的沖突處理方法,可以有效降低沖突率,提升查找效率。在實(shí)際應(yīng)用中,應(yīng)根據(jù)數(shù)據(jù)規(guī)模、使用場景和性能需求,綜合評估并選擇最優(yōu)方案。

二、哈希表沖突處理方法(續(xù))

(一)開放尋址法(續(xù))

除了線性探測、二次探測和雙重哈希,開放尋址法還包括其他變種:

4.平方探測(QuadraticProbing):

-原理:結(jié)合線性探測和二次探測的思想,使用平方序列作為探測步長(12,-12,22,-22,...)。探測序列為:k,k+12,k-12,k+22,k-22,...

-優(yōu)點(diǎn):相比線性探測,能減少聚集現(xiàn)象,提高查找效率。

-缺點(diǎn):可能存在“空洞鏈”(HoleChain),即一些位置無法被訪問,影響表容量。

5.雙重哈希(DoubleHashing):

-原理:使用兩個獨(dú)立的哈希函數(shù)h1和h2,若h1(key)發(fā)生沖突,則使用步長h2(key)%M(M為哈希表大?。┻M(jìn)行探測。

-優(yōu)點(diǎn):探測序列分布更均勻,沖突概率更低。

-缺點(diǎn):計(jì)算兩個哈希函數(shù)的開銷較大,實(shí)現(xiàn)復(fù)雜度較高。

開放尋址法實(shí)施步驟:

1.初始化:

-創(chuàng)建一個大小為M的哈希表,初始化所有位置為空或標(biāo)記為“刪除”。

-選擇合適的哈希函數(shù)h(key)=key%M。

-選擇探測序列(如線性探測、二次探測等)。

2.插入操作:

-計(jì)算鍵值key的哈希值:index=h(key)。

-若index位置為空,插入key。

-若index位置非空,按探測序列查找下一個空閑位置:

-線性探測:index=(index+1)%M。

-二次探測:index=(index+i2)%M,i=1,2,3,...。

-雙重哈希:index=(index+h2(key)%M)%M。

-若遍歷完整個表仍未找到空閑位置,插入失?。ū頋M)。

3.查找操作:

-計(jì)算鍵值key的哈希值:index=h(key)。

-若index位置為key,查找成功。

-若index位置非空且不為key,按探測序列查找:

-線性探測:index=(index+1)%M。

-二次探測:index=(index+i2)%M,i=1,2,3,...。

-雙重哈希:index=(index+h2(key)%M)%M。

-若遇到“刪除”標(biāo)記,可能需要繼續(xù)查找。

-若遍歷完整個表仍未找到key,查找失敗。

4.刪除操作:

-查找鍵值key,標(biāo)記該位置為“刪除”(如用DEL表示)。

-注意:被刪除的位置仍可用于插入,但會影響后續(xù)查找效率。

(二)鏈地址法(續(xù))

鏈地址法通過鏈表處理沖突,適用于大規(guī)模數(shù)據(jù)集和動態(tài)變化場景:

鏈表節(jié)點(diǎn)設(shè)計(jì):

```plaintext

structHashNode{

Keykey;//存儲鍵值

Valuevalue;//存儲關(guān)聯(lián)數(shù)據(jù)

HashNodenext;//指向下一個節(jié)點(diǎn)的指針

};

```

哈希桶設(shè)計(jì):

```plaintext

structHashBucket{

HashNodehead;//鏈表頭指針

};

```

鏈地址法實(shí)施步驟:

1.初始化:

-創(chuàng)建一個大小為M的哈希表,初始化M個空的HashBucket。

-選擇合適的哈希函數(shù)h(key)=key%M。

2.插入操作:

-計(jì)算鍵值key的哈希值:bucket_index=h(key)。

-獲取對應(yīng)桶的鏈表:current_list=hash_table[bucket_index]。

-查找鏈表中是否已存在key:

-若存在,更新value(覆蓋舊值)。

-若不存在,創(chuàng)建新節(jié)點(diǎn)new_node,存儲key和value:

-new_node->next=current_list->head。

-current_list->head=new_node。

3.查找操作:

-計(jì)算鍵值key的哈希值:bucket_index=h(key)。

-獲取對應(yīng)桶的鏈表:current_list=hash_table[bucket_index]。

-遍歷鏈表:

-當(dāng)前節(jié)點(diǎn)=current_list->head。

-若當(dāng)前節(jié)點(diǎn)為NULL,查找失敗。

-若當(dāng)前節(jié)點(diǎn)->key==key,查找成功,返回當(dāng)前節(jié)點(diǎn)->value。

-否則,current_node=current_node->next。

-若遍歷完鏈表仍未找到,查找失敗。

4.刪除操作:

-計(jì)算鍵值key的哈希值:bucket_index=h(key)。

-獲取對應(yīng)桶的鏈表:current_list=hash_table[bucket_index]。

-遍歷鏈表查找key:

-前驅(qū)節(jié)點(diǎn)=NULL。

-當(dāng)前節(jié)點(diǎn)=current_list->head。

-若當(dāng)前節(jié)點(diǎn)為NULL,刪除失敗。

-若當(dāng)前節(jié)點(diǎn)->key==key:

-若前驅(qū)節(jié)點(diǎn)為NULL(即頭節(jié)點(diǎn)),則current_list->head=current_node->next。

-否則,前驅(qū)節(jié)點(diǎn)->next=current_node->next。

-刪除當(dāng)前節(jié)點(diǎn),返回成功。

-否則,前驅(qū)節(jié)點(diǎn)=current_node,current_node=current_node->next。

-若遍歷完鏈表仍未找到,刪除失敗。

鏈地址法優(yōu)缺點(diǎn)總結(jié):

-優(yōu)點(diǎn):

-處理沖突簡單,實(shí)現(xiàn)容易。

-空間利用率高,不會因沖突導(dǎo)致表空間浪費(fèi)。

-支持動態(tài)擴(kuò)展(見下文)。

-刪除操作高效(只需標(biāo)記或斷開節(jié)點(diǎn))。

-缺點(diǎn):

-查找效率受鏈表長度影響,最壞情況下為O(n)。

-需要額外的內(nèi)存空間存儲指針。

-當(dāng)沖突率高時,鏈表長度增加,影響性能。

(三)再哈希法(續(xù))

再哈希法通過重新哈希來處理沖突,適用于對性能要求極高的場景:

再哈希法實(shí)施步驟:

1.初始化:

-創(chuàng)建一個初始大小的哈希表M1,初始化所有位置為空。

-設(shè)計(jì)多個哈希函數(shù)h1,h2,...,hk。

-插入鍵值時,依次嘗試h1,h2,...,hk,直到找到空閑位置。

2.插入操作:

-計(jì)算鍵值key的哈希值:

-index1=h1(key)%M1。

-若index1位置為空,插入key。

-若index1位置非空,嘗試index2=h2(key)%M1,依此類推。

-若所有哈希函數(shù)均沖突,插入失?。ū頋M)。

3.查找操作:

-計(jì)算鍵值key的哈希值:

-index1=h1(key)%M1。

-若index1位置為key,查找成功。

-若index1位置非空且不為key,嘗試index2=h2(key)%M1,依此類推。

-若所有哈希函數(shù)均沖突仍未找到,查找失敗。

4.動態(tài)擴(kuò)展(Rehashing):

-當(dāng)沖突率超過閾值(如70%)時,執(zhí)行動態(tài)擴(kuò)展。

-步驟:

-創(chuàng)建一個新的大哈希表M2(如M2=2M1)。

-設(shè)計(jì)新的哈希函數(shù)(可能需要調(diào)整哈希函數(shù)參數(shù))。

-遍歷舊哈希表中的所有鍵值,重新計(jì)算哈希值并插入到新表中。

-優(yōu)點(diǎn):徹底解決沖突,性能恢復(fù)到較高水平。

-缺點(diǎn):重新哈希開銷大,操作期間性能下降。

三、哈希表沖突處理性能分析(續(xù))

(一)沖突率與查找效率

-沖突率:沖突次數(shù)與總插入次數(shù)的比值,是衡量哈希表性能的關(guān)鍵指標(biāo)。

-理想情況:沖突率為0,查找效率為O(1)。

-實(shí)際應(yīng)用:沖突率控制在5%-10%以內(nèi),查找效率接近O(1)。

-高沖突率:沖突率超過20%時,線性探測等開放尋址法的查找效率可能降至O(n),鏈地址法也會因鏈表過長而性能下降。

-負(fù)載因子(LoadFactor):λ=n/M,其中n為存儲的鍵值數(shù)量,M為哈希表大小。

-最佳實(shí)踐:負(fù)載因子通??刂圃?.5-0.75之間。

-負(fù)載因子與沖突率關(guān)系:負(fù)載因子越高,沖突率越高。

-哈希函數(shù)影響:

-好的哈希函數(shù)應(yīng)盡可能均勻分布鍵值,降低沖突概率。

-哈希函數(shù)的選擇應(yīng)考慮鍵值的分布特性和哈希表大小。

(二)不同方法的適用場景(續(xù))

1.開放尋址法:

-適用場景:

-小規(guī)模數(shù)據(jù)集,內(nèi)存空間有限。

-對內(nèi)存連續(xù)性要求高,鏈表開銷不可接受。

-查找操作比插入操作更頻繁。

-需要快速定位到具體位置(如緩存系統(tǒng))。

-注意事項(xiàng):

-不適用于高沖突率場景,易產(chǎn)生聚集。

-刪除操作復(fù)雜,可能影響后續(xù)查找。

-動態(tài)擴(kuò)展困難,通常需要重建整個哈希表。

2.鏈地址法:

-適用場景:

-大規(guī)模數(shù)據(jù)集,沖突率可能較高。

-動態(tài)變化的數(shù)據(jù),頻繁插入和刪除。

-對內(nèi)存分配靈活,支持鏈表擴(kuò)展。

-查找、插入、刪除操作頻率相近。

-優(yōu)點(diǎn):

-處理沖突靈活,性能穩(wěn)定。

-支持動態(tài)擴(kuò)展(見下文)。

-刪除操作簡單高效。

-擴(kuò)展方法:

-動態(tài)擴(kuò)展步驟:

1.創(chuàng)建一個新的大哈希表M2(如M2=2M1)。

2.設(shè)計(jì)新的哈希函數(shù)(如使用新的基數(shù)或擾動函數(shù))。

3.遍歷舊哈希表中的所有鏈表,將每個鍵值重新計(jì)算哈希值并插入到新表中:

-獲取舊鏈表節(jié)點(diǎn)。

-計(jì)算新哈希值:new_index=new_h(key)%M2。

-插入到新鏈表中(頭插法或尾插法)。

4.釋放舊哈希表內(nèi)存。

3.再哈希法:

-適用場景:

-對查找效率要求極高的場景,無法容忍O(n)查找。

-鍵值分布相對均勻,沖突概率可控。

-數(shù)據(jù)集規(guī)模適中,動態(tài)擴(kuò)展開銷可接受。

-優(yōu)點(diǎn):

-沖突處理徹底,查找效率高。

-動態(tài)擴(kuò)展后性能恢復(fù)快。

-缺點(diǎn):

-實(shí)現(xiàn)復(fù)雜,計(jì)算開銷大。

-動態(tài)擴(kuò)展時需要遍歷所有鍵值,開銷較大。

-需要設(shè)計(jì)多個哈希函數(shù),增加設(shè)計(jì)難度。

四、哈希表沖突處理優(yōu)化策略

除了選擇合適的沖突處理方法,還可以通過以下策略進(jìn)一步優(yōu)化哈希表性能:

1.優(yōu)化哈希函數(shù)設(shè)計(jì):

-選擇均勻分布的哈希函數(shù),減少沖突概率。

-考慮鍵值分布特性(如整數(shù)、字符串等),選擇合適的哈希算法。

-避免使用簡單的模運(yùn)算,可結(jié)合位運(yùn)算、乘法因子等方法。

2.動態(tài)調(diào)整哈希表大?。?/p>

-根據(jù)實(shí)際使用情況,動態(tài)調(diào)整哈希表大小,避免過載或浪費(fèi)。

-擴(kuò)展時采用合適的策略(如鏈地址法的新桶合并)。

3.使用高質(zhì)量的哈希函數(shù)庫:

-利用經(jīng)過優(yōu)化的哈希函數(shù)實(shí)現(xiàn),提高哈希效率。

-避免自定義哈希函數(shù)帶來的性能隱患。

4.多級哈希表設(shè)計(jì):

-使用多層哈希結(jié)構(gòu),第一層快速過濾,第二層精細(xì)查找。

-提高查找效率,減少單點(diǎn)沖突影響。

5.考慮特定應(yīng)用場景:

-對于小規(guī)模數(shù)據(jù)集,開放尋址法可能更高效。

-對于大規(guī)模數(shù)據(jù)集,鏈地址法更穩(wěn)定。

-對于高并發(fā)場景,需要考慮沖突處理的并發(fā)控制。

五、總結(jié)

哈希表沖突處理是確保哈希表性能的關(guān)鍵環(huán)節(jié)。通過選擇合適的沖突處理方法(開放尋址法、鏈地址法、再哈希法),結(jié)合負(fù)載因子控制、哈希函數(shù)優(yōu)化、動態(tài)擴(kuò)展等策略,可以有效降低沖突率,提升哈希表的查找、插入、刪除效率。在實(shí)際應(yīng)用中,應(yīng)根據(jù)數(shù)據(jù)規(guī)模、使用場景和性能需求,綜合評估并選擇最優(yōu)方案。持續(xù)優(yōu)化哈希表設(shè)計(jì),可以進(jìn)一步提高系統(tǒng)的整體性能和穩(wěn)定性。

一、哈希表沖突處理概述

哈希表是一種高效的數(shù)據(jù)結(jié)構(gòu),通過哈希函數(shù)將鍵映射到表中的特定位置。然而,由于哈希函數(shù)的特性或大量鍵的分布不均,可能會出現(xiàn)多個不同鍵映射到同一位置的情況,這種現(xiàn)象稱為哈希沖突。哈希表沖突處理制度是指一系列策略和方法,用于有效管理和解決哈希沖突,確保哈希表的性能和穩(wěn)定性。

(一)哈希沖突的產(chǎn)生原因

1.哈希函數(shù)設(shè)計(jì)不合理:若哈希函數(shù)未能均勻分布鍵值,可能導(dǎo)致大量鍵值沖突。

2.哈希表容量有限:當(dāng)哈希表容量固定時,鍵值數(shù)量超過容量極限,沖突概率增加。

3.鍵值分布不均:某些鍵值在特定應(yīng)用場景中具有高度相似性,導(dǎo)致頻繁沖突。

二、哈希表沖突處理方法

(一)開放尋址法

開放尋址法通過在發(fā)生沖突時尋找下一個空閑位置來存儲鍵值。具體方法包括:

1.線性探測:

-原理:若位置k發(fā)生沖突,則依次檢查k+1,k+2,...,直到找到空閑位置。

-優(yōu)點(diǎn):實(shí)現(xiàn)簡單,空間利用率高。

-缺點(diǎn):易產(chǎn)生聚集現(xiàn)象,降低查找效率。

2.二次探測:

-原理:若位置k發(fā)生沖突,則依次檢查k+12,k+22,...,直到找到空閑位置。

-優(yōu)點(diǎn):減少聚集現(xiàn)象,提高查找效率。

-缺點(diǎn):可能存在不可達(dá)區(qū)域,影響表容量。

3.雙重哈希:

-原理:使用兩個哈希函數(shù),若第一個函數(shù)沖突,則使用第二個函數(shù)計(jì)算步長。

-優(yōu)點(diǎn):分布均勻,沖突概率低。

-缺點(diǎn):實(shí)現(xiàn)復(fù)雜,計(jì)算開銷大。

(二)鏈地址法

鏈地址法將所有沖突的鍵值存儲在同一個鏈表中,具體步驟如下:

1.初始化:為每個哈希桶分配一個空鏈表。

2.插入操作:

-計(jì)算鍵值的哈希值,確定存儲桶。

-若桶為空,直接插入;若不為空,插入鏈表末尾。

3.查找操作:

-計(jì)算鍵值的哈希值,定位鏈表。

-遍歷鏈表,查找匹配鍵值。

優(yōu)點(diǎn):實(shí)現(xiàn)簡單,沖突處理靈活,空間利用率高。

缺點(diǎn):鏈表操作可能影響效率,內(nèi)存開銷較大。

(三)再哈希法

再哈希法在發(fā)生沖突時,使用另一個哈希函數(shù)重新計(jì)算存儲位置,具體步驟如下:

1.設(shè)計(jì)多個哈希函數(shù):為每個鍵值設(shè)計(jì)多個備選哈希函數(shù)。

2.沖突處理:若第一個函數(shù)沖突,則使用第二個函數(shù),依此類推。

3.動態(tài)擴(kuò)展:當(dāng)沖突率過高時,重新設(shè)計(jì)哈希表并遷移所有鍵值。

優(yōu)點(diǎn):沖突概率低,查找效率高。

缺點(diǎn):設(shè)計(jì)復(fù)雜,計(jì)算開銷大,動態(tài)擴(kuò)展成本高。

三、哈希表沖突處理性能分析

(一)沖突率與查找效率

-沖突率:沖突次數(shù)與總插入次數(shù)的比值,直接影響查找效率。

-低沖突率(<5%)時,查找效率接近O(1)。

-高沖突率(>20%)時,查找效率降至O(n)。

(二)不同方法的適用場景

1.開放尋址法:

-適用于小規(guī)模數(shù)據(jù)集,對內(nèi)存連續(xù)性要求高。

-不適用于高沖突率場景,易產(chǎn)生聚集。

2.鏈地址法:

-適用于大規(guī)模數(shù)據(jù)集,對內(nèi)存分配靈活。

-適用于動態(tài)變化的數(shù)據(jù),支持高效插入和刪除。

3.再哈希法:

-適用于對查找效率要求極高的場景。

-適用于靜態(tài)數(shù)據(jù)集,避免動態(tài)擴(kuò)展開銷。

四、總結(jié)

哈希表沖突處理制度是確保哈希表性能的關(guān)鍵環(huán)節(jié)。通過選擇合適的沖突處理方法,可以有效降低沖突率,提升查找效率。在實(shí)際應(yīng)用中,應(yīng)根據(jù)數(shù)據(jù)規(guī)模、使用場景和性能需求,綜合評估并選擇最優(yōu)方案。

二、哈希表沖突處理方法(續(xù))

(一)開放尋址法(續(xù))

除了線性探測、二次探測和雙重哈希,開放尋址法還包括其他變種:

4.平方探測(QuadraticProbing):

-原理:結(jié)合線性探測和二次探測的思想,使用平方序列作為探測步長(12,-12,22,-22,...)。探測序列為:k,k+12,k-12,k+22,k-22,...

-優(yōu)點(diǎn):相比線性探測,能減少聚集現(xiàn)象,提高查找效率。

-缺點(diǎn):可能存在“空洞鏈”(HoleChain),即一些位置無法被訪問,影響表容量。

5.雙重哈希(DoubleHashing):

-原理:使用兩個獨(dú)立的哈希函數(shù)h1和h2,若h1(key)發(fā)生沖突,則使用步長h2(key)%M(M為哈希表大?。┻M(jìn)行探測。

-優(yōu)點(diǎn):探測序列分布更均勻,沖突概率更低。

-缺點(diǎn):計(jì)算兩個哈希函數(shù)的開銷較大,實(shí)現(xiàn)復(fù)雜度較高。

開放尋址法實(shí)施步驟:

1.初始化:

-創(chuàng)建一個大小為M的哈希表,初始化所有位置為空或標(biāo)記為“刪除”。

-選擇合適的哈希函數(shù)h(key)=key%M。

-選擇探測序列(如線性探測、二次探測等)。

2.插入操作:

-計(jì)算鍵值key的哈希值:index=h(key)。

-若index位置為空,插入key。

-若index位置非空,按探測序列查找下一個空閑位置:

-線性探測:index=(index+1)%M。

-二次探測:index=(index+i2)%M,i=1,2,3,...。

-雙重哈希:index=(index+h2(key)%M)%M。

-若遍歷完整個表仍未找到空閑位置,插入失敗(表滿)。

3.查找操作:

-計(jì)算鍵值key的哈希值:index=h(key)。

-若index位置為key,查找成功。

-若index位置非空且不為key,按探測序列查找:

-線性探測:index=(index+1)%M。

-二次探測:index=(index+i2)%M,i=1,2,3,...。

-雙重哈希:index=(index+h2(key)%M)%M。

-若遇到“刪除”標(biāo)記,可能需要繼續(xù)查找。

-若遍歷完整個表仍未找到key,查找失敗。

4.刪除操作:

-查找鍵值key,標(biāo)記該位置為“刪除”(如用DEL表示)。

-注意:被刪除的位置仍可用于插入,但會影響后續(xù)查找效率。

(二)鏈地址法(續(xù))

鏈地址法通過鏈表處理沖突,適用于大規(guī)模數(shù)據(jù)集和動態(tài)變化場景:

鏈表節(jié)點(diǎn)設(shè)計(jì):

```plaintext

structHashNode{

Keykey;//存儲鍵值

Valuevalue;//存儲關(guān)聯(lián)數(shù)據(jù)

HashNodenext;//指向下一個節(jié)點(diǎn)的指針

};

```

哈希桶設(shè)計(jì):

```plaintext

structHashBucket{

HashNodehead;//鏈表頭指針

};

```

鏈地址法實(shí)施步驟:

1.初始化:

-創(chuàng)建一個大小為M的哈希表,初始化M個空的HashBucket。

-選擇合適的哈希函數(shù)h(key)=key%M。

2.插入操作:

-計(jì)算鍵值key的哈希值:bucket_index=h(key)。

-獲取對應(yīng)桶的鏈表:current_list=hash_table[bucket_index]。

-查找鏈表中是否已存在key:

-若存在,更新value(覆蓋舊值)。

-若不存在,創(chuàng)建新節(jié)點(diǎn)new_node,存儲key和value:

-new_node->next=current_list->head。

-current_list->head=new_node。

3.查找操作:

-計(jì)算鍵值key的哈希值:bucket_index=h(key)。

-獲取對應(yīng)桶的鏈表:current_list=hash_table[bucket_index]。

-遍歷鏈表:

-當(dāng)前節(jié)點(diǎn)=current_list->head。

-若當(dāng)前節(jié)點(diǎn)為NULL,查找失敗。

-若當(dāng)前節(jié)點(diǎn)->key==key,查找成功,返回當(dāng)前節(jié)點(diǎn)->value。

-否則,current_node=current_node->next。

-若遍歷完鏈表仍未找到,查找失敗。

4.刪除操作:

-計(jì)算鍵值key的哈希值:bucket_index=h(key)。

-獲取對應(yīng)桶的鏈表:current_list=hash_table[bucket_index]。

-遍歷鏈表查找key:

-前驅(qū)節(jié)點(diǎn)=NULL。

-當(dāng)前節(jié)點(diǎn)=current_list->head。

-若當(dāng)前節(jié)點(diǎn)為NULL,刪除失敗。

-若當(dāng)前節(jié)點(diǎn)->key==key:

-若前驅(qū)節(jié)點(diǎn)為NULL(即頭節(jié)點(diǎn)),則current_list->head=current_node->next。

-否則,前驅(qū)節(jié)點(diǎn)->next=current_node->next。

-刪除當(dāng)前節(jié)點(diǎn),返回成功。

-否則,前驅(qū)節(jié)點(diǎn)=current_node,current_node=current_node->next。

-若遍歷完鏈表仍未找到,刪除失敗。

鏈地址法優(yōu)缺點(diǎn)總結(jié):

-優(yōu)點(diǎn):

-處理沖突簡單,實(shí)現(xiàn)容易。

-空間利用率高,不會因沖突導(dǎo)致表空間浪費(fèi)。

-支持動態(tài)擴(kuò)展(見下文)。

-刪除操作高效(只需標(biāo)記或斷開節(jié)點(diǎn))。

-缺點(diǎn):

-查找效率受鏈表長度影響,最壞情況下為O(n)。

-需要額外的內(nèi)存空間存儲指針。

-當(dāng)沖突率高時,鏈表長度增加,影響性能。

(三)再哈希法(續(xù))

再哈希法通過重新哈希來處理沖突,適用于對性能要求極高的場景:

再哈希法實(shí)施步驟:

1.初始化:

-創(chuàng)建一個初始大小的哈希表M1,初始化所有位置為空。

-設(shè)計(jì)多個哈希函數(shù)h1,h2,...,hk。

-插入鍵值時,依次嘗試h1,h2,...,hk,直到找到空閑位置。

2.插入操作:

-計(jì)算鍵值key的哈希值:

-index1=h1(key)%M1。

-若index1位置為空,插入key。

-若index1位置非空,嘗試index2=h2(key)%M1,依此類推。

-若所有哈希函數(shù)均沖突,插入失?。ū頋M)。

3.查找操作:

-計(jì)算鍵值key的哈希值:

-index1=h1(key)%M1。

-若index1位置為key,查找成功。

-若index1位置非空且不為key,嘗試index2=h2(key)%M1,依此類推。

-若所有哈希函數(shù)均沖突仍未找到,查找失敗。

4.動態(tài)擴(kuò)展(Rehashing):

-當(dāng)沖突率超過閾值(如70%)時,執(zhí)行動態(tài)擴(kuò)展。

-步驟:

-創(chuàng)建一個新的大哈希表M2(如M2=2M1)。

-設(shè)計(jì)新的哈希函數(shù)(可能需要調(diào)整哈希函數(shù)參數(shù))。

-遍歷舊哈希表中的所有鍵值,重新計(jì)算哈希值并插入到新表中。

-優(yōu)點(diǎn):徹底解決沖突,性能恢復(fù)到較高水平。

-缺點(diǎn):重新哈希開銷大,操作期間性能下降。

三、哈希表沖突處理性能分析(續(xù))

(一)沖突率與查找效率

-沖突率:沖突次數(shù)與總插入次數(shù)的比值,是衡量哈希表性能的關(guān)鍵指標(biāo)。

-理想情況:沖突率為0,查找效率為O(1)。

-實(shí)際應(yīng)用:沖突率控制在5%-10%以內(nèi),查找效率接近O(1)。

-高沖突率:沖突率超過20%時,線性探測等開放尋址法的查找效率可能降至O(n),鏈地址法也會因鏈表過長而性能下降。

-負(fù)載因子(LoadFactor):λ=n/M,其中n為存儲的鍵值數(shù)量,M為哈希表大小。

-最佳實(shí)踐:負(fù)載因子通??刂圃?.5-0.75之間。

-負(fù)載因子與沖突率關(guān)系:負(fù)載因子越高,沖突率越高。

-哈希函數(shù)影響:

-好的哈希函數(shù)應(yīng)盡可能均勻分布鍵值,降低沖突概率。

-哈希函數(shù)的選擇應(yīng)考慮鍵值的分布特性和哈希表大小。

(二)不同方法的適用場景(續(xù))

1.開放尋址法:

-適用場景:

-小規(guī)模數(shù)據(jù)集,內(nèi)存空間有限。

-對內(nèi)存連續(xù)性要求高,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論