專利名稱:一種數(shù)據(jù)結(jié)構(gòu)的構(gòu)造和存儲方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)結(jié)構(gòu)技術(shù),尤其涉及一種數(shù)據(jù)結(jié)構(gòu)的構(gòu)造和存儲方法。
背景技術(shù):
現(xiàn)實(shí)中,很多數(shù)據(jù)的邏輯結(jié)構(gòu)呈樹狀或網(wǎng)狀。樹狀結(jié)構(gòu)中,元素之間存在一對多關(guān)系,網(wǎng)狀結(jié)構(gòu)中,元素之間存在多對多關(guān)系。比如,將信息進(jìn)行分類就是一種典型的樹狀結(jié)構(gòu),每細(xì)分一次,就增加一級樹的節(jié)點(diǎn),樹狀結(jié)構(gòu)中,所有節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù)只有I個(gè)。網(wǎng)狀結(jié)構(gòu)在現(xiàn)實(shí)中的最典型表現(xiàn)是社會(huì)中人與人之間的關(guān)系,這種關(guān)系不是按樹的結(jié)構(gòu)進(jìn)行層級劃分,而是錯(cuò)綜復(fù)雜的,網(wǎng)狀結(jié)構(gòu)中,所有節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù)是0個(gè)或多個(gè)。通常來說,固定知識的結(jié)構(gòu)在某一個(gè)時(shí)間段T內(nèi)不變(知識節(jié)點(diǎn)總數(shù)為N),而允許知識節(jié)點(diǎn)的信息在時(shí)間段T是實(shí)時(shí)變化。在很多具體應(yīng)用中,知識的結(jié)構(gòu)的變化是可以接受延遲的,而知識的信息是需要時(shí)刻更新的。比如分類信息網(wǎng)站58同城的二手手機(jī)分類,定義的手機(jī)品牌有若干種,品牌又細(xì)分了若干種型號。手機(jī)品牌和型號就形成了一個(gè)典型的樹狀知識結(jié)構(gòu)。通常維護(hù)人員每個(gè)月添加幾個(gè)手機(jī)品牌。而這些品牌/型號時(shí)刻都有相關(guān)的發(fā)布和瀏覽。所以品牌/型號的當(dāng)前發(fā)帖量及瀏覽量是時(shí)刻變化的。對于樹狀或網(wǎng)狀結(jié)構(gòu),各節(jié)點(diǎn)所含的信息分為靜態(tài)信息和動(dòng)態(tài)信息。靜態(tài)信息在特定時(shí)間段內(nèi)是固定不變的,比如某個(gè)手機(jī)型號的“名稱”,“上市時(shí)間”。而動(dòng)態(tài)信息會(huì)實(shí)時(shí)變化,動(dòng)態(tài)信息又可以分為動(dòng)態(tài)傳入信息和動(dòng)態(tài)計(jì)算信息。動(dòng)態(tài)傳入信息的變化是從外部系統(tǒng)獲得的。比如有個(gè)系統(tǒng)專門提供手機(jī)型號的當(dāng)日發(fā)帖量。動(dòng)態(tài)計(jì)算信息的變化是需要本系統(tǒng)計(jì)算的。比如本系統(tǒng)要累計(jì)所有手機(jī)品牌的當(dāng)日發(fā)帖量,然后從中找到當(dāng)日發(fā)帖量最大的品牌。 參照圖1,為常規(guī)樹狀結(jié)構(gòu)的節(jié)點(diǎn)示意圖。圖中有5個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)具有三個(gè)信息字段name、dynamic_value、result。name字段表示節(jié)點(diǎn)名稱,其是固定的不隨時(shí)間而改變,屬于靜態(tài)信息。dynamic_value表示動(dòng)態(tài)變化的數(shù)值,result為基于動(dòng)態(tài)變化數(shù)值計(jì)算的結(jié)果。dynamic_value和result都是隨時(shí)變化的,屬于動(dòng)態(tài)信息。現(xiàn)有技術(shù)中,采用樹狀結(jié)構(gòu)或網(wǎng)狀結(jié)構(gòu)存儲各類數(shù)據(jù)并表示數(shù)據(jù)之間的相互關(guān)系時(shí),存在三種方案方案一,每次計(jì)算時(shí),臨時(shí)構(gòu)造數(shù)據(jù)結(jié)構(gòu),然后在數(shù)據(jù)結(jié)構(gòu)上計(jì)算,獲得輸出結(jié)果;方案二,預(yù)先構(gòu)造好一份數(shù)據(jù)結(jié)構(gòu),每次計(jì)算時(shí),清空節(jié)點(diǎn)的動(dòng)態(tài)傳入信息,動(dòng)態(tài)計(jì)算信息,然后在數(shù)據(jù)結(jié)構(gòu)上計(jì)算,獲得輸出結(jié)果;方案三,預(yù)先構(gòu)造好多份數(shù)據(jù)結(jié)構(gòu),作為多個(gè)線程之間的共享資源池,每次計(jì)算時(shí),清空節(jié)點(diǎn)的動(dòng)態(tài)傳入信息,動(dòng)態(tài)計(jì)算信息,然后在數(shù)據(jù)結(jié)構(gòu)上計(jì)算,獲得輸出結(jié)果。就方案一而言,每次計(jì)算都要構(gòu)造數(shù)據(jù)結(jié)構(gòu),帶來申請內(nèi)存空間和構(gòu)造樹兩方面的時(shí)間開銷,并且當(dāng)有多個(gè)線程都要用同一數(shù)據(jù)結(jié)構(gòu)時(shí),需要為每個(gè)線程都臨時(shí)構(gòu)造一個(gè)數(shù)據(jù)結(jié)構(gòu),從而帶來存儲多份數(shù)據(jù)結(jié)構(gòu)的內(nèi)存開銷;就方案二而言,雖然只要構(gòu)造一次數(shù)據(jù)結(jié)構(gòu),但是同一份數(shù)據(jù)結(jié)構(gòu)不能用于多個(gè)線程的并發(fā)計(jì)算,而且查找樹的時(shí)間開銷較大;就方案三而言,雖然可以用于多個(gè)線程的并發(fā)計(jì)算,但是會(huì)帶來固定存儲多份數(shù)據(jù)結(jié)構(gòu)的內(nèi)存開銷。
上述現(xiàn)有技術(shù)的對于二叉樹來說,查找節(jié)點(diǎn)的時(shí)間開銷都是O(IogN),N為節(jié)點(diǎn)的總數(shù)。也就是說,查找節(jié)點(diǎn)的時(shí)間隨節(jié)點(diǎn)數(shù)目增加成對數(shù)增長。因此,現(xiàn)有技術(shù)的分級數(shù)據(jù)結(jié)構(gòu)的構(gòu)造和存儲方法在存儲空間和查找時(shí)間方面的開銷均比較大。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種有效降低數(shù)據(jù)操作的空間復(fù)雜度和時(shí)間復(fù)雜度的方法,并適用于所有呈樹狀或網(wǎng)狀的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)構(gòu)造和存儲方法。根據(jù)本發(fā)明的一個(gè)方面,提供了一種數(shù)據(jù)結(jié)構(gòu)的構(gòu)造和存儲方法,包括對數(shù)據(jù)結(jié)構(gòu)中的各個(gè)節(jié)點(diǎn)進(jìn)行編號; 設(shè)置至少一個(gè)關(guān)系數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的上下級關(guān)系信息;設(shè)置至少一個(gè)動(dòng)態(tài)數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的動(dòng)態(tài)信息字段;以及設(shè)置至少一個(gè)靜態(tài)數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的靜態(tài)信息字段。與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)I)降低了數(shù)據(jù)操作的時(shí)間復(fù)雜度和空間復(fù)雜度;2)基于本發(fā)明提供的方法,可以提供高性能的數(shù)據(jù)服務(wù)。
通過閱讀參照以下附圖所作的對非限制性實(shí)施例所作的詳細(xì)描述,本發(fā)明的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯圖I為根據(jù)現(xiàn)有技術(shù)的樹狀結(jié)構(gòu)的節(jié)點(diǎn)示意圖;圖2為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的數(shù)據(jù)結(jié)構(gòu)構(gòu)造和存儲的方法流程圖;以及圖3為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的數(shù)據(jù)結(jié)構(gòu)構(gòu)造和存儲的示意圖。
具體實(shí)施例方式下面結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)描述。根據(jù)本發(fā)明的一個(gè)方面,提供了一種數(shù)據(jù)結(jié)構(gòu)構(gòu)造和存儲的方法。請參考圖2,圖2為根據(jù)本發(fā)明一個(gè)優(yōu)選實(shí)施例的數(shù)據(jù)結(jié)構(gòu)構(gòu)造和存儲的方法流程圖。如圖2所示,根據(jù)本發(fā)明的數(shù)據(jù)結(jié)構(gòu)構(gòu)造和存儲的方法包括如下步驟201,首先對分級數(shù)據(jù)結(jié)構(gòu)中的各個(gè)節(jié)點(diǎn)編號,每個(gè)節(jié)點(diǎn)具有唯一的編號。進(jìn)行編號的步驟可以包括對分級數(shù)據(jù)結(jié)構(gòu)設(shè)定遍歷的順序,根據(jù)遍歷的順序?qū)?shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)依次編號。設(shè)節(jié)點(diǎn)的總數(shù)為N,則編號的范圍為0 N-1。具體地,分級數(shù)據(jù)結(jié)構(gòu)包括但不限定樹狀、網(wǎng)狀的具有父子關(guān)系的數(shù)據(jù)結(jié)構(gòu),在分級數(shù)據(jù)結(jié)構(gòu)中,除部分特殊的節(jié)點(diǎn)(如樹狀結(jié)構(gòu)中,根節(jié)點(diǎn)沒有父親節(jié)點(diǎn))外,各節(jié)點(diǎn)通常具有上級節(jié)點(diǎn)和下級節(jié)點(diǎn)。在數(shù)據(jù)結(jié)構(gòu)中,遍歷是一種很重要的計(jì)算,通過特定的搜索方式,對數(shù)據(jù)結(jié)構(gòu)中的每個(gè)節(jié)點(diǎn)做一次且僅做一次訪問。遍歷分為前序遍歷、中序遍歷和后續(xù)遍歷。優(yōu)選地,設(shè)遍歷的順序?yàn)橄刃虮闅v,根據(jù)遍歷的順序?qū)⒎旨墧?shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)依次編號。設(shè)分級數(shù)據(jù)結(jié)構(gòu)中節(jié)點(diǎn)的總數(shù)為N,那么,節(jié)點(diǎn)編號的范圍,為0 N-1。如圖3所示,圖3的左邊所示的是一個(gè)樹狀的數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)中節(jié)點(diǎn)的總數(shù)為6,根據(jù)先序遍歷,依次訪問A、B、Cl、C2、C3、D節(jié)點(diǎn),那么按照訪問的順序,依次對這6個(gè)節(jié)點(diǎn)編號,編號的范圍為0 5,如首先訪問的節(jié)點(diǎn)A對應(yīng)的編號為O,最后訪問的節(jié)點(diǎn)D對應(yīng)的編號為5。由于數(shù)據(jù)結(jié)構(gòu)中節(jié)點(diǎn)的個(gè)數(shù)以及它們之間的關(guān)系是相對固定的,因此做完一次遍歷操作后每個(gè)節(jié)點(diǎn)的編號都可以確定下來,并且在一段時(shí)間內(nèi)保持不變。
在確定和存儲節(jié)點(diǎn)編號之后,下面需要確定和存儲具有編號的節(jié)點(diǎn)之間的相互關(guān)系或?qū)蛹夑P(guān)系。步驟202,至少用一個(gè)一維數(shù)組表示每個(gè)節(jié)點(diǎn)的上級關(guān)系,根據(jù)特定的順序,存儲相應(yīng)的數(shù)據(jù)。具體地,分級數(shù)據(jù)結(jié)構(gòu)中,節(jié)點(diǎn)的上級關(guān)系包括每個(gè)節(jié)點(diǎn)所擁有的上級節(jié)點(diǎn)數(shù)和上級節(jié)點(diǎn)的編號。對于不同數(shù)據(jù)結(jié)構(gòu)中節(jié)點(diǎn)的上級關(guān)系,用數(shù)組來表示時(shí),所用的數(shù)組的數(shù)量是不同的。就樹狀結(jié)構(gòu)而言,除根節(jié)點(diǎn)外,每個(gè)節(jié)點(diǎn)有且只有一個(gè)上級節(jié)點(diǎn),因此,可以只用一個(gè)一維數(shù)組來表示每個(gè)節(jié)點(diǎn)的上級關(guān)系,按照節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號依次存入所述數(shù)組中,其中,所述數(shù)組的長度為節(jié)點(diǎn)的總數(shù),即N。參照圖3,樹狀數(shù)據(jù)結(jié)構(gòu)的節(jié)點(diǎn)數(shù)為6,按照先序遍歷,各節(jié)點(diǎn)的編號依次為(T5,構(gòu)造一個(gè)數(shù)組長度為6的數(shù)組,按照節(jié)點(diǎn)編號的順序,依次將6個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號存入所述數(shù)組中,如編號為0的節(jié)點(diǎn),其上級節(jié)點(diǎn)不存在,則將所述數(shù)組的第一個(gè)元素置為-1,如編號為5的節(jié)點(diǎn),其上級節(jié)點(diǎn)的編號為0,則將所述數(shù)組的第六個(gè)元素的值置為0,依次類推,將各節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號依次存入到該數(shù)組中。就網(wǎng)狀結(jié)構(gòu)而言,每個(gè)節(jié)點(diǎn)可能有多個(gè)上級節(jié)點(diǎn)(樹狀結(jié)構(gòu)可以認(rèn)為是一種特殊的網(wǎng)狀結(jié)構(gòu))如上文所述,設(shè)定遍歷的順序,依據(jù)遍歷的順序?qū)Ω鞴?jié)點(diǎn)進(jìn)行編號,節(jié)點(diǎn)的總數(shù)為N,編號的范圍為(TN-1,至少用三個(gè)一維數(shù)組表示每個(gè)節(jié)點(diǎn)的上級關(guān)系,為了各節(jié)點(diǎn)上級關(guān)系的表示更加明確,可以構(gòu)造用以表示節(jié)點(diǎn)的上級關(guān)系的數(shù)組。本實(shí)施例以三個(gè)一維數(shù)組為例,分別命名為 ParentNum 數(shù)組、ParentSeg 和 ParentSegStartIndex。首先,計(jì)算每個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù),根據(jù)節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù)依次存入ParentNum數(shù)組,即ParentNum數(shù)組中每個(gè)數(shù)組元素的值為各節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù),此處所述的上級節(jié)點(diǎn)數(shù)為該節(jié)點(diǎn)的上級節(jié)點(diǎn)的數(shù)目,由于需要記錄N個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù),所以ParentNum數(shù)組的長度為N。存儲每個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù)后,由于網(wǎng)狀結(jié)構(gòu)比樹狀結(jié)構(gòu)復(fù)雜,每個(gè)節(jié)點(diǎn)的上級關(guān)系復(fù)雜,為了明確各節(jié)點(diǎn)的上級節(jié)點(diǎn)編號,需要構(gòu)造數(shù)組,順序存儲各節(jié)點(diǎn)的上級節(jié)點(diǎn)編號。設(shè)所構(gòu)造的數(shù)組名為ParentSeg,根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的所有上級節(jié)點(diǎn)的編號分段存入ParentSeg數(shù)組,其中,所述段的數(shù)量等于具有上級節(jié)點(diǎn)的節(jié)點(diǎn)的數(shù)量,所述ParentSeg數(shù)組的長度為ParentNum數(shù)組中所有元素值的總和,也就是每個(gè)段中存入每個(gè)節(jié)點(diǎn)的所有上級節(jié)點(diǎn)的編號。對于沒有上級節(jié)點(diǎn)的節(jié)點(diǎn),由于其上級節(jié)點(diǎn)的數(shù)為0,不存在上級節(jié)點(diǎn)的編號,因此,該節(jié)點(diǎn)沒有對應(yīng)的內(nèi)容存入ParentSeg數(shù)組段中,可以用數(shù)值_1表示該節(jié)點(diǎn)沒有上級節(jié)點(diǎn),或者直接置空NULL。為了更快更好地在ParentSeg數(shù)組中查找各節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號,需要建立一個(gè)類似索引的數(shù)據(jù)結(jié)構(gòu),于是,構(gòu)造一個(gè)長度為N的ParentSegStartIndex數(shù)組,更好地查找各節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號,其中,ParentSegStartIndex數(shù)組元素的值為ParentSeg數(shù)組中各段的下標(biāo)值。例如,設(shè)節(jié)點(diǎn)的總數(shù)為N,各節(jié)點(diǎn)的上節(jié)點(diǎn)的數(shù)量已經(jīng)計(jì)算好,并且已經(jīng)將該計(jì)算好的數(shù)值存入ParentNum數(shù)組中,構(gòu)造整數(shù)變量index和i,其中,i的范圍從O、,對index賦初值O,按照特定的順序依次遍歷編號為(TN-I的節(jié)點(diǎn),對編號為i的節(jié)點(diǎn),如果ParentNum[i]的值為0,也就是該節(jié)點(diǎn)沒有上級節(jié)點(diǎn),則在ParentSeg數(shù)組中不存入該節(jié)點(diǎn)對應(yīng)的任何內(nèi)容,并將ParentSegStartIndex[i]的值置為_1,否則I)置 ParentSegStartIndex[i]=index ;2) ParentSeg[index]至 ParentSeg[index+ParentNum[i]-I]依次存儲編號為 i 的節(jié)點(diǎn)的所有上級節(jié)點(diǎn)的編號;3)index=ParentNum[i]+index。按照上述遍歷的順序,依次計(jì)算各節(jié)點(diǎn)對應(yīng)的ParentSeg數(shù)組元素的值和·ParentSegStartIndex 數(shù)組元素的值。如圖3所示,雖然圖3的數(shù)據(jù)結(jié)構(gòu)是樹形結(jié)構(gòu),也可以按照上述方法進(jìn)行記錄,可以獲得如下三個(gè)一維數(shù)組ParentNum 數(shù)組PN
=0、PN [I] =1、PN [2] =2、PN [3] =2、PN [4] =2、PN [5] =1ParentNum數(shù)組表示第i個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的數(shù)目。例如,PN
=0表示編號為0的節(jié)點(diǎn)A的上級節(jié)點(diǎn)的數(shù)目為0 ;PN[3]=2表示編號為3的節(jié)點(diǎn)C2的上級節(jié)點(diǎn)的數(shù)目為2,即節(jié)點(diǎn)B和A ;ParentSeg 數(shù)組PS
=-1 ;PS[1]=0 ;PS[2]=1、PS[3] =0 ;PS[4]=1、PS[5] =0 ;PS [6] =1、PS [7] =0 ;PS[8]=0ParentSeg數(shù)組分段表示第i個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號。在圖3中除了最頂端節(jié)點(diǎn)之外,每個(gè)節(jié)點(diǎn)有一個(gè)或兩個(gè)上級節(jié)點(diǎn),因此每個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號為一個(gè)或兩個(gè)。例如,PS
=-1表示編號0的節(jié)點(diǎn)沒有上級節(jié)點(diǎn),PS[1]=0表示編號為I的節(jié)點(diǎn)的上級節(jié)點(diǎn)是編號為0的節(jié)點(diǎn),PS[2] =1、PS[3] =0表示編號為2的上級節(jié)點(diǎn)是編號為I和0的節(jié)點(diǎn),如
i^-L -rf- -rf- oParentSegStartIndex 數(shù)組PI
=0、PI [I] =1、PI [2] =2、PI [3] =4、PI [4] =6、PI[5]=8ParentSegStartIndex表示ParentSeg數(shù)組中每個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的分段開始的索引。例如,PI
=0表示ParentSeg數(shù)組中的編號0的節(jié)點(diǎn)的上級節(jié)點(diǎn)段的開始索引為0,即PS
為編號0的節(jié)點(diǎn)的上級節(jié)點(diǎn)段。每個(gè)節(jié)點(diǎn)可以有多個(gè)上級節(jié)點(diǎn),并且每個(gè)節(jié)點(diǎn)的上級的編號在ParentSeg數(shù)組中是以分段的方式連續(xù)排列的,因此需要數(shù)組ParentSegStartIndex[i]來表示第i個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)段的開始位置,也就是說,在ParentSeg 數(shù)組中 ParentSegStartIndex [i]至 ParentSegStartIndex [i+1]-I 之間的序列是第i個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號集合。PI[3]=4、PI[4]=6表示編號為3的節(jié)點(diǎn)的上級節(jié)點(diǎn)段在ParentSeg數(shù)組中為數(shù)組下標(biāo)為4和5的數(shù)組表示的值,即PS [4] =1、PS [5] =0。這樣可以通過三個(gè)一維數(shù)組來存儲和描述節(jié)點(diǎn)之間的上級關(guān)系。步驟203,用至少一個(gè)一維數(shù)組表示每個(gè)節(jié)點(diǎn)的下級關(guān)系,根據(jù)特定的順序,存儲相應(yīng)的數(shù)據(jù)。具體地,分級數(shù)據(jù)結(jié)構(gòu)中,節(jié)點(diǎn)的下級關(guān)系包括每個(gè)節(jié)點(diǎn)所擁有的下級節(jié)點(diǎn)數(shù)和下級節(jié)點(diǎn)的編號。對于不同數(shù)據(jù)結(jié)構(gòu)中節(jié)點(diǎn)的下級關(guān)系,用數(shù)組來表示時(shí),所用的數(shù)組的數(shù)量是不同的。就樹狀結(jié)構(gòu)而言,除最深層次的節(jié)點(diǎn)外,每個(gè)節(jié)點(diǎn)通常有一個(gè)或多個(gè)下級節(jié)點(diǎn),由于根據(jù)每個(gè)節(jié)點(diǎn)的編號及對應(yīng)的下級節(jié)點(diǎn)的數(shù)量,就可以算出每個(gè)節(jié)點(diǎn)對應(yīng)的所有下級節(jié)點(diǎn)的編號。因此,可以只用一個(gè)一維數(shù)組來表示每個(gè)節(jié)點(diǎn)的下級關(guān)系,按照節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)依次存入所述數(shù)組中,其中,所述數(shù)組的長度為節(jié)點(diǎn)的總數(shù),即N。如對于編號為i的下級節(jié)點(diǎn),其下級節(jié)點(diǎn)數(shù)為m (m>0),假設(shè)對節(jié)點(diǎn)進(jìn)行編號的步驟是按照先序遍歷規(guī)則進(jìn)行依次編號的 ,則該節(jié)點(diǎn)i的下級節(jié)點(diǎn)是編號為i之后的m個(gè)節(jié)點(diǎn),即,節(jié)點(diǎn)i的下級節(jié)點(diǎn)編號的集合是U+1,…,i+m}。因此為了描述和存儲節(jié)點(diǎn)i的下級節(jié)點(diǎn),不需要直接存儲其下級節(jié)點(diǎn)的編號,而是存儲其下級節(jié)點(diǎn)的數(shù)目即可計(jì)算出其下級節(jié)點(diǎn)的編號。參照圖3,樹狀數(shù)據(jù)結(jié)構(gòu)的節(jié)點(diǎn)數(shù)為6,按照先序遍歷,各節(jié)點(diǎn)的編號依次為(T5,構(gòu)造一個(gè)數(shù)組長度為6的數(shù)組,按照節(jié)點(diǎn)編號的順序,依次將6個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)存入所述數(shù)組中,如編號為0的節(jié)點(diǎn),其有5個(gè)下級節(jié)點(diǎn),則將所述數(shù)組的第一個(gè)元素置為5,如編號為5的節(jié)點(diǎn),其下級節(jié)點(diǎn)數(shù)為0,則將所述數(shù)組的第六個(gè)元素的值置為0,依次類推,將各節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)依次存入到該數(shù)組中。就網(wǎng)狀結(jié)構(gòu)而言,其不同于樹狀結(jié)構(gòu),每個(gè)節(jié)點(diǎn)的下級關(guān)系更加復(fù)雜,如上文所述,設(shè)定遍歷的順序,依據(jù)遍歷的順序?qū)Ω鞴?jié)點(diǎn)進(jìn)行編號,節(jié)點(diǎn)的總數(shù)為N,編號的范圍為(TN-1,至少用三個(gè)一維數(shù)組表示每個(gè)節(jié)點(diǎn)的下級關(guān)系,為了各節(jié)點(diǎn)下級關(guān)系的表示更加明確,可以構(gòu)造用以表示節(jié)點(diǎn)的下級關(guān)系的數(shù)組。本實(shí)施例以三個(gè)一維數(shù)組為例,分別命名為ChildNum 數(shù)組、ChildSeg 和 ChildSegStartlndex。首先,計(jì)算每個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù),根據(jù)節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)依次存入ChildNum數(shù)組,即ChildNum數(shù)組中,每個(gè)數(shù)組元素的值為各節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù),由于需要記錄N個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù),所以ChildNum數(shù)組的長度為N。存儲每個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)后,為了明確各節(jié)點(diǎn)的下級節(jié)點(diǎn)編號,需要構(gòu)造數(shù)組,順序存儲各節(jié)點(diǎn)的下級節(jié)點(diǎn)編號。設(shè)所構(gòu)造的數(shù)組名為ChildSeg,根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的所有下級節(jié)點(diǎn)的編號分段存入ChildSeg數(shù)組,其中,所述段的數(shù)量等于具有下級節(jié)點(diǎn)的節(jié)點(diǎn)的數(shù)量,所述Chi IdSeg數(shù)組的長度為Chi IdNum數(shù)組中所有元素值的總和,也就是每個(gè)段中存入每個(gè)節(jié)點(diǎn)的所有下級節(jié)點(diǎn)的編號。對于沒有下級節(jié)點(diǎn)的節(jié)點(diǎn),由于其下級節(jié)點(diǎn)的數(shù)為0,不存在下級節(jié)點(diǎn)的編號,因此,該節(jié)點(diǎn)沒有對應(yīng)的內(nèi)容存入Chi I dSeg數(shù)組。為了更快地在ChildSeg數(shù)組中查找各節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號,需要建立一個(gè)類似索引的數(shù)據(jù)結(jié)構(gòu),于是,構(gòu)造一個(gè)長度為N的ChildSegStartlndex數(shù)組,更好地查找各節(jié)點(diǎn)的下級節(jié)點(diǎn)的編號,其中,ChildSegStartlndex數(shù)組元素的值為ChildSeg數(shù)組中各段的下標(biāo)值。例如,設(shè)節(jié)點(diǎn)的總數(shù)為N,各節(jié)點(diǎn)的下級節(jié)點(diǎn)的數(shù)量已經(jīng)計(jì)算好,并且已經(jīng)將該計(jì)算好的數(shù)值存入ChildNum數(shù)組中,構(gòu)造整數(shù)變量index、i,其中,i的范圍從O、,對index賦初值0,按照特定的順序依次遍歷編號為(TN-I的節(jié)點(diǎn),對編號為i的節(jié)點(diǎn),如果Chi I dNum [ i ]的值為0,也就是該節(jié)點(diǎn)沒有下級節(jié)點(diǎn),則在Chi I dSeg數(shù)組中不存入該節(jié)點(diǎn)對應(yīng)的任何內(nèi)容,并將ChildSegStartIndex[i]的值置為_1,否則
I)置 ChildSegStartlndex[i]=index ;2)ChildSeg[index]至 ChildSeg[index+ChildNum[i]_l]依次存儲編號為 i 的節(jié)點(diǎn)的所有下級節(jié)點(diǎn)的編號;3)index+=ChildNum[i]。按照上述遍歷的順序,依次計(jì)算各節(jié)點(diǎn)對應(yīng)的ChildSeg數(shù)組元素的值和ChildSegStartlndex 數(shù)組元素的值。如圖3所示,雖然圖3的數(shù)據(jù)結(jié)構(gòu)是樹形結(jié)構(gòu),也可以按照上述方法進(jìn)行記錄,可以獲得如下三個(gè)一維數(shù)組 Chi I dNum 數(shù)組:CN
=5、CN [ I ] =3、CN [2] =0、CN [3] =0、CN [4] =0、CN [5] =0ChildNum數(shù)組表示第i個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)的數(shù)目。例如,CN
=5表示編號為0的節(jié)點(diǎn)A的下級節(jié)點(diǎn)的數(shù)目為5個(gè);CN[3]=0表示編號為3的節(jié)點(diǎn)C2的下級節(jié)點(diǎn)的數(shù)目為0 ;ChildSeg 數(shù)組CS
=1、CS [I] =2、CS [2] =3、CS [3] =4、CS [4] =5 ;CS [5] =2、CS [6] =3、CS [7] =4ChildSeg數(shù)組分段表示第i個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)的編號。在圖3中除了最末端節(jié)點(diǎn)之外,每個(gè)節(jié)點(diǎn)有多個(gè)下級節(jié)點(diǎn),因此每個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)的編號為多個(gè)。例如,CS
=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4] =5表示編號0的節(jié)點(diǎn)的下級節(jié)點(diǎn)是1、2、3、4、5 ;沒有下級節(jié)點(diǎn)的可以不記錄,如此等等。ChildSegStartlndex 數(shù)組Cl
=0、Cl [I] =5、C I [2] =NULL, Cl [3] =NULL,Cl[4]=NULL,Cl[5]=NULLChildSegStartlndex表示ChildSeg數(shù)組中每個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)的分段開始的索引。例如,Cl
=0表示ChildSeg數(shù)組中的編號0的節(jié)點(diǎn)的下級節(jié)點(diǎn)段的開始索引為0,即CS
為編號0的節(jié)點(diǎn)的下級節(jié)點(diǎn)段。每個(gè)節(jié)點(diǎn)可以有多個(gè)下級節(jié)點(diǎn),并且每個(gè)節(jié)點(diǎn)的下級的編號在ChildSeg數(shù)組中是以分段的方式連續(xù)排列的,因此需要數(shù)組ChildSegStartlndex[i]來表示第i個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)段的開始位置,也就是說,在ChildSeg 數(shù)組中 ChildSegStartlndex [i]至 ChildSegStartlndex [i+1]-I 之間的序列是第i個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)的編號集合。CI
=0、CI[1]=5表示編號為0的節(jié)點(diǎn)的下級節(jié)點(diǎn)段在ChildSeg數(shù)組中為數(shù)組下標(biāo)為0和4的數(shù)組表示的值,即CS
=1、CS[1]=2、CS[2]=3、CS[3]=4、CS[4] =5 ;對于沒有下級節(jié)點(diǎn)的節(jié)點(diǎn) i,ChildSegStartlndex[i] =NULL,并且在ChildSeg數(shù)組并不存儲該節(jié)點(diǎn)下級節(jié)點(diǎn)段。這樣可以通過三個(gè)一維數(shù)組來存儲和描述節(jié)點(diǎn)之間的下級關(guān)系。上面給出的通過一個(gè)或多個(gè)一維數(shù)組描述和存儲節(jié)點(diǎn)之間的上下級關(guān)系的例子,應(yīng)當(dāng)知道還可以有多種變形方式來用一維數(shù)組描述這些上下級關(guān)系,例如,在上文的ParentNum數(shù)組和ChildNum數(shù)組中可以存儲直接上級和直接下級節(jié)點(diǎn)的數(shù)目而不是存儲所有上級節(jié)點(diǎn)和下級節(jié)點(diǎn)的總數(shù)。同理,在上文的ParentSeg數(shù)組和ChildSeg數(shù)組中對應(yīng)地僅僅存儲直接上級節(jié)點(diǎn)和直接下級節(jié)點(diǎn)的編號。這樣可以減少存儲節(jié)點(diǎn)關(guān)系所需的空間。步驟204,構(gòu)造相應(yīng)的數(shù)組,存儲各節(jié)點(diǎn)的信息字段,并根據(jù)各節(jié)點(diǎn)特定時(shí)間段內(nèi)的信息字段的變化情況,確定所構(gòu)造的數(shù)組的次數(shù)。
具體地,特定時(shí)間段內(nèi),各節(jié)點(diǎn)所具有的信息字段可以變化,也可以固定不變。其中,不變的信息字段,如分類信息網(wǎng)站中,手機(jī)的品牌通常在一定的時(shí)間段內(nèi)是沒有更新的,這類信息更新速度的要求通常也不高,通常一個(gè)月內(nèi)才更新一次,因此,可視為這類信息在一個(gè)月內(nèi)是不變的。其中,變化的信息字段,如分類信息網(wǎng)站中,手機(jī)的品牌的當(dāng)前發(fā)帖量和瀏覽量是時(shí)刻變化的,通常這類信息需要時(shí)刻更新。其中,變化的信息分為動(dòng)態(tài)傳入的信息和動(dòng)態(tài)計(jì)算的信息,動(dòng)態(tài)傳入的信息是指從外部系統(tǒng)獲取的信息,如特定的系統(tǒng)專門提供手機(jī)型號的當(dāng)日發(fā)帖量,通過該系統(tǒng)傳入手機(jī)型號的當(dāng)日發(fā)帖量;動(dòng)態(tài)計(jì)算的信息是指本系統(tǒng)計(jì)算出來的信息,如本系統(tǒng)所累計(jì)的所有手機(jī)品牌的當(dāng)日發(fā)帖量,并從中找到當(dāng)日發(fā)帖量最大的品牌。對于各節(jié)點(diǎn)特定時(shí)間段內(nèi)不變的信息字段稱為靜態(tài)信息字段,用與所述信息字段的類別的等數(shù)量的一維數(shù)組表示,根據(jù)特定的順序,存儲相應(yīng)的信息字段,其中,所述的一維數(shù)組在特定時(shí)間段內(nèi)只構(gòu)造一次,且長度均為節(jié)點(diǎn)的數(shù)量。
每個(gè)節(jié)點(diǎn)可包含多類特定時(shí)間段內(nèi)不變的信息字段,如手機(jī)的品牌、上市時(shí)間。如圖3所示,各節(jié)點(diǎn)的名稱、上級節(jié)點(diǎn)的下標(biāo)、下級節(jié)點(diǎn)數(shù)是固定不變的,則分別構(gòu)造相應(yīng)數(shù) 量的長度為節(jié)點(diǎn)數(shù)的一維數(shù)組,根據(jù)節(jié)點(diǎn)編號的順序,依次存儲所有節(jié)點(diǎn)的名稱信息到名稱數(shù)組,依次存儲所有節(jié)點(diǎn)的上級(節(jié)點(diǎn))的下標(biāo)信息到上級(節(jié)點(diǎn))的下標(biāo)數(shù)組,依次存儲所有節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)到下級節(jié)點(diǎn)數(shù)數(shù)組,如上級(節(jié)點(diǎn))的下標(biāo)數(shù)組中,下標(biāo)為0的數(shù)組元素的值為-1,下標(biāo)為0的數(shù)組元素的值為O。對于上述特定時(shí)間段內(nèi)不變的信息字段,特定時(shí)間段內(nèi)只構(gòu)造一次相應(yīng)的數(shù)組。對于各節(jié)點(diǎn)特定時(shí)間段內(nèi)變化的信息字段稱為動(dòng)態(tài)信息字段,另用與所述信息字段的類別的等數(shù)量的一維數(shù)組表示,根據(jù)特定的順序,存儲相應(yīng)的信息字段,其中,在特定時(shí)間段內(nèi),每計(jì)算一次數(shù)據(jù),構(gòu)造一次所述的一維數(shù)組,且長度均為節(jié)點(diǎn)的數(shù)量。每個(gè)節(jié)點(diǎn)可包含多類特定時(shí)間段內(nèi)變化的信息字段,如手機(jī)品牌的當(dāng)日發(fā)帖量、瀏覽量。如圖3所示,各節(jié)點(diǎn)的Dynamicvalue、result代表特定時(shí)間段內(nèi)變化的信息字段,則分別構(gòu)造相應(yīng)數(shù)量的長度為節(jié)點(diǎn)數(shù)的數(shù)組,根據(jù)節(jié)點(diǎn)編號的順序,依次存儲所有節(jié)點(diǎn)的Dynamic value信息到Dynamic value數(shù)組,依次存儲所有節(jié)點(diǎn)的result信息到result數(shù)組。對于上述特定時(shí)間段內(nèi)變化的信息字段,特定時(shí)間段內(nèi),每計(jì)算一次數(shù)據(jù),構(gòu)造一次相應(yīng)的數(shù)組。其中,典型的計(jì)算如遍歷,通過上述方法構(gòu)造完數(shù)組,并在數(shù)組中存入相應(yīng)的數(shù)據(jù)后,遍歷各個(gè)數(shù)組就可以得到該數(shù)組所表示的知識節(jié)點(diǎn)的結(jié)構(gòu)和信息,時(shí)間復(fù)雜度為0 (N),其中,N表示該數(shù)組的長度。其中,對上述實(shí)施例中的節(jié)點(diǎn)的編號,可以構(gòu)造一個(gè)一維數(shù)組,按照編號的順序存儲各節(jié)點(diǎn)的編號,也可以不構(gòu)造一維數(shù)組。其中,對分級數(shù)據(jù)結(jié)構(gòu)中的每個(gè)節(jié)點(diǎn),可定義一個(gè)不隨時(shí)間變化的值,如一個(gè)永久的編號,用一張哈希表記錄該值與所述節(jié)點(diǎn)編號之間的映射關(guān)系該值和所述數(shù)組的下標(biāo)
--對應(yīng),并建立一張哈希表,記錄每個(gè)節(jié)點(diǎn)所定義的值和所述數(shù)組的下標(biāo)--對應(yīng)的映
射關(guān)系,當(dāng)利用節(jié)點(diǎn)的字段查找節(jié)點(diǎn)時(shí),可以通過哈希表或者現(xiàn)有技術(shù)中的倒排索引的方法來實(shí)現(xiàn)所述節(jié)點(diǎn)的查找,查找的時(shí)間復(fù)雜度更小。其中,對于各節(jié)點(diǎn)所含的特定時(shí)間段內(nèi)變化的信息字段,可以在每次計(jì)算時(shí),臨時(shí)構(gòu)造一份數(shù)組,也可以預(yù)先構(gòu)造多份數(shù)組,作為多個(gè)線程之間的共享資源池。對于每次計(jì)算時(shí),臨時(shí)構(gòu)造一份數(shù)組,所計(jì)算的空間開銷為特定時(shí)間段內(nèi)變化的信息字段所占的空間*線程數(shù)+特定時(shí)間段內(nèi)不變的信息字段所占的空間;對于預(yù)先構(gòu)造多份數(shù)組,所計(jì)算的空間開銷為特定時(shí)間段內(nèi)變化的信息字段所占的空間*份數(shù)+特定時(shí)間段內(nèi)不變的信息字段所占的空間。無論是上述哪種方式,都小于現(xiàn)有技術(shù)中所計(jì)算的空間開銷。與現(xiàn)有技術(shù)相比,本發(fā)明所提供的將分級數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化成一維數(shù)組的方法具有以下優(yōu)點(diǎn)I)本方法將分級數(shù)據(jù)結(jié)構(gòu)各節(jié)點(diǎn)的關(guān)系、各節(jié)點(diǎn)所含的信息分情況構(gòu)造相應(yīng)的數(shù)組,對于特定時(shí)間段內(nèi)不變的靜態(tài)信息,可以只維護(hù)一份數(shù)據(jù)在多個(gè)線程間共享,只需要一次申請靜態(tài)空間進(jìn)行構(gòu)造和存儲即可;對于特定時(shí)間段內(nèi)變化的動(dòng)態(tài)信息,根據(jù)線程的數(shù)目可以在需要時(shí)臨時(shí)申請動(dòng)態(tài)空間構(gòu)造多個(gè)副本或者申請靜態(tài)空間固定生成多個(gè)副本供多線程使用。存儲一個(gè)數(shù)據(jù)結(jié)構(gòu)的副本所計(jì)算的空間復(fù)雜度為0 (N*D),其中,N為節(jié)點(diǎn)數(shù)量,D為各節(jié)點(diǎn)所含的信息字段。由于本發(fā)明用多個(gè)一維數(shù)組分別存儲靜態(tài)信息和動(dòng)態(tài)信息的每個(gè)字段,即,每個(gè)字段對于一個(gè)一維數(shù)值。因此本發(fā)明的方法很容易將每個(gè)節(jié)點(diǎn)的靜 態(tài)信息字段與動(dòng)態(tài)信息字段分開存儲。對于本發(fā)明的第一實(shí)施例,對靜態(tài)信息字段Dl分配一份靜態(tài)空間,對于M個(gè)線程臨時(shí)為動(dòng)態(tài)信息字段D2申請M份動(dòng)態(tài)空間,則總共需要的空間是0 (N*D1+N*D2*M)。對于本發(fā)明的第二實(shí)施例,對靜態(tài)信息字段Dl分配一份靜態(tài)空間,同時(shí)為動(dòng)態(tài)信息字段D2預(yù)先申請K份靜態(tài)空間并構(gòu)造K個(gè)副本,則總共需要的空間是0 (N*D1+N*D2*K)。這兩種方法相對于現(xiàn)有技術(shù)來說不需要為靜態(tài)信息字段存儲多個(gè)副本,因此都節(jié)約了空間開銷。2)本方法按照節(jié)點(diǎn)編號訪問各節(jié)點(diǎn),所計(jì)算的時(shí)間復(fù)雜度為0 (1),在訪問時(shí)間方面相對于現(xiàn)有技術(shù)的訪問時(shí)間O(IogN)也是大大節(jié)約了時(shí)間開銷。3)根據(jù)本方法進(jìn)行數(shù)據(jù)的計(jì)算時(shí),節(jié)點(diǎn)個(gè)數(shù)越多被查找的次數(shù)越多,本方法查找節(jié)點(diǎn)的時(shí)間復(fù)雜度的優(yōu)勢越明顯。雖然上文的實(shí)施例以一維數(shù)組為例來構(gòu)造和存儲分級數(shù)據(jù)結(jié)構(gòu),但是應(yīng)當(dāng)知道本發(fā)明不限于此,也可以用多維數(shù)組來存儲和構(gòu)造分級數(shù)據(jù)結(jié)構(gòu),只要將每個(gè)節(jié)點(diǎn)中表示節(jié)點(diǎn)之間關(guān)系的信息、每個(gè)節(jié)點(diǎn)的動(dòng)態(tài)信息字段、每個(gè)節(jié)點(diǎn)的靜態(tài)信息字段分為不同的數(shù)組存儲即可實(shí)現(xiàn)本發(fā)明的部分目的。例如,可以將存儲節(jié)點(diǎn)之間關(guān)系信息的數(shù)組稱為關(guān)系數(shù)組,將存儲每個(gè)節(jié)點(diǎn)的動(dòng)態(tài)信息字段的數(shù)組稱為動(dòng)態(tài)數(shù)組,將存儲每個(gè)節(jié)點(diǎn)的靜態(tài)信息字段的數(shù)組稱為靜態(tài)數(shù)組。這三類數(shù)組可以是多維也可以是一維的數(shù)組,但是優(yōu)選為一維數(shù)組,每個(gè)一維數(shù)組存儲所有節(jié)點(diǎn)的其中一個(gè)字段的信息。這樣當(dāng)需要增加或減少一個(gè)字段時(shí)不需要修改所有靜態(tài)數(shù)組或動(dòng)態(tài)數(shù)組,而只需要增加或刪除一個(gè)一維數(shù)組即可。以上所揭露的僅為本發(fā)明的一種較佳實(shí)施例而已,當(dāng)然不能以此來限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。
權(quán)利要求
1.一種數(shù)據(jù)結(jié)構(gòu)的構(gòu)造和存儲方法,包括 對數(shù)據(jù)結(jié)構(gòu)中的各個(gè)節(jié)點(diǎn)進(jìn)行編號; 設(shè)置至少一個(gè)關(guān)系數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的上下級關(guān)系信息; 設(shè)置至少一個(gè)動(dòng)態(tài)數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的動(dòng)態(tài)信息字段;以及 設(shè)置至少一個(gè)靜態(tài)數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的靜態(tài)信息字段。
2.根據(jù)權(quán)利要求I所述的方法,包括 設(shè)定遍歷的順序,根據(jù)遍歷的順序?qū)?shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)依次編號; 用至少一個(gè)一維數(shù)組表示每個(gè)節(jié)點(diǎn)的上級關(guān)系; 用至少一個(gè)一維數(shù)組表示每個(gè)節(jié)點(diǎn)的下級關(guān)系; 用至少一個(gè)一維數(shù)組分別存儲各節(jié)點(diǎn)的信息字段,所有節(jié)點(diǎn)的每個(gè)信息字段存儲在一個(gè)一維數(shù)組中,其中將實(shí)時(shí)變化的動(dòng)態(tài)信息字段存儲在動(dòng)態(tài)數(shù)組中,將非實(shí)時(shí)變化的靜態(tài)信息字段存儲在靜態(tài)數(shù)組中。
3.根據(jù)權(quán)利要求I或2所述的方法,其中,所述數(shù)據(jù)結(jié)構(gòu)是網(wǎng)狀結(jié)構(gòu); 設(shè)置至少一個(gè)關(guān)系數(shù)組用于存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的上下級關(guān)系信息的步驟包括如下步驟 設(shè)置至少三個(gè)一維上級數(shù)組表示每個(gè)節(jié)點(diǎn)的上級關(guān)系,所述三個(gè)數(shù)組包括第一上級數(shù)組、第二上級數(shù)組和第三上級數(shù)組; 計(jì)算每個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù),按照節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的上級節(jié)點(diǎn)數(shù)依次存入第一上級數(shù)組; 根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的所有上級節(jié)點(diǎn)的編號分段存入第二上級數(shù)組;根據(jù)節(jié)點(diǎn)編號的順序,將所述第二上級數(shù)組每一段的起始下標(biāo)存入第三上級數(shù)組;設(shè)置至少三個(gè)一維下級數(shù)組表示每個(gè)節(jié)點(diǎn)的下級關(guān)系,所述三個(gè)下級數(shù)組包括第四下級數(shù)組、第五下級數(shù)組和第六下級數(shù)組; 計(jì)算每個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù),根據(jù)節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的下級節(jié)點(diǎn)數(shù)依次存入第四下級數(shù)組; 根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的所有下級節(jié)點(diǎn)的編號分段存入第五下級數(shù)組; 根據(jù)節(jié)點(diǎn)編號的順序,將所述第五下級數(shù)組每一段的起始下標(biāo)存入第六下級數(shù)組。
4.根據(jù)權(quán)利要求I或2所述的方法,其中,所述數(shù)據(jù)結(jié)構(gòu)是網(wǎng)狀結(jié)構(gòu); 設(shè)置至少一個(gè)關(guān)系數(shù)組用于存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的上下級關(guān)系信息的步驟包括如下步驟 設(shè)置至少三個(gè)一維上級數(shù)組表示每個(gè)節(jié)點(diǎn)的上級關(guān)系,所述三個(gè)數(shù)組包括第七上級數(shù)組、第八上級數(shù)組和第九上級數(shù)組; 計(jì)算每個(gè)節(jié)點(diǎn)的直接上級節(jié)點(diǎn)數(shù),按照節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的直接上級節(jié)點(diǎn)數(shù)依次存入第七上級數(shù)組; 根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的直接上級節(jié)點(diǎn)的編號分段存入第八上級數(shù)組;根據(jù)節(jié)點(diǎn)編號的順序,將所述第八上級數(shù)組每一段的起始下標(biāo)存入第九上級數(shù)組;設(shè)置至少三個(gè)一維下級數(shù)組表示每個(gè)節(jié)點(diǎn)的下級關(guān)系,所述三個(gè)下級數(shù)組包括第十下級數(shù)組、第i^一下級數(shù)組和第十二下級數(shù)組; 計(jì)算每個(gè)節(jié)點(diǎn)的直接下級節(jié)點(diǎn)數(shù),根據(jù)節(jié)點(diǎn)編號的順序,將所述節(jié)點(diǎn)的直接下級節(jié)點(diǎn)數(shù)依次存入第十下級數(shù)組; 根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的直接下級節(jié)點(diǎn)的編號分段存入第十一下級數(shù)組; 根據(jù)節(jié)點(diǎn)編號的順序,將所述第i^一下級數(shù)組每一段的起始下標(biāo)存入第十二下級數(shù)組。
5.根據(jù)權(quán)利要求I或2所述的方法,其中,所述數(shù)據(jù)結(jié)構(gòu)是樹狀結(jié)構(gòu); 按照先序遍歷方式對所述數(shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)進(jìn)行編號; 設(shè)置至少一個(gè)關(guān)系數(shù)組用于存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的上下級關(guān)系信息的步驟進(jìn)一步包括如下步驟 設(shè)置一個(gè)一維上級數(shù)組表示每個(gè)節(jié)點(diǎn)的上級關(guān)系,根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的上級節(jié)點(diǎn)的編號存入所述一維上級數(shù)組; 設(shè)置一個(gè)一維下級數(shù)組表示每個(gè)節(jié)點(diǎn)的下級關(guān)系,根據(jù)節(jié)點(diǎn)編號的順序,將各個(gè)節(jié)點(diǎn)的下級節(jié)點(diǎn)的總數(shù)存入所述一維下級數(shù)組。
6.根據(jù)權(quán)利要求1-5任一項(xiàng)所述的方法,其中,按照先序遍歷的次序?qū)?shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)進(jìn)行遍歷和編號。
7.根據(jù)權(quán)利要求1-5任一項(xiàng)所述的方法,其中,在構(gòu)造數(shù)據(jù)結(jié)構(gòu)時(shí)執(zhí)行如下步驟 申請一份固定的靜態(tài)空間用于存儲所述靜態(tài)數(shù)組; 根據(jù)使用該數(shù)據(jù)結(jié)構(gòu)的線程數(shù)目申請多份動(dòng)態(tài)空間用于存儲所述動(dòng)態(tài)數(shù)組的多個(gè)副本。
8.根據(jù)權(quán)利要求1-5任一項(xiàng)所述的方法,其中,在構(gòu)造數(shù)據(jù)結(jié)構(gòu)時(shí)執(zhí)行如下步驟 申請一份固定的靜態(tài)空間用于存儲所述靜態(tài)數(shù)組; 申請多份固定的靜態(tài)空間用于存儲所述動(dòng)態(tài)數(shù)組的多個(gè)副本。
9.根據(jù)權(quán)利要求1-5任一項(xiàng)所述的方法,還包括 構(gòu)造一個(gè)數(shù)組,按照所述節(jié)點(diǎn)編號的順序存儲各節(jié)點(diǎn)的編號。
10.根據(jù)權(quán)利要求1-3任一項(xiàng)所述的方法,對所述分級數(shù)據(jù)結(jié)構(gòu)中的每個(gè)節(jié)點(diǎn)定義一個(gè)不隨時(shí)間變化的值,并用哈希表記錄該值與所述節(jié)點(diǎn)編號之間的映射關(guān)系,當(dāng)利用節(jié)點(diǎn)的字段查找節(jié)點(diǎn)時(shí),通過哈希表實(shí)現(xiàn)所述節(jié)點(diǎn)的查找。
全文摘要
本發(fā)明提供了一種數(shù)據(jù)結(jié)構(gòu)的構(gòu)造和存儲方法,包括對數(shù)據(jù)結(jié)構(gòu)中的各個(gè)節(jié)點(diǎn)進(jìn)行編號;設(shè)置至少一個(gè)關(guān)系數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的上下級關(guān)系信息;設(shè)置至少一個(gè)動(dòng)態(tài)數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的動(dòng)態(tài)信息字段;以及設(shè)置至少一個(gè)靜態(tài)數(shù)組用于依次存儲數(shù)據(jù)結(jié)構(gòu)中所有節(jié)點(diǎn)的靜態(tài)信息字段。本發(fā)明提供的方法,極大地降低了數(shù)據(jù)操作的時(shí)間復(fù)雜度和空間復(fù)雜度。
文檔編號G06F17/30GK102750328SQ201210173119
公開日2012年10月24日 申請日期2012年5月29日 優(yōu)先權(quán)日2012年5月29日
發(fā)明者孫海濤, 崔金峰, 王志強(qiáng) 申請人:北京城市網(wǎng)鄰信息技術(shù)有限公司