一種大數(shù)據(jù)索引的排序方法
【專利摘要】本發(fā)明公開(kāi)了一種大數(shù)據(jù)索引的排序方法,采用分治的思想按索引的關(guān)鍵字對(duì)索引數(shù)據(jù)進(jìn)行動(dòng)態(tài)地分區(qū)排序,對(duì)每個(gè)分區(qū)內(nèi)的索引數(shù)據(jù),采用類似于平衡二叉樹(shù)的方法組成一棵包括多個(gè)索引項(xiàng)的結(jié)點(diǎn)構(gòu)成的二叉排序樹(shù)。在讀入數(shù)據(jù)的同時(shí)進(jìn)行排序,每讀入一個(gè)索引項(xiàng),就按索引項(xiàng)關(guān)鍵字值放入相應(yīng)的區(qū)間進(jìn)行排序,數(shù)據(jù)讀入完成,排序也就完成了。讀完了數(shù)據(jù)只要按分區(qū)順序?qū)ο鄳?yīng)的二叉排序樹(shù)進(jìn)行中序遍歷就得到了排序結(jié)果。本發(fā)明在高配置的計(jì)算機(jī)系統(tǒng)上使用,充分發(fā)揮計(jì)算機(jī)的性能,更加符合大數(shù)據(jù)對(duì)算法復(fù)雜性的要求。本發(fā)明克服了傳統(tǒng)的內(nèi)排序算法不適合處理大數(shù)據(jù)的不足,采用本發(fā)明進(jìn)行索引排序有效提高了算法的效率。
【專利說(shuō)明】—種大數(shù)據(jù)索引的排序方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于大數(shù)據(jù)處理的【技術(shù)領(lǐng)域】,特別涉及一種大數(shù)據(jù)索引的排序方法。
【背景技術(shù)】
[0002]大數(shù)據(jù)來(lái)啦! Facebook分享的內(nèi)容條數(shù)達(dá)10億,數(shù)據(jù)量達(dá)到TB數(shù)量級(jí)。作為傳統(tǒng)數(shù)據(jù)處理的基本技術(shù),排序在大數(shù)據(jù)時(shí)代仍然是十分重要的一個(gè)基本操作,與此前不同的是大數(shù)據(jù)對(duì)包括排序算法在內(nèi)的所有算法的時(shí)間復(fù)雜性要求不再滿足于多項(xiàng)式時(shí)間復(fù)雜度,甚至像O (N* log N)這樣的所謂最優(yōu)的復(fù)雜度,它期望達(dá)到線性復(fù)雜度:O (N)。
[0003]現(xiàn)代計(jì)算機(jī)與50年前甚至10多年前的計(jì)算機(jī)相比已不可同日而語(yǔ),64位機(jī)器已相當(dāng)普遍,地址空間達(dá)到了 264,AMD64架構(gòu)支持52位(4PB)的地址總線和48位(256TB)的虛擬地址空間。DELL機(jī)器實(shí)際配置的物理內(nèi)存達(dá)96G,標(biāo)配硬盤容量到了 1.5TB,三級(jí)緩存也是20年前不可想象的12M。Linux系統(tǒng)的虛擬內(nèi)存可達(dá)實(shí)際物理內(nèi)存的2倍,而內(nèi)存頁(yè)面大小可為4M,64位的Linux則分別支持46位(64TB)的物理地址空間和47位(128T)的進(jìn)程虛擬地址空間,64位的windows7最大支持128G的內(nèi)存。不同平臺(tái)上64位的編譯器已經(jīng)很普遍,可以說(shuō)現(xiàn)代計(jì)算機(jī)的高性能和高配置為大數(shù)據(jù)處理帶來(lái)了方便。
[0004]但傳統(tǒng)的排序算法并不適合直接移植到現(xiàn)代計(jì)算機(jī)上來(lái)就可以處理大數(shù)據(jù)。
[0005]經(jīng)典排序算法包括插入排序、選擇排序、交換排序、歸并排序和分布排序等五個(gè)類型。插入排序、選擇排序、交換排序、歸并排序等這類比較排序都采用“比較”和“移動(dòng)”兩個(gè)基本操作,以順序存儲(chǔ)結(jié)構(gòu)存放待排序數(shù)據(jù)。插入排序在數(shù)據(jù)量很小時(shí)是高效的,但其時(shí)間復(fù)雜度達(dá)到了 O (N2)。樹(shù)形選擇排序利用前期的工作減少了后期的工作量,其中的堆排序被認(rèn)為是經(jīng)典排序算法中最好的,其時(shí)間復(fù)雜度達(dá)到了 O (N*峋N),但有比較大的常數(shù)因子。交換排序中的快速排序在最壞情況下的時(shí)間復(fù)雜度達(dá)到了 O (N2),因?yàn)樗沁f歸的,在數(shù)據(jù)量大的時(shí)候是不能容忍的。歸并排序盡管時(shí)間復(fù)雜度比較理想,但其空間復(fù)雜度達(dá)到了 O (N)。分布排序包括基數(shù)排序、計(jì)數(shù)排序和桶排序等這類所謂線性時(shí)間排序,也有其局限性?;鶖?shù)排序采用“分配”和“收集”兩個(gè)基本操作,按多關(guān)鍵字排序的思想,以每個(gè)關(guān)鍵字在其取值范圍內(nèi)的每個(gè)值組織一個(gè)鏈表來(lái)存儲(chǔ)數(shù)據(jù),它是針對(duì)關(guān)鍵字在一個(gè)較小范圍內(nèi)的排序算法。計(jì)數(shù)排序?qū)﹃P(guān)鍵字的取值范圍有限制,即最大元素值小于元素個(gè)數(shù),輔存空間大。桶排序是以假設(shè)關(guān)鍵字均勻分布為基礎(chǔ)。位圖算法的限制是排序數(shù)不能太大,數(shù)據(jù)無(wú)重復(fù),只能是整數(shù)或映射到整數(shù)的數(shù)據(jù)??傊@些經(jīng)典的排序算法都不能充分發(fā)揮現(xiàn)代計(jì)算機(jī)的性能,也不適合大數(shù)據(jù)環(huán)境。
[0006]以歸并為核心的外排序算法因?yàn)橐啻巫x、寫(xiě)文件也不適合于大數(shù)據(jù)環(huán)境。即使是在集群上運(yùn)行的PSRS這類超級(jí)快速并行排序算法,因?yàn)樨?fù)載均衡的難題、通信的瓶頸和不可避免的歸并等原因其加速效果也有限,原因是并行排序算法也需要合適的內(nèi)排序算法作基礎(chǔ)。在互聯(lián)網(wǎng)的今天,我們都在說(shuō):數(shù)據(jù)堆積、知識(shí)貧乏。信息檢索的重要性是不言而喻的,而索引在檢索中的重要性則是眾所周知,索引的排序是檢索的關(guān)鍵操作之一。
[0007]現(xiàn)有的排序算法無(wú)論是內(nèi)排序還是外排序抑或是并行排序一方面都沒(méi)有充分發(fā)揮現(xiàn)代計(jì)算機(jī)的性能,另一方面也難以滿足大數(shù)據(jù)處理的需要。不管將來(lái)的集群有多大,也不論“云”有多廣,大數(shù)據(jù)的排序,是大數(shù)據(jù)分析中的基礎(chǔ)工作。利用現(xiàn)代計(jì)算機(jī)的特點(diǎn)并充分地發(fā)揮它的性能,開(kāi)發(fā)在單機(jī)上運(yùn)行的大數(shù)據(jù)處理的排序算法有其必要性和現(xiàn)實(shí)性。
【發(fā)明內(nèi)容】
[0008]發(fā)明目的:本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種有效提高算法效率的大數(shù)據(jù)索引的排序方法。
[0009]技術(shù)方案:為了達(dá)到上述發(fā)明目的,本發(fā)明提供一種大數(shù)據(jù)索引的排序方法,包括以下步驟:
[0010]步驟1:根據(jù)索引關(guān)鍵字的取值范圍將索引初始劃分為Size/Alpha個(gè)區(qū)間,其中,Size=+為規(guī)模控制參數(shù),Alpha為分布密度差異系數(shù),N為索引項(xiàng)的總數(shù),同時(shí)根據(jù)索引
項(xiàng)的取值范圍和劃分的區(qū)間數(shù)平均設(shè)定每個(gè)區(qū)間索引關(guān)鍵字值的上限;
[0011]步驟2:根據(jù)步驟I中的每個(gè)區(qū)間索引關(guān)鍵字值的上限創(chuàng)建區(qū)間表,所述區(qū)間表管理區(qū)間的動(dòng)態(tài)劃分,每個(gè)區(qū)間內(nèi)索引項(xiàng)最多不超過(guò)Size個(gè),在每個(gè)區(qū)間內(nèi)建立一個(gè)用于存放區(qū)間內(nèi)索引項(xiàng)的二叉排序樹(shù),并設(shè)定二叉排序樹(shù)的索引項(xiàng)插入方法;這種存儲(chǔ)方案便于區(qū)間的均衡分裂,實(shí)現(xiàn)區(qū)間的動(dòng)態(tài)劃分;
[0012]步驟3:在每個(gè)二叉排序樹(shù)中的每個(gè)結(jié)點(diǎn)中設(shè)定一個(gè)索引項(xiàng)數(shù)組,并設(shè)定索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限以及索引項(xiàng)存儲(chǔ)的順序,所述索引項(xiàng)存儲(chǔ)的順序按索引項(xiàng)關(guān)鍵字從小到大的順序從左至右依次存儲(chǔ);這就提高了存儲(chǔ)密度,也減小了二叉排序樹(shù)的高度,對(duì)二叉排序樹(shù)的調(diào)整頻率遠(yuǎn)低于傳統(tǒng)的平衡二叉樹(shù)構(gòu)造過(guò)程中的調(diào)整頻度,有效地提高了排序的效率;
[0013]步驟4:讀取索引文件的數(shù)據(jù),根據(jù)索引項(xiàng)關(guān)鍵字的值在區(qū)間表中查詢區(qū)間,將讀取的索引項(xiàng)按照步驟2中設(shè)定的二叉排序樹(shù)的索引項(xiàng)插入方法插入到對(duì)應(yīng)區(qū)間的二叉排序樹(shù)上;
[0014]步驟5:按照區(qū)間的順序?qū)γ總€(gè)區(qū)間中相應(yīng)的二叉排序樹(shù)進(jìn)行中序遍歷,同時(shí)對(duì)每個(gè)結(jié)點(diǎn)中的索引項(xiàng)數(shù)組順序讀取,并將讀取的結(jié)果保存在排序文件中。
[0015]進(jìn)一步,所述二叉排序樹(shù)的索引項(xiàng)插入方法為:
[0016]步驟201:判斷查詢到的區(qū)間內(nèi)是否已滿,如果區(qū)間已滿,在查詢到的區(qū)間的右側(cè)創(chuàng)建一個(gè)新的區(qū)間,將原區(qū)間中的二叉排序樹(shù)的右子樹(shù)從原二叉排序樹(shù)中分裂出來(lái)并移至新的區(qū)間中,同時(shí)將原二叉排序樹(shù)的樹(shù)根移至其左子樹(shù)的右脊梁的末端,并根據(jù)平衡要求調(diào)整二叉排序樹(shù),這就實(shí)現(xiàn)了區(qū)間的均衡分裂,也就是進(jìn)行區(qū)間的動(dòng)態(tài)劃分;如果查找到的區(qū)間未滿,則進(jìn)行下一步操作;
[0017]步驟202:將讀取的索引項(xiàng)的索引關(guān)鍵字的值與二叉排序樹(shù)的樹(shù)根中存儲(chǔ)的索引關(guān)鍵字值進(jìn)行比較,如果讀取的索引項(xiàng)的索引關(guān)鍵字值比二叉排序樹(shù)的樹(shù)根中的索引項(xiàng)數(shù)組中最左端的索引關(guān)鍵字的值小,則將讀取的索引項(xiàng)遞歸地插入到二叉排序樹(shù)的左子樹(shù)中;相反,如果讀取的索引關(guān)鍵字值比二叉排序樹(shù)的樹(shù)根中的索引項(xiàng)數(shù)組中最右端的索引關(guān)鍵字的值大,則將讀取的索引項(xiàng)值遞歸地插入到二叉排序樹(shù)的右子樹(shù)中;如果讀取的索引關(guān)鍵字的值介于索引項(xiàng)數(shù)組中最左端的索引關(guān)鍵字的值和最右端的索引關(guān)鍵字的值之間,查看二叉排序樹(shù)的樹(shù)根中設(shè)置的索引項(xiàng)數(shù)組中存儲(chǔ)的數(shù)據(jù)是否已滿,如果未滿,則按照索引項(xiàng)存儲(chǔ)的順序?qū)⒆x取索引項(xiàng)插入到索引項(xiàng)數(shù)組中;如果已滿,則將二叉排序樹(shù)的樹(shù)根進(jìn)行結(jié)點(diǎn)分裂,產(chǎn)生一個(gè)新結(jié)點(diǎn),把索引項(xiàng)數(shù)組中左半邊索引項(xiàng)留在原結(jié)點(diǎn),右半邊索引項(xiàng)存儲(chǔ)到新結(jié)點(diǎn)中;如果左子樹(shù)中存儲(chǔ)的索引項(xiàng)數(shù)多于右子樹(shù)中存儲(chǔ)的索引項(xiàng)數(shù),則將新結(jié)點(diǎn)移至根的右子樹(shù)的左脊梁的末端,否則將原結(jié)點(diǎn)移至根的左子樹(shù)的右脊梁的末端。其中,將索引項(xiàng)數(shù)組中存儲(chǔ)的索引項(xiàng)從中間平均分成左右兩組,其中左邊的一組稱為索引項(xiàng)數(shù)組中左半邊索引項(xiàng),右邊一組稱為索引項(xiàng)數(shù)組中右半邊索引項(xiàng)。
[0018]更進(jìn)一步,所述步驟201中根據(jù)平衡要求調(diào)整二叉排序樹(shù)的方法為:如果二叉排序樹(shù)的左子樹(shù)上存儲(chǔ)的索引項(xiàng)的數(shù)量大于二叉排序樹(shù)的右子樹(shù)存儲(chǔ)的索引項(xiàng)的數(shù)量與兩倍的索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限之和,就將二叉排序樹(shù)的左子樹(shù)的右脊梁末端結(jié)點(diǎn)做二叉排序樹(shù)的根,將原根移至其右子樹(shù)的左脊梁的末端;如果二叉排序樹(shù)的的右子樹(shù)上存儲(chǔ)的索引項(xiàng)的數(shù)量大于二叉排序樹(shù)的左子樹(shù)存儲(chǔ)的索引項(xiàng)的數(shù)量與兩倍的索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限之和,就將二叉排序樹(shù)的右子樹(shù)的左脊梁末端結(jié)點(diǎn)做二叉排序樹(shù)的根,將原根移至其左子樹(shù)的右脊梁的末端。這就保證了二叉排序樹(shù)的有序性和平衡性。
[0019]工作原理:本發(fā)明采用分治的思想按索引的關(guān)鍵字對(duì)索引數(shù)據(jù)進(jìn)行動(dòng)態(tài)地分區(qū)排序,對(duì)每個(gè)分區(qū)內(nèi)的索引數(shù)據(jù),采用類似于平衡二叉樹(shù)的方法組成一棵由具有多關(guān)鍵字的結(jié)點(diǎn)構(gòu)成的二叉排序樹(shù)。在讀入數(shù)據(jù)的同時(shí)進(jìn)行排序,每讀入一個(gè)索引項(xiàng),就按索引項(xiàng)關(guān)鍵字值放入相應(yīng)的區(qū)間進(jìn)行排序,數(shù)據(jù)讀入完成,排序也就完成了,一次讀入即可完成排序。讀完了數(shù)據(jù)只要按分區(qū)順序?qū)ο鄳?yīng)的二叉排序樹(shù)進(jìn)行中序遍歷就得到了排序結(jié)果。
[0020]有益效果:與現(xiàn)有技術(shù)相比,本發(fā)明在高配置的計(jì)算機(jī)系統(tǒng)上使用,充分發(fā)揮計(jì)算機(jī)的性能,以分治的思想,結(jié)合順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)的優(yōu)點(diǎn),更加符合大數(shù)據(jù)算法復(fù)雜性要求。本發(fā)明克服了傳統(tǒng)的內(nèi)排序算法不適合處理大量數(shù)據(jù)的不足,也不必像一般的外排序算法那樣需要多次的文件讀、寫(xiě)。采用本發(fā)明進(jìn)行索引排序有效提高了算法的效率。本發(fā)明可以直接應(yīng)用到大型數(shù)據(jù)庫(kù)上,或者被互聯(lián)網(wǎng)大公司直接采用,在分布式環(huán)境下也可以作為一種高效的內(nèi)排序算法。
【專利附圖】
【附圖說(shuō)明】·
[0021]圖1為本發(fā)明的流程圖;
[0022]圖2為本發(fā)明中涉及的二叉排序樹(shù)的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0023]下面對(duì)本發(fā)明技術(shù)方案進(jìn)行詳細(xì)說(shuō)明,但是本發(fā)明的保護(hù)范圍不局限于所述實(shí)施例。
[0024]如圖1所示,本發(fā)明提供了一種大數(shù)據(jù)索引的排序方法,包括以下步驟:
[0025]步驟1:根據(jù)索引關(guān)鍵字的取值范圍將索引初始劃分為Size/Alpha個(gè)區(qū)間;其中,
Size為規(guī)??刂茀?shù),Size=^N,N是索引項(xiàng)的總數(shù),Alpha為索引項(xiàng)關(guān)鍵字的分布密度差
異系數(shù),對(duì)于均勻分布Alpha取值為I,正態(tài)分布Alpha取值可以為2~10。同時(shí)根據(jù)索引項(xiàng)的取值范圍和劃分的區(qū)間數(shù)平均設(shè)定每個(gè)區(qū)間索引關(guān)鍵字值的上限;
[0026]步驟2:構(gòu)造一個(gè)區(qū)間表來(lái)管理區(qū)間的劃分及排序工作,對(duì)每個(gè)區(qū)間構(gòu)造一個(gè)表項(xiàng),相應(yīng)每個(gè)區(qū)間有一個(gè)二叉排序樹(shù)存放具體的區(qū)間內(nèi)數(shù)據(jù)。這樣使得區(qū)間表可以常駐內(nèi)存,每棵二叉排序樹(shù)即使不能常駐內(nèi)存也由于其小于一個(gè)虛擬內(nèi)存的頁(yè)面大小而可以減少換入、換出的次數(shù),每個(gè)區(qū)間內(nèi)存儲(chǔ)的索引項(xiàng)的個(gè)數(shù)的最大值為Size ;
[0027]其中,二叉排序樹(shù)如圖2所示,圖中,A為整個(gè)二叉排序樹(shù)的樹(shù)根,結(jié)點(diǎn)B、D、E、H、I和J組成了 A的左子樹(shù),結(jié)點(diǎn)C、F、G、K、L和M組成了 A的右子樹(shù),結(jié)點(diǎn)A、B、D和H組成了二叉排序樹(shù)的左脊梁,結(jié)點(diǎn)B、E和J組成了 A的左子樹(shù)的右脊梁,結(jié)點(diǎn)C、F和K組成了 A的右子樹(shù)的左脊梁,結(jié)點(diǎn)J為A的左子樹(shù)的右脊梁的末端,結(jié)點(diǎn)K為A的右子樹(shù)的左脊梁的末端。
[0028]對(duì)于每個(gè)區(qū)間的排序則原則上按照二叉排序樹(shù)的思想來(lái)建構(gòu)一棵二叉排序樹(shù),這樣在區(qū)間分裂的時(shí)候就十分方便。無(wú)疑建構(gòu)平衡的二叉排序樹(shù)對(duì)于將區(qū)間平均一分為二是有益的,但鑒于傳統(tǒng)的平衡二叉樹(shù)存儲(chǔ)密度小,在建構(gòu)的過(guò)程中需要不停的對(duì)樹(shù)進(jìn)行局部調(diào)整,且在大數(shù)據(jù)的背景下其高度太大,本發(fā)明提供了一種新的結(jié)點(diǎn)結(jié)構(gòu),除了左、右子樹(shù)的指針域,每個(gè)結(jié)點(diǎn)中包括一個(gè)存儲(chǔ)多個(gè)索引項(xiàng)的索引項(xiàng)數(shù)組,也就是說(shuō)每個(gè)結(jié)點(diǎn)可以存儲(chǔ)多個(gè)索引項(xiàng)。
[0029]步驟3:在每個(gè)二叉排序樹(shù)中的每個(gè)結(jié)點(diǎn)中設(shè)定一個(gè)索引項(xiàng)數(shù)組,并設(shè)定索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限為Beta,以及索引項(xiàng)存儲(chǔ)的順序,其中,索引項(xiàng)存儲(chǔ)的順序按索引項(xiàng)關(guān)鍵字從小到大的順序從左至右依次存儲(chǔ);這樣可以提高存儲(chǔ)密度并減小樹(shù)的高度;因直接插入排序在數(shù)據(jù)量不超過(guò)20時(shí)效率最高,所以取Beta=20。
[0030]在算法運(yùn)行過(guò)程中要保持每個(gè)結(jié)點(diǎn)索引項(xiàng)數(shù)組中的數(shù)據(jù)有序,該有序性由傳統(tǒng)的直接插入排序來(lái)完成,并且其左、右子樹(shù)上的索引項(xiàng)數(shù)基本平衡,為保持左、右子樹(shù)的平衡,二叉排序樹(shù)也要做適當(dāng)?shù)恼{(diào)整,由于每個(gè)結(jié)點(diǎn)可存放多個(gè)數(shù)據(jù)項(xiàng),因此其調(diào)整的頻率遠(yuǎn)遠(yuǎn)低于傳統(tǒng)的平衡二叉樹(shù)構(gòu)造過(guò)程中的調(diào)整頻度。
[0031]步驟4:讀取索引文件的數(shù)據(jù),根據(jù)索引項(xiàng)關(guān)鍵字的值在區(qū)間表中查詢區(qū)間,將讀取的索引數(shù)據(jù)按照步驟2中設(shè)定的二叉排序樹(shù)的索引項(xiàng)插入方法插入到對(duì)應(yīng)區(qū)間的二叉排序樹(shù)上;其中,二叉排序樹(shù)的索引項(xiàng)插入方法為:
[0032]步驟201:判斷查詢到的區(qū)間內(nèi)是否已滿,如果區(qū)間已滿,在查詢到的區(qū)間的右側(cè)創(chuàng)建一個(gè)新的區(qū)間,將原區(qū)間中的二叉排序樹(shù)的右子樹(shù)從原二叉排序樹(shù)中分裂出來(lái)并移至新的區(qū)間中,同時(shí)將原二叉排序樹(shù)的樹(shù)根移至其左子樹(shù)的右脊梁的末端,并根據(jù)平衡要求調(diào)整二叉排序樹(shù);如果查找到的區(qū)間未滿,則進(jìn)行下一步操作;
[0033]其中,根據(jù)平衡要求調(diào)整二叉排序樹(shù)的方法為:如果二叉排序樹(shù)的左子樹(shù)上存儲(chǔ)的數(shù)據(jù)量大于二叉排序樹(shù)的右子樹(shù)存儲(chǔ)的數(shù)據(jù)量與兩倍的索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限之和,就將二叉排序樹(shù)的左子樹(shù)的右脊梁末端結(jié)點(diǎn)做二叉排序樹(shù)的根,將原根移至其右子樹(shù)的左脊梁的末端;如果二叉排序樹(shù)的的右子樹(shù)上存儲(chǔ)的數(shù)據(jù)量大于二叉排序樹(shù)的左子樹(shù)存儲(chǔ)的數(shù)據(jù)量與兩倍的索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限之和,就將二叉排序樹(shù)的右子樹(shù)的左脊梁末端結(jié)點(diǎn)做二叉排序樹(shù)的根,將原根移至其左子樹(shù)的右脊梁的末端。
[0034]步驟202:將讀取的索引項(xiàng)的索引關(guān)鍵字的值與二叉排序樹(shù)的樹(shù)根中存儲(chǔ)的索引關(guān)鍵字值進(jìn)行比較,如果讀取的索引項(xiàng)的索引關(guān)鍵字值比二叉排序樹(shù)的樹(shù)根中的索引項(xiàng)數(shù)組中最左端的索引關(guān)鍵字的值小,則將讀取的索引項(xiàng)遞歸地插入到二叉排序樹(shù)的左子樹(shù)中;相反,如果讀取的索引關(guān)鍵字值比二叉排序樹(shù)的樹(shù)根中的索引項(xiàng)數(shù)組中最右端的索引關(guān)鍵字的值大,則將讀取的索引項(xiàng)值遞歸地插入到二叉排序樹(shù)的右子樹(shù)中;如果讀取的索引關(guān)鍵字的值介于索引項(xiàng)數(shù)組中最左端的索引關(guān)鍵字的值和最右端的索引關(guān)鍵字的值之間,查看二叉排序樹(shù)的樹(shù)根中設(shè)置的索引項(xiàng)數(shù)組中存儲(chǔ)的數(shù)據(jù)是否已滿,如果未滿,則按照索引項(xiàng)存儲(chǔ)的順序?qū)⒆x取索引項(xiàng)插入到索引項(xiàng)數(shù)組中;如果已滿,則將二叉排序樹(shù)的樹(shù)根進(jìn)行結(jié)點(diǎn)分裂,產(chǎn)生一個(gè)新結(jié)點(diǎn),把索引項(xiàng)數(shù)組中左半邊索引項(xiàng)留在原結(jié)點(diǎn),右半邊索引項(xiàng)存儲(chǔ)到新結(jié)點(diǎn)中;如果左子樹(shù)中存儲(chǔ)的索引項(xiàng)數(shù)多于右子樹(shù)中存儲(chǔ)的索引項(xiàng)數(shù),則將新結(jié)點(diǎn)移至根的右子樹(shù)的左脊梁的末端,否則將原結(jié)點(diǎn)移至根的左子樹(shù)的右脊梁的末端。此種調(diào)整的目的是要保持一棵二叉樹(shù)上左、右子樹(shù)上的數(shù)據(jù)量基本相等,采用這種二叉排序樹(shù)調(diào)整方法能夠在最小的調(diào)整幅度下調(diào)整二叉排序樹(shù)。
[0035]步驟5:按照區(qū)間的順序?qū)γ總€(gè)區(qū)間中相應(yīng)的二叉排序樹(shù)進(jìn)行中序遍歷,同時(shí)對(duì)每個(gè)結(jié)點(diǎn)中的索引項(xiàng)數(shù)組順序讀取,并將讀取的結(jié)果保存到排序文件中。
[0036]對(duì)于未來(lái)增加的索引項(xiàng)只要按其關(guān)鍵字值運(yùn)用折半查找的方法放入相應(yīng)的區(qū)間排序即可,這樣就實(shí)現(xiàn)了增量式排序。
[0037]在本發(fā)明提供的方法中,在區(qū)間表搜索階段:除對(duì)
【權(quán)利要求】
1.一種大數(shù)據(jù)索引的排序方法,其特征在于:包括以下步驟: 步驟1:根據(jù)索引關(guān)鍵字的取值范圍將索引初始劃分為Size/Alpha個(gè)區(qū)間,其中,
2.根據(jù)權(quán)利要求1所述的一種大數(shù)據(jù)索引的排序方法,其特征在于:所述步驟2中二叉排序樹(shù)的索引項(xiàng)插入方法為: 步驟201:判斷查詢到的區(qū)間內(nèi)是否已滿,如果區(qū)間已滿,在查詢到的區(qū)間的右側(cè)創(chuàng)建一個(gè)新的區(qū)間,將原區(qū)間中的二叉排序樹(shù)的右子樹(shù)從原二叉排序樹(shù)中分裂出來(lái)并移至新的區(qū)間中,同時(shí)將原二叉排序樹(shù)的樹(shù)根移至其左子樹(shù)的右脊梁的末端,并根據(jù)平衡要求調(diào)整二叉排序樹(shù);如果查找到的區(qū)間未滿,則進(jìn)行下一步操作; 步驟202:將讀取的索引項(xiàng)的索引關(guān)鍵字的值與二叉排序樹(shù)的樹(shù)根中存儲(chǔ)的索引關(guān)鍵字值進(jìn)行比較,如果讀取的索引項(xiàng)的索引關(guān)鍵字值比二叉排序樹(shù)的樹(shù)根中的索引項(xiàng)數(shù)組中最左端的索引關(guān)鍵字的值小,則將讀取的索引項(xiàng)遞歸地插入到二叉排序樹(shù)的左子樹(shù)中;相反,如果讀取的索引關(guān)鍵字值比二叉排序樹(shù)的樹(shù)根中的索引項(xiàng)數(shù)組中最右端的索引關(guān)鍵字的值大,則將讀取的索引項(xiàng)值遞歸地插入到二叉排序樹(shù)的右子樹(shù)中;如果讀取的索引關(guān)鍵字的值介于索引項(xiàng)數(shù)組中最左端的索引關(guān)鍵字的值和最右端的索引關(guān)鍵字的值之間,查看二叉排序樹(shù)的樹(shù)根中設(shè)置的索引項(xiàng)數(shù)組中存儲(chǔ)的數(shù)據(jù)是否已滿,如果未滿,則按照索引項(xiàng)存儲(chǔ)的順序?qū)⒆x取索引項(xiàng)插入到索引項(xiàng)數(shù)組中;如果已滿,則將二叉排序樹(shù)的樹(shù)根進(jìn)行結(jié)點(diǎn)分裂,產(chǎn)生一個(gè)新結(jié)點(diǎn),把索引項(xiàng)數(shù)組中左半邊索引項(xiàng)留在原結(jié)點(diǎn),右半邊索引項(xiàng)存儲(chǔ)到新結(jié)點(diǎn)中;如果左子樹(shù)中存儲(chǔ)的索引項(xiàng)數(shù)多于右子樹(shù)中存儲(chǔ)的索引項(xiàng)數(shù),則將新結(jié)點(diǎn)移至根的右子樹(shù)的左脊梁的末端,否則將原結(jié)點(diǎn)移至根的左子樹(shù)的右脊梁的末端。
3.根據(jù)權(quán)利要求2所述的一種大數(shù)據(jù)索引的排序方法,其特征在于:所述步驟201中根據(jù)平衡要求調(diào)整二叉排序樹(shù)的方法為:如果二叉排序樹(shù)的左子樹(shù)上存儲(chǔ)的索引項(xiàng)的數(shù)量大于二叉排序樹(shù)的右子樹(shù)存儲(chǔ)的索引項(xiàng)的數(shù)量與兩倍的索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限之和,就將二叉排序樹(shù)的左子樹(shù)的右脊梁末端結(jié)點(diǎn)做二叉排序樹(shù)的根,將原根移至其右子樹(shù)的左脊梁的末端;如果二叉排序樹(shù)的的右子樹(shù)上存儲(chǔ)的索引項(xiàng)的數(shù)量大于二叉排序樹(shù)的左子樹(shù)存儲(chǔ)的索引項(xiàng)的數(shù)量與兩倍的索引項(xiàng)數(shù)組中存儲(chǔ)索引項(xiàng)的上限之和,就將二叉排序樹(shù)的右子樹(shù)的 左脊梁末端結(jié)點(diǎn)做二叉排序樹(shù)的根,將原根移至其左子樹(shù)的右脊梁的末端。
【文檔編號(hào)】G06F17/30GK103745008SQ201410040926
【公開(kāi)日】2014年4月23日 申請(qǐng)日期:2014年1月28日 優(yōu)先權(quán)日:2014年1月28日
【發(fā)明者】石冰, 韓立新 申請(qǐng)人:河海大學(xué)