




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、哈希樹(HasshTrree)羅堃 吳朝宏宏從20000年開開始,作作者開始始研究基基于TCCP/IIP的短短信息傳傳輸技術術。這種種技術目目前在國國際上的的標準被被成為SSMPPP(Shhortt Meessaage Peeer tto PPeerr Prrotoocoll)。SSMPPP協(xié)議是是一種支支持異步步傳輸模模式(AAsynnchrroniizedd Trranssmisssioon MModee)的信信息傳輸輸方式。這種異異步方式式主要體體現(xiàn)在兩兩個地方方:傳遞遞信息和和等待確確認。在在為電信信運營商商編寫軟軟件的過過程當中中,解決決大容量量(百萬萬用戶以以上)要要求下的的快速查
2、查找與匹匹配成為為實現(xiàn)這這個系統(tǒng)統(tǒng)的核心心任務。作者在在反復設設計整個個過程中中曾經(jīng)嘗嘗試過很很多種方方式和算算法,但但都未能能取得滿滿意的效效果。最最終不得得不自己己開始設設計針對對這種系系統(tǒng)的特特殊存儲儲模式。并在這這個過程程中,找找到了一一種比較較理想的的數(shù)據(jù)存存儲結構構哈希希樹(HHashhTreee)。一、查找找算法在各種數(shù)數(shù)據(jù)結構構(線性性表、樹樹等)中中,記錄錄在結構構中的相相對位置置是隨機機的,和和記錄的的關鍵字字之間不不存在確確定的關關系。因因此在機機構中查查找記錄錄的時需需要進行行一系列列和關鍵鍵字的比比較。這這一類的的查找方方法建立立在“比較”的基礎礎上。在在順序查查找時
3、,比較的的結果為為“”與“”兩種可可能。在在折半查查找、二二叉排序序樹查找找和樹查查找時,比較的的結果為為“”、“”與“”三種可可能。查查找的效效率依賴賴于查找找過程中中所進行行的比較較次數(shù)。為確定記記錄在查查找表中中的位置置,需和和給定值值進行比比較的關關鍵字個個數(shù)的期期望值成成為查找找算法在在查找成成功時的的平均查查找長度度(Avveraage Seaarchh Leengtth)。下面我我們簡單單討論一一下在含含有個數(shù)數(shù)據(jù)記錄錄的結構構中,各各種查找找算法的的平均查查找長度度。在等概率率的情況況下,順順序查找找的平均均查找長長度為:對于折折半查找找(表要要求是順順序表),在比比較大()的
4、時時候,可可有以下下近似結結果:在隨機機情況下下(二叉叉樹查找找可能退退化為順順序查找找),對對于二叉叉樹,其其平均查查找長度度為: 在平衡二二叉樹上上進行查查找,其其平均查查找長度度為:,其中對于一顆顆階的樹,從根節(jié)節(jié)點到關關鍵字所所在節(jié)點點的路徑徑上涉及及的節(jié)點點數(shù)可以以說是平平均查找找長度的的上限:總的來來說,這這些查找找算法的的效率都都將隨著著數(shù)據(jù)記記錄數(shù)的的增長而而下降。僅僅是是有的比比較快(時間復復雜度為為),有有的比較較慢(時時間復雜雜度是)而已。這些查查找算法法的平均均查找長長度是在在一種比比較理想想的情況況下獲得得的。在在實際應應用當中中,對數(shù)數(shù)據(jù)結構構中數(shù)據(jù)據(jù)的頻繁繁增加和
5、和刪除將將不斷地地改變著著數(shù)據(jù)的的結構。這些操操作將可可能導致致某些數(shù)數(shù)據(jù)結構構退化為為鏈表結結構,那那么其性性能必然然將下降降。為了了避免出出現(xiàn)這種種情況而而采取的的調(diào)整措措施,又又不可避避免的增增加了程程序的復復雜程度度以及操操作的額額外時間間。二、哈希希表理想的情情況是希希望不經(jīng)經(jīng)過任何何比較,一次存存取便能能得到所所查的記記錄,那那就必須須在記的的存儲位位置和它它的關鍵鍵字之間間建立一一個確定定的對應應關系,使每個個關鍵字字和結構構中一個個唯一的的存儲位位置相對對應。因因而在查查找時,只要根根據(jù)這個個對應關關系找到到給定值值的像。若若結構中中存在關關鍵字和和相等的的記錄,則必定定在的存
6、存儲位置置上,由由此,不不需要進進行比較較便可直直接取得得所查記記錄。在在此,我我們稱這這個對應應關系為為哈希(Hassh)函函數(shù),按按這個思思想建立立的表為為哈希表表。在哈希希表中對對于不同同的關鍵鍵字可能能得到同同一哈希希地址,即,而而。這種種現(xiàn)象稱稱做沖突突(Coolliisioon)。在一般般情況下下,沖突突只能盡盡可能地地減少,而不能能完全避避免。因因為哈希希函數(shù)是是從關鍵鍵字集合合到地址址集合的的映像。通常關關鍵字的的集合比比較大,它的元元素包括括所有可可能的關關鍵字,而地址址集合的的元素僅僅為哈希希表中的的地址值值。假設標標識符可可定義為為以字符符為首的的8位字字符,則則關鍵字字
7、(標識識符)的的集合大大小為,而在一一個源程程序中出出現(xiàn)的數(shù)數(shù)據(jù)對象象是有限限的,設設有1000000個元素素。地址址集合中中的元素素為0到到99999。因因此在一一般情況況下,哈哈希函數(shù)數(shù)是一個個壓縮映映像函數(shù)數(shù),這就就不可避避免的要要產(chǎn)生沖沖突。二、哈希希樹的理理論基礎礎2.1質(zhì)質(zhì)數(shù)分辨辨定理定理1:選取任任意個互互不相同同的質(zhì)數(shù)數(shù):(),定定義:設(),那么對對于任意意的,()()不可可能總成成立。證明:假假設定理理1的結結論不正正確,那那么對于于任意的的,()()將將總是成成立。這這個可以以表達為為:設:顯然,是是一個合合數(shù),而而且包含含質(zhì)因素素。根據(jù)據(jù)質(zhì)數(shù)的的定義和和質(zhì)因素素分解定定
8、理,可可以表達達為:而另外外一方面面,根據(jù)據(jù),可以以得出:很明顯,這兩個個結論是是相互矛矛盾的。因此原原定理11正確。這個定理理可以簡簡單的表表述為:個不同同的質(zhì)數(shù)數(shù)可以“分辨”的連續(xù)續(xù)整數(shù)的的個數(shù)和和他們的的乘積相相等。“分辨”就是指指這些連連續(xù)的整整數(shù)不可可能有完完全相同同的余數(shù)數(shù)序列。這個為為哈希樹樹的分辨辨方式奠奠定了理理論基礎礎。顯然,這這個定理理的一個個特殊情情況就是是為從22起的連連續(xù)質(zhì)數(shù)數(shù)。我們們可以記記為前個連連續(xù)質(zhì)數(shù)數(shù)的乘積積。連續(xù)續(xù)10個個質(zhì)數(shù)就就可以分分辨大約約個數(shù),已經(jīng)超超過計算算機中常常用整數(shù)數(shù)(322bitt)的表表達范圍圍。連續(xù)續(xù)1000個質(zhì)數(shù)數(shù)就可以以分辨大大
9、約。而按照目目前的CCPU水水平,1100次次取余的的整數(shù)除除法操作作幾乎不不算什么么難事。在實際際應用中中,整體體的操作作速度往往往取決決于節(jié)點點將關鍵鍵字裝載載內(nèi)存的的次數(shù)和和時間。一般來來說,裝裝載的時時間是由由關鍵字字的大小小和硬件件來決定定的;在在相同類類型關鍵鍵字和相相同硬件件條件下下,實際際的整體體操作時時間就主主要取決決于裝載載的次數(shù)數(shù)。他們們之間是是一個成成正比的的關系。2.2余余數(shù)分辨辨定理在這里里,我們們對更為為普遍的的余數(shù)分分辨方式式做一個個討論。定理2:選取任任意個互互不相同同的自然然數(shù):(),定定義LCCM(LLeasse CCommmon Multtiplle)為
10、為的最小小公倍數(shù)數(shù)。設(),那么對對于任意意的,()()不可可能總成成立。證明:假假設定理理2的結結論不正正確,那那么對于于任意的的,()()將將總是成成立。這這個可以以表達為為:設:顯然,是是一個合合數(shù),而而且包含含因素。根據(jù)最最小公倍倍數(shù)的定定義,可可以表達達為:而另外外一方面面,根據(jù)據(jù),可以以得出:很明顯,這兩個個結論是是相互矛矛盾的。因此原原定理22正確。這個定理理2可以以簡單的的表述為為:個不不同的數(shù)數(shù)可以“分辨”的連續(xù)續(xù)整數(shù)的的個數(shù)不不超過他他們的最最小公倍倍數(shù)。超超過這個個范圍就就意味著著沖突的的概率會會增加。定理11是定理理2的一一個特例例。2.3分分辨算法法評價標標準狀態(tài)和特
11、特征分辨也即即分辨不不同的狀狀態(tài)。分分辨一般般是先定定義一組組不同的的狀態(tài),然后將將這些狀狀態(tài)記錄錄下來形形成特征征。由這這些特征征所形成成的空間間是特征征空間。特征空空間的緯緯數(shù)是特特征數(shù)列列的長度度。分辨能力力分辨能力力D,也也稱分辨辨范圍,就是指指分辨算算法可以以分辨的的最大連連續(xù)空間間大小。在這個個范圍內(nèi)內(nèi),分辨辨算法可可以唯一一確定被被分辨數(shù)數(shù)。即任任何兩個個在分辨辨范圍內(nèi)內(nèi)的數(shù),不可能能具有完完全相同同的特征征數(shù)。這這些特征征數(shù)會以以某種形形式被記記錄下來來,或者者以數(shù)據(jù)據(jù)結構的的形式體體現(xiàn)出來來。對于兩個個具有相相同分辨辨能力的的分辨算算法,我我們認為為他們是是等價算算法。當?shù)臅r
12、候候,分辨辨算法的的分辨能能力最強強。但是是同時分分辨算法法所使用用的特征征空間也也將是無無窮大,我們不不可能有有足夠的的空間來來存放這這些相關關特征記記錄。沖突概率率當被分辨辨數(shù)之間間的距離離超出分分辨范圍圍的時候候,就有有可能發(fā)發(fā)生沖突突,這種種沖突的的概率被被定義為為沖突概概率:當被分辨辨的數(shù)是是隨機分分布在整整個數(shù)軸軸的時候候,兩個個數(shù)之間間的距離離可能會會超過分分辨范圍圍。這個個時候分分辨算法法不一定定會完全全失效。沖突概概率就體體現(xiàn)為衡衡量某種種分辨算算法在處處理散列列時候的的特性。沖突概概率越小小,那么么處理散散列的能能力就越越強,對對非連續(xù)續(xù)空間的的特征分分辨能力力就越高高;反
13、之之,那么么處理散散列的能能力就越越弱,對對非連續(xù)續(xù)空間的的特征分分辨能力力就越低低。對于兩個個具有相相同沖突突概率的的分辨算算法,我我們也認認為他們們是等價價算法。分辨效率率根據(jù)分辨辨算法的的特點,我們可可以定義義分辨效效率:在由定理理1和定定理2可可以得知知:當用用于余數(shù)數(shù)分辨的的整數(shù)數(shù)數(shù)列是某某一個確確定整數(shù)數(shù),或者者互不相相等的質(zhì)質(zhì)數(shù)數(shù)列列的時候候,或者者是互相相沒有公公約數(shù)的的整數(shù)數(shù)數(shù)列,分分辨效率率;其他他情況下下,分辨辨效率都都小于1100%。簡化度在分辨算算法中,我們定定義數(shù)列列的簡化化度為:所有用于于分辨的的特征個個數(shù)的和和,代表表了分辨辨所需要要的特征征總數(shù)。特征總總數(shù)越少
14、少,那么么簡化度度就越高高。分辨辨算法的的簡化度度越高,說明所所用狀態(tài)態(tài)數(shù)越少少,分辨辨過程將將能更簡簡單。這這個評價價標準有有利于我我們?nèi)コ哂嗵靥卣鞯牟坎糠?。定?:在相同同分辨范范圍條件件下的余余數(shù)分辨辨算法中中,所有有分辨效效率的分分辨數(shù)列列的簡化化度都小小于分辨辨效率的的分辨數(shù)數(shù)列的簡簡化度。證明:分分辨效率率意味著著用于分分辨的整整數(shù)數(shù)列列中,肯肯定存在在某兩個個整數(shù)有有約數(shù)(否則他他們的乘乘積就是是他們的的最小公公倍數(shù),那么分分辨效率率)。這這個約數(shù)數(shù)我們稱稱它為這這兩個數(shù)數(shù)之間的的最大公公約數(shù)GGCD(Greeateest Commmon Diviisorr)。不不妨設這這兩
15、個整整數(shù)為:顯然如果果用代替替,將不不會影響響這些整整數(shù)之間間的最小小公倍數(shù)數(shù)LCMM。一方方面,這這些整數(shù)數(shù)的積得得到了減減少,分分辨效率率將有所所提高;另外一一方面,這些整整數(shù)的和和得到了了減少,簡化度度也因此此而提到到。通過過反復簡簡化操作作這個數(shù)數(shù)列的分分辨效率率總可以以達到1100%1:分分辨效率率的分辨辨數(shù)列總總可以簡簡化,而而且可以以簡化成成分辨效效率的分分辨數(shù)列列。綜合評價價指標我們定義義分辨算算法綜合合評價指指標:這個標準準意味著著:分辨辨范圍越越大,簡簡化度越越高,那那么這個個算法的的綜合性性能就越越好。例例如:在在余數(shù)分分辨法中中,如果果我們選選擇數(shù)列列作為分分辨數(shù)列列,
16、那么么采取這這個數(shù)列列的余數(shù)數(shù)分辨算算法各項項指標如如下:如果我我們選擇擇數(shù)列作作為分辨辨數(shù)列,那么采采取這個個數(shù)列的的余數(shù)分分辨算法法各項指指標如下下:顯然后后者在綜綜合評價價方面要要優(yōu)于前前者。2.4線線性分辨辨算法線性分辨辨算法是是利用線線性函數(shù)數(shù)作為分分辨算法法的分辨辨算法,或者稱稱為余數(shù)數(shù)分辨算算法。這這種算法法簡單易易行。上上面所有有的討論論都是基基于線性性分辨算算法的。2.5非非線性分分辨算法法非線性分分辨算法法是指在在特征數(shù)數(shù)的獲取取過程中中采用非非線性函函數(shù)的方方法。這這也就是是說,可可以完全全使用非非線性函函數(shù),或或者非線線性函數(shù)數(shù)和線性性函數(shù)混混合使用用。但是是只要是是使
17、用了了非線性性函數(shù),那么就就被稱作作非線性性分辨。在這些算算法里面面,可以以分成兩兩類:非非線性函函數(shù)特征征法和分分段特征征提取法法。非線性函函數(shù)特征征法利用單值值非線性性函數(shù)(例如:)來提提取特征征的方法法就稱為為非線性性特征法法。很明明顯這些些函數(shù)的的單值對對應性,并沒有有改變分分辨范圍圍的大小小。這些些函數(shù)僅僅僅是將將特征空空間做了了一個變變形處理理。這種種變形可可能是平平移、縮縮放等等等。但是是分辨能能力沒有有擴大,沖突概概率也并并沒有得得到減少少,簡化化度也沒沒有發(fā)生生變化,分辨算算法的整整體評價價標準也也沒有改改變。分段特征征提取法法分段特征征提取法法就是將將被分辨辨的數(shù)分分成若干
18、干部分,每個部部分有若若干狀態(tài)態(tài)。假設設某個數(shù)數(shù)可以被被分成段段,每段段所有可可能的狀狀態(tài)個數(shù)數(shù)為(其其中)。那么我我們可以以得出以以下結論論:任何一一個段的的狀態(tài)至至少是有有兩個狀狀態(tài),否否則這種種分段是是毫無意意義的?;蛘哒f說這段是是沒有任任何特征征的,對對分辨算算法來說說是一種種時間和和空間的的浪費。這種算算法的分分辨能力力是:其沖突突概率:這種算算法的分分辨效率率,簡化化度為:總體評評價:這種算算法可以以做到在在所有分分辨算法法中的簡簡化度最最高,綜綜合評價價也可以以很高。但這種種分辨算算法的綜綜合評價價并不總總是最高高的。例如:當我們們在分辨辨32位位整數(shù)的的時候,使用這這種分段段特
19、征分分辨法,那么這這種分辨辨方法的的各項指指標如下下:如果在在余數(shù)分分辨算法法中,我我們選擇擇從2到到29的的連續(xù)110個質(zhì)質(zhì)數(shù)作為為分辨數(shù)數(shù)列,那那么這個個分辨方方法的各各項指標標如下:在分辨辨以2進進制為基基礎的連連續(xù)整數(shù)數(shù)的時候候,這種種算法有有著明顯顯的優(yōu)勢勢。但是是在分辨辨散列的的時候,例如:以字符符為基礎礎的字符符串的時時候,其其特征緯緯數(shù)和者者特征數(shù)數(shù)將會迅迅速增加加。過多多的特征征緯數(shù)和和特征數(shù)數(shù)意味者者,對于于特征空空間的浪浪費、更更多的初初始化時時間以及及更多比比較次數(shù)數(shù)和比較較時間。為了仍仍然能夠夠使用這這種分辨辨方法,普遍采采用對字字符串壓壓縮編碼碼轉換成成整數(shù)后后,再
20、使使用該分分辨算法法。但是是即使是是采取轉轉換手段段,對于于超長的的字符串串仍然不不是十分分容易處處理。三、哈希希樹的組組織結構構使用不同同的分辨辨算法都都可以組組織成哈哈希樹。一般來來說:每每層哈希希樹的節(jié)節(jié)點下的的子節(jié)點點數(shù)是和和分辨數(shù)數(shù)列一致致的。哈哈希樹的的最大深深度和特特征空間間的緯數(shù)數(shù)是一致致的。為了研究究的方便便,我們們選擇質(zhì)質(zhì)數(shù)分辨辨算法來來建立一一顆哈希希樹。選選擇從22開始的的連續(xù)質(zhì)質(zhì)數(shù)來建建立一個個十層的的哈希樹樹(因為為已經(jīng)超超過了計計算機中中常用整整數(shù)的表表達范圍圍)。第第一層節(jié)節(jié)點為根根節(jié)點,根節(jié)點點下有22個節(jié)點點;第二二層的每每個節(jié)點點下有33個節(jié)點點;依此此類
21、推,即每層層節(jié)點的的子節(jié)點點數(shù)目為為連續(xù)的的質(zhì)數(shù)。到了第第十層,每個節(jié)節(jié)點下有有29個個節(jié)點。圖1 哈哈希樹的的組織結結構同一節(jié)點點中的子子節(jié)點,從左到到右代表表不同的的余數(shù)結結果。例例如:第第二層節(jié)節(jié)點下有有三個子子節(jié)點。那么從從左到右右分別代代表:除除3余00,除33余1和和除3余余2。對質(zhì)數(shù)的的余數(shù)決決定了處處理的路路徑。例例如:某某個數(shù)來來到第二二層子節(jié)節(jié)點,那那么它要要做取余余操作,然后再再決定從從哪個子子節(jié)點向向下搜尋尋。如果果這個數(shù)數(shù)是122那么它它需要從從第一個個子節(jié)點點向下搜搜索;如如果這個個數(shù)是77那么它它需要從從第二個個子節(jié)點點向下搜搜索;如如果這個個數(shù)是332那么么它需
22、要要從第三三個子節(jié)節(jié)點向下下搜索。如果所有有的節(jié)點點都存在在,并容容納數(shù)據(jù)據(jù)的話,那么可可以容納納的數(shù)據(jù)據(jù)項目總總數(shù)將比比要大一一些:如果在建建立當初初就建立立所有的的節(jié)點,那么所所消耗的的計算時時間和磁磁盤空間間是巨大大的。在在實際使使用當中中,只需需要初始始化根節(jié)節(jié)點就可可以開始始工作。子節(jié)點點的建立立是在有有更多的的數(shù)據(jù)進進入到哈哈希樹中中的時候候建立的的。因此此可以說說哈希樹樹和其他他樹一樣樣是一個個動態(tài)結結構。這些節(jié)點點有以下下基本元元素:節(jié)點的關關鍵字我們用kkey來來表示節(jié)節(jié)點的關關鍵字。在整個個樹中這這個數(shù)值值是唯一一的。當當節(jié)點占占據(jù)標志志位(ooccuupieed)為為真的
23、時時候,關關鍵字才才認為是是有效的的,否則則是無效效的。節(jié)點是否否被占據(jù)據(jù)我們用ooccuupieed來表表示節(jié)點點是否被被占據(jù)。如果節(jié)節(jié)點的關關鍵字(keyy)有效效,那么么occcupiied應應該設置置位trrue,否則設設置為ffalsse。節(jié)點的子子節(jié)點數(shù)數(shù)組我們用nnodeesii來表表示節(jié)點點的第ii個子節(jié)節(jié)點的地地址。第第10個個質(zhì)數(shù)為為29,余數(shù)不不可能大大于322。這個個數(shù)組的的固定長長度為可可以設置置為322,即。當?shù)趇i個子節(jié)節(jié)點不存存在時,noddesi=NNULLL,否則則為子節(jié)節(jié)點的地地址。節(jié)點的數(shù)數(shù)據(jù)對象象我們用vvaluue來表表示節(jié)點點的數(shù)據(jù)據(jù)對象。四、插入
24、入規(guī)則設需要插插入的關關鍵字和和數(shù)據(jù)分分別為kkey和和vallue。用leevell表示插插入操作作進行到到第幾層層,leevell從0開開始。PPrimme表為為連續(xù)質(zhì)質(zhì)數(shù)表。插入過過程從根根節(jié)點開開始執(zhí)行行:如果當前前節(jié)點沒沒有被占占據(jù)(ooccuupieed = faalsee),則則設置該該節(jié)點的的keyy和vaaluee,并設設置占據(jù)據(jù)標記為為truue,然然后返回回。如果當前前節(jié)點被被占據(jù)(occcupiied = ttruee),則則計算iindeex = keey mmod Priimelevvel。如果noodessinndexx = NUULL,那么創(chuàng)創(chuàng)建子節(jié)節(jié)點,將將l
25、evvel加加1,并并重復第第1步操操作。如果noodessinndexx為一一個子節(jié)節(jié)點那么么,將lleveel加11,然后后重復第第1步操操作。用偽碼來來表示如如下:voidd innserrt (HasshNoode enttry, innt lleveel, Keyy keey, Vallue vallue)iff (tthiss.occcuppiedd = fallse)thhis.keyy = keyy;thhis.vallue = vvaluue;thhis.occcupiied = ttruee;reeturrn;intt inndexx = keyy mood PPrimme
26、lleveel;if( noodessinndexx = NUULL)noddesinddex = neww HaashNNodee();levvel = lleveel + 1;innserrt(nnodeesiindeex, leevell, kkey, vaaluee);五、查找找操作設需要查查找的關關鍵字為為keyy。用lleveel表示示插入進進行到第第幾層,levvel從從0開始始。Prrimee表為連連續(xù)質(zhì)數(shù)數(shù)表。插插入過程程從根節(jié)節(jié)點開始始執(zhí)行:如果當前前節(jié)點沒沒有被占占據(jù)(ooccuupieed = faalsee),則則執(zhí)行第第5步操操作。如果當前前節(jié)點已已經(jīng)被占占據(jù)(oo
27、ccuupieed = trrue),則讀讀取該節(jié)節(jié)點的關關鍵字,將它和和keyy進行比比較。如果相等等,則返返回查找找成功和和該節(jié)點點的vaaluee。如果不等等,則執(zhí)執(zhí)行第55步操作作。計算inndexx = keyy mood PPrimmelleveel。如果noodessinndexx = NUULL,那么則則返回查查找失敗敗。如果noodessinndexx為一一個子節(jié)節(jié)點那么么,將lleveel加11,然后后重復第第1步操操作。用偽碼來來表示如如下:Boolleann seearcch(HHashhNodde eentrry, intt leevell, KKey keyy, V
28、Valuue vvaluue)if(tthiss.occcuppiedd = truue)if(tthiss.keey = keey)valuue = thhis.vallue;retuurn truue;intt inndexx = keyy mood PPrimmelleveel;if( noodessinndexx = NUULL)reeturrn ffalsse;levvel = lleveel + 1;reeturrn ssearrch(noddesinddex, lleveel, keyy, vvaluue);六、刪除除操作設需要刪刪除的關關鍵字為為keyy。用lleveel表示示
29、插入進進行到第第幾層,levvel從從0開始始。Prrimee表為連連續(xù)質(zhì)數(shù)數(shù)表。插插入過程程從根節(jié)節(jié)點開始始執(zhí)行:如果當前前節(jié)點沒沒有被占占據(jù),則則執(zhí)行第第5步操操作。如果當前前節(jié)點被被占據(jù),則讀取取該節(jié)點點的關鍵鍵字,將將它和kkey進進行比較較。如果相等等,則設設置該節(jié)節(jié)點的占占用標記記為faalsee,并返返回刪除除操作成成功。如果不等等,則執(zhí)執(zhí)行第55步操作作。計算inndexx = keyy mood PPrimmelleveel。如果noodessinndexx = NUULL,那么則則返回刪刪除失敗敗。如果noodessinndexx為一一個子節(jié)節(jié)點那么么,將lleveel加1
30、1,然后后重復第第1步操操作。用偽碼來來表示如如下:Boolleann reemovve(HHashhNodde eentrry, intt leevell, KKey keyy)if(tthiss.occcuppiedd = truue)if(tthiss.keey = keey)thiss.occcuppiedd = fallse;retuurn truue;intt inndexx = keyy mood PPrimmelleveel;if( noodessinndexx = NUULL)reeturrn ffalsse;levvel = lleveel + 1;reeturrn rre
31、moove(noddesinddex, lleveel, keyy);七、哈希希樹的特特點7.1結結構簡單單從哈希希樹的結結構來說說,非常常的簡單單。每層層節(jié)點的的子節(jié)點點個數(shù)為為連續(xù)的的質(zhì)數(shù)。子節(jié)點點可以隨隨時創(chuàng)建建。因此此哈希樹樹的結構構是動態(tài)態(tài)的,也也不像某某些哈希希算法那那樣需要要長時間間的初始始化過程程。哈希希樹也沒沒有必要要為不存存在的關關鍵字提提前分配配空間。需要注注意的是是哈希樹樹是一個個單向增增加的結結構,即即隨著所所需要存存儲的數(shù)數(shù)據(jù)量增增加而增增大。即即使數(shù)據(jù)據(jù)量減少少到原來來的數(shù)量量,但是是哈希樹樹的總節(jié)節(jié)點數(shù)不不會減少少。這樣樣做的目目的是為為了避免免結構的的調(diào)整帶帶
32、來的額額外消耗耗。7.2操操作簡單單從上面所所講述的的操作過過程來說說是相當當簡單的的。程序序上特別別容易實實現(xiàn),比比起樹都都更容易易理解和和實現(xiàn)。作者是是通過實實際中的的應用,將數(shù)據(jù)據(jù)和代碼碼量減到到了最低低。這種種做法不不僅提高高了速度度,而且且編寫起起來更容容易些。7.3查查找迅速速從算法法過程我我們可以以看出,levvel最最多能增增加到110。因因此最多多只需要要十次取取余和比比較操作作,就可可以知道道這個對對象是否否存在。這個在在算法邏邏輯上決決定了哈哈希樹的的優(yōu)越性性。一般的樹樹狀結構構,往往往隨著層層次和層層次中節(jié)節(jié)點數(shù)的的增加而而導致更更多的比比較操作作。操作作次數(shù)可可以說無
33、無法準確確確定上上限。而而哈希樹樹的查找找次數(shù)和和元素個個數(shù)沒有有關系。如果元元素的連連續(xù)關鍵鍵字總個個數(shù)在計計算機的的整數(shù)(32bbit)所能表表達的最最大范圍圍內(nèi),那那么比較較次數(shù)就就最多不不會超過過10次次,通常常低于這這個數(shù)值值。7.4結結構不變變從刪除算算法中可可以看出出,哈希希樹在刪刪除的時時候,并并不做任任何結構構調(diào)整。這個也也是它的的一個非非常好的的優(yōu)點。常規(guī)樹樹結構在在增加元元素和刪刪除元素素的時候候都要做做一定的的結構調(diào)調(diào)整,否否則他們們將可能能退化為為鏈表結結構,而而導致查查找效率率的降低低。哈希希樹采取取的是一一種“見縫插插針”的算法法,從來來不用擔擔心退化化的問題題。
34、也不不必為優(yōu)優(yōu)化結構構而采取取額外的的操作,因為大大大節(jié)約約了操作作時間。7.5非非排序性性哈希樹樹不支持持排序,沒有順順序特性性。就好好比你可可以使用用sellectt * wheere id = 1123445的SSQL選選擇語句句,但是是不可以以使用sseleect * wwherre iid 1223455的SQQL語句句。如果果在此基基礎上不不做任何何改進的的話并試試圖通過過遍歷來來實現(xiàn)排排序,那那么操作作效率將將遠遠低低于其他他類型的的數(shù)據(jù)結結構。八、沖突突處理從定理11中我們們可以知知道,這這個定理理只保證證了個連連續(xù)的整整數(shù)是可可以被“分辨”的。如如果在使使用中,有兩個個整數(shù)之
35、之間的距距離超過過,那么么就可能能會出現(xiàn)現(xiàn)沖突。解決沖突突的辦法法有兩種種:一種種是主動動解決這這種沖突突,另外外一種是是被動的的。所謂主動動解決沖沖突,就就是我們們可以選選擇更大大的質(zhì)數(shù)數(shù)序列來來組織哈哈希樹,只到這這些質(zhì)數(shù)數(shù)的乘積積可以覆覆蓋所有有可能的的范圍。或者選選擇更多多的質(zhì)數(shù)數(shù),只到到他們的的乘積可可以覆蓋蓋所有可可能的范范圍。另外一個個方面如如果這種種沖突發(fā)發(fā)生的概概率很低低,那么么可以讓讓哈希樹樹被動適適應這種種變化。沖突對對哈希樹樹來說并并非不可可以被接接納。無無非是增增加了哈哈希樹的的層數(shù),或者說說增加了了所需要要比較和和取余的的次數(shù)。但是為為了容納納過多的的沖突將將會導致
36、致哈希樹樹的嚴重重退化,最終將將退化一一個鏈表表結構。這些能產(chǎn)產(chǎn)生沖突突的數(shù)值值之間的的距離必必須滿足足:因此任任何兩個個重復的的數(shù)之間間的距離離必須為為,而非非簡單成成倍關系系。即與與不會導導致哈希希樹的退退化。九、字符符串關鍵鍵字的處處理字符串串是由字字符組成成,字符符都具有有某種具具體的編編碼方式式。由這這種編碼碼方式最最終都可可以轉換換成字節(jié)節(jié)數(shù)組的的形式。因此我我們可以以簡單的的將字符符串看作作是2556進制制的數(shù)。例如:“abcc”可以轉轉換成字字節(jié)數(shù)組組0 x66162263,可以看看作是十十進制的的638821779。那么一一個200個字符符的字符符串將是是一個很很大的數(shù)數(shù)。我
37、們們不能簡簡單地使使用計算算機的整整數(shù)來做做除法,而是使使用程序序模擬人人工的除除法方式式來做除除法并獲獲得余數(shù)數(shù)。一個個簡單的的例子如如下:intt haash(Strringg sttrinng, intt prrimee)byyte bbytees = sttrinng.ggetBBytees();innt rresiiduaal = 0;foor(iint i = byytess.leengtth;ii 0;ii -)rresiiduaal = reesidduall * 2566 + byttesi 1resiiduaal = reesidduall mood pprimmeretuurn ressiduual;雖然多多做了幾幾次基本本的加、減、乘乘、除運運算。但但是因為為都是整整數(shù)計算算,對于于目前的的CPUU水平來來說,幾幾乎不算算什么難難事。而而且還可可以通過過移位運運算代替替乘法運運算,這這樣能更更快些。而且除除法的除除數(shù)和被被除數(shù)都都不會太太大,計計算起來來也不會會有太多多的CPPU消耗耗。在這種情情況下,數(shù)與數(shù)數(shù)之間的的距離,很容易易超過
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理變更公司合同范本
- 上海品質(zhì)營銷咨詢合同范本
- 公司租農(nóng)田合同范本
- 養(yǎng)兔場建設合同范本
- 第四章 光現(xiàn)象第4節(jié) 光的折射(教學設計)-2024-2025學年人教版八年級物理上冊
- 2024年中牧實業(yè)股份有限公司招聘筆試真題
- 業(yè)績獎勵合同范本
- 分期按揭合同范本
- 北京房屋租賃合同合同范本
- 2024年河南駐馬店幼兒師范高等??茖W校教師招聘考試真題
- 一年級下冊綜合實踐活動教案2
- 九年級主題班會課件:遇見最好的自己(開學第一課)
- 2025版股權投資基金股份收購與退出機制協(xié)議3篇
- 2025年棗莊科技職業(yè)學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 護苗行動安全教育課件
- 生物-山東省濰坊市、臨沂市2024-2025學年度2025屆高三上學期期末質(zhì)量檢測試題和答案
- 油品庫房管理規(guī)定(2篇)
- 2025年小學督導工作計劃
- 2024-2025學年部編版歷史九年級上冊期末復習練習題(含答案)
- 礦山工程安全培訓課件
- 基于ChatGPT的ESG評級體系實現(xiàn)機制研究
評論
0/150
提交評論