本發(fā)明涉及大規(guī)模圖數(shù)據(jù)存儲與操作技術(shù)領域,具體涉及一種基于k2樹和多值決策圖的大規(guī)模圖數(shù)據(jù)處理方法。
背景技術(shù):
隨著移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)等技術(shù)的發(fā)展,眾多新應用以前所未有的方式和速度產(chǎn)生并積累著大量數(shù)據(jù)。在眾多類型的大數(shù)據(jù)中,圖數(shù)據(jù)作為一種有效描述大數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),扮演著越來越重要的角色。由于圖數(shù)據(jù)的規(guī)模日益龐大,實現(xiàn)圖數(shù)據(jù)的高效存儲以及圖數(shù)據(jù)的高效操作是當前面臨的挑戰(zhàn)。以社交網(wǎng)絡為例,根據(jù)GlobalWebIndex統(tǒng)計,F(xiàn)acebook用戶量已經(jīng)超過11億,平均每個人的好友超過100位,使用鄰接表來存儲所有用戶的關(guān)系信息,需要接近1TB的存儲空間。以互聯(lián)網(wǎng)為例,根據(jù)中國互聯(lián)網(wǎng)絡信息中心(CNNIC)發(fā)布的《第37次中國互聯(lián)網(wǎng)絡發(fā)展狀況統(tǒng)計報告》,截至2015年12月中國網(wǎng)頁數(shù)量為2123億個,超鏈接數(shù)據(jù)量估計超過1013,使用鄰接表來存儲網(wǎng)頁直接的鏈接關(guān)系信息需要超過16TB的存儲空間。隨著用戶量和信息量的快速增長,問題將會變得越來越嚴峻。
為了對圖數(shù)據(jù)進行緊湊表示,在傳統(tǒng)的鄰接矩陣表示法的基礎上,Brisaboa等于2009年提出了基于k2樹(k2-tree)的方法,樹中的每一層對應于鄰接矩陣或分塊子矩陣的分塊子矩陣,節(jié)點對應于鄰接矩陣的分塊子矩陣,生成的k2樹使用兩個位向量T和L來存儲,該方法不僅能夠緊湊表示鄰接矩陣,而且能實現(xiàn)鄰接節(jié)點的正向或逆向高效查詢操作。施佺等給出了k2樹表示方法的兩種優(yōu)化技術(shù):啟發(fā)式深度優(yōu)先節(jié)點重排序和自適應修正k,使得所表示的結(jié)構(gòu)更為緊湊,節(jié)點得到明顯的減少。
但是,不論是k2樹還是施佺優(yōu)化過的k2樹,在對大規(guī)模圖數(shù)據(jù)表示時仍具有一定的局限性,具體表現(xiàn)在:
1)當圖的規(guī)模變大時,圖內(nèi)部本身就會存在大量的同構(gòu)子圖。同樣的,當按照k2樹的思想把鄰接矩陣進行劃分后,也存在大量的相同的子矩陣。這就造成了k2樹內(nèi)也存在大量的同構(gòu)子樹。
2)k2樹僅對稀疏圖有效,當圖變的稠密時,由于鄰接矩陣內(nèi)可被壓縮的0節(jié)點變少,因此k2樹緊湊性也會變低。
3)k2樹未涉及動態(tài)圖(需要添加或刪除頂點、邊以及子圖等的圖)的表示與操作。
目前的k2樹的圖數(shù)據(jù)緊湊表示方法對上述圖的結(jié)構(gòu)特性尚缺乏必要的考慮,在緊湊性上仍有較大的改善空間。針對k2樹目前存在的問題,有必要對其進行進一步的優(yōu)化與改進,以得到一種更為緊湊并且適用面更廣的圖數(shù)據(jù)的表示方法。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是提供一種基于k2樹和多值決策圖的大規(guī)模圖數(shù)據(jù)處理方法,包括對圖數(shù)據(jù)的存儲方法,以及相關(guān)的圖的基本操作方法(如對邊的增刪改查等),以對包含億萬個頂點和邊的圖數(shù)據(jù)進行高效、緊湊地表示和操作。
多值決策圖MDD(Multi-valued Decision Diagram)是一個具有多個終端節(jié)點的有向無環(huán)圖,描述了一個帶有n個變量的離散多值函數(shù),f:D1×D2×…×Di×…×Dn→S,其中:
1)Di={1,2,…,ni}為多值變量xi的有限值域,不同變量其值域可能不同;S為多值函數(shù)f的有限值域,即MDD終端節(jié)點的取值集合,其可能為布爾值(真和假,或者0和1)、有限整數(shù)集合或者有限實數(shù)集合。
2)MDD的節(jié)點包括終端節(jié)點和非終端節(jié)點。
3)非終端節(jié)點用xi表示,包含ni個指向其他節(jié)點的指針,這些指針和函數(shù)f對應,形式化描述如公式(1)所示。
fxi=c=f(x1,x2,…,xi-1,c,xi+1,…,xn) (1)
多值變量x1到xn給定的一組取值,得到唯一的終端節(jié)點取值。
MDD的化簡規(guī)則為以下三條:
規(guī)則1、合并相同終端節(jié)點:
同一屬性的終端節(jié)點只保留一個,并刪除其余相同屬性的終端節(jié)點,原來指向這些已刪除的終端節(jié)點的指針重定向到保留的終端節(jié)點上。
規(guī)則2、合并相同內(nèi)部節(jié)點:
同一屬性的內(nèi)部節(jié)點,即非終端節(jié)點,只保留一個,并刪除其余相同屬性的內(nèi)部節(jié)點,原來指向這些已刪除的節(jié)點的指針重定向到保留的內(nèi)部節(jié)點上。
規(guī)則3,刪除冗余節(jié)點:
如果一個節(jié)點的所有指針都指向同一節(jié)點,那么該節(jié)點就是冗余節(jié)點,將其刪除,并將指向該節(jié)點的指針指向刪除節(jié)點的孩子節(jié)點。
本發(fā)明設計的一種基于k2樹和多值決策圖的大規(guī)模圖數(shù)據(jù)處理方法,采用k2樹的規(guī)則對鄰接矩陣進行劃分,然后使用多值決策圖MDD存儲圖數(shù)據(jù),生成的k2-MDD結(jié)構(gòu)。不僅比k2樹存儲結(jié)構(gòu)緊湊,圖的相關(guān)基本操作轉(zhuǎn)化為符號決策圖的邏輯操作。
本發(fā)明的一種基于k2樹和多值決策圖的大規(guī)模圖數(shù)據(jù)處理方法,所述原圖為有向圖G=(V,E),其頂點數(shù)|V|為大于等于1的整數(shù),邊數(shù)|E|為大于等于1的整數(shù);
包括如下步驟:
步驟1、根據(jù)k2樹的規(guī)則對圖的頂點進行n位編碼,其中,k是大于等于2的整數(shù);
步驟2、依據(jù)步驟1所得頂點編碼,對圖的邊進行編碼;
步驟3、根據(jù)步驟2所確定的邊編碼,構(gòu)造多值決策圖結(jié)構(gòu),即MDD結(jié)構(gòu),所得為k2-MDD結(jié)構(gòu)。k2-MDD結(jié)構(gòu)是MDD結(jié)構(gòu)的一種特殊情況,限定了它的變量個數(shù)和變量的取值范圍,其變量個數(shù)每個變量的取值范圍均為{1,2,…,k2}。故k2-MDD具有MDD的性質(zhì),適用MDD的化簡規(guī)則;
k2-MDD結(jié)構(gòu)為圖的鄰接矩陣用一個將原始矩陣進行遞歸的k2等分后構(gòu)造的多值決策圖結(jié)構(gòu),圖的鄰接矩陣中任一單元均對應于k2-MDD n個變量的唯一一組取值,根據(jù)該組取值得到的唯一函數(shù)值即終端節(jié)點的值,并且此值與原始矩陣中對應單元格的元素值相等。
本發(fā)明構(gòu)造的含有n個變量的k2-MDD,令其n個變量的值等于邊編碼集合里的值,函數(shù)值為T,否則為F,所得k2-MDD與有向圖G對應。
步驟4,根據(jù)步驟3所得的k2-MDD結(jié)構(gòu)進行圖的基本操作。
步驟3得到了原圖的k2-MDD結(jié)構(gòu),由于其是基于多值決策圖,采用符號決策圖的邏輯操作進行圖的相關(guān)基本操作:邊查詢、外鄰查詢及求頂點出度、內(nèi)鄰查詢及求頂點入度、增加邊及刪除邊等。
上述步驟1具體子步驟為:
步驟1.1、依據(jù)k2樹對圖的鄰接矩陣劃分的規(guī)則,即k2劃分規(guī)則,確定圖數(shù)據(jù)頂點的編碼長度n為頂點個數(shù)以k為底的對數(shù)向上取整,即其中k是大于等于2的整數(shù);
步驟1.2、使用k分方式,對原始圖中某一編號為N的頂點進行編碼,1≤N≤|V|。首先令k分的下界LT=1,上界HT=kn;
步驟1.3、如果LT<HT,令L=LT,H=HT,將區(qū)間[L,H]進行k等分。假設N處在區(qū)間[L,H]等分為k個子區(qū)間中的第i個子區(qū)間,i從0開始計數(shù),則編號為N的頂點得到一位編碼記為i,同時將此第i個子區(qū)間記為[LT,HT];
步驟1.4、步驟1.3重復進行下去,直至LT≥HT,此時即得到該編號為N的頂點的n位編碼,n位編碼中每一位都是k種狀態(tài)之一即(0,1,…,k-1)之一。
上述步驟2具體子步驟為:
步驟2.1、本發(fā)明中原圖的有向邊為頂點之間的關(guān)系,用頂點之間的特征函數(shù)描述。如頂點v0到頂點v1之間的邊,用特征函數(shù)E(v0,v1)來描述。設X=(x1,…,xn),Y=(y1,…,yn)是圖中頂點的編碼向量,則頂點X到頂點Y的邊的特征函數(shù)表示為:
E(X,Y):{0,1,…k-1}n×{0,1,…k-1}n→{1,2,…k2}n
即兩個頂點編碼的每一位上的k種狀態(tài)組合得到k2種狀態(tài)。因此,邊的編碼長度依然是n位,編碼的每一位是k2種狀態(tài)之一,即(1,2,…k2)狀態(tài)之一;
根據(jù)步驟1得到的將要進行編碼的某條邊的起、止兩個頂點的編碼,將該邊的兩個頂點的某對應位編碼狀態(tài)進行組合,即得到該邊的一位編碼;n位編碼狀態(tài)依次對應組合,即得到該邊的n位編碼;
步驟2.2、重復步驟2.1,直至得到圖中所有邊的編碼。
上述步驟3具體子步驟為:
步驟3.1、使用多終點和邊值決策圖庫,即MEDDLY(Multi-terminal and Edge-Valued Decision Diagram Library),創(chuàng)建取值范圍均為{1,2,…,k2}的n個變量。根據(jù)此n個變量,對于無權(quán)圖,初始化一個布爾型MDD,其終點是真或者是假;對于加權(quán)圖,初始化一個整數(shù)或者實數(shù)型MDD,其終點是整數(shù)或者實數(shù);
MEDDLY庫是為操控MDD提供的一個C/C++開源項目,由愛荷華州立大學在LINUX平臺下開發(fā),其中提供了豐富的MDD構(gòu)造以及操作的函數(shù)。例如:使用createVariablesBottomUp()函數(shù)創(chuàng)建將要構(gòu)造MDD的變量個數(shù)以及每個變量的取值范圍;使用createEdge()函數(shù)根據(jù)給定的一組或多組變量的值生成一個MDD;使用apply()函數(shù)以及UNION運算符將兩個MDD進行合并。
步驟3.2、假設原圖中有m條邊,根據(jù)步驟2得到其中某條邊的編碼,使用MEDDLY庫中的createEdge()函數(shù)生成一個初始MDD,記為R;在其余邊中再取一條邊用相同方法生成MDD,記為T;
步驟3.3、使用MEDDLY庫中提供的UNION運算符,對步驟3.2得到的R和T進行UNION運算,合并結(jié)果覆蓋原來的R,仍記作R;
步驟3.4、繼續(xù)在剩余的邊中再取一條邊用相同方法生成MDD,記為T,R和T進行UNION運算,合并結(jié)果仍記作R;
重復此步驟,直至所有邊都生成MDD并合并到R中,最終得到的R即為原圖的k2-MDD。
上述步驟4具體子步驟為:
步驟4.1、邊查詢
在步驟3所得的k2-MDD結(jié)構(gòu)圖上,根據(jù)某條邊的起止頂點v1和v2的編碼得到該條邊的特征函數(shù)E(v1,v2),在步驟3所得原圖的k2-MDD中檢測E(v1,v2)的函數(shù)值。若值為T,則該邊存在,否則不存在。
使用MEDDLY庫中提供INTERSECTION運算符求兩個MDD的交運算。將步驟3所得的原圖的k2-MDD與根據(jù)該條邊的特征函數(shù)E(v1,v2)生成的k2-MDD進行INTERSECTION運算,運算結(jié)果為T,則該邊存在,否則不存在;
步驟4.2、外鄰查詢
在步驟3所得的k2-MDD結(jié)構(gòu)圖上進行的外鄰查詢操作包括求得頂點出度,根據(jù)步驟4.1中的邊查詢的結(jié)果,將要進行外鄰查詢的頂點賦值為v1,圖中所有其它頂點依次賦值為v2,檢測E(v1,v2)的函數(shù)值。若值為T,則當前v2是v1的一個外鄰點,否則不是;通過統(tǒng)計v1外鄰點的個數(shù)得到該頂點v1的出度;
步驟4.3、內(nèi)鄰查詢
在步驟3所得的k2-MDD結(jié)構(gòu)圖上的內(nèi)鄰查詢操作包括求得頂點入度,與步驟4.2外鄰查詢類似,將要進行外鄰查詢的頂點賦值為v2,圖中所有其它頂點依次賦值為v1,檢測E(v1,v2)的函數(shù)值。若值為T,則當前v1是v2的一個內(nèi)鄰點,否則不是;通過統(tǒng)計v2內(nèi)鄰點的個數(shù)得到該頂點v2的入度;
步驟4.4、增加邊
在步驟3所得的k2-MDD結(jié)構(gòu)圖上,根據(jù)要增加邊的起止頂點v1和v2的編碼得到該條邊的特征函數(shù)E(v1,v2),生成該條邊的k2-MDD,然后與步驟3所得原圖的k2-MDD進行UNION運算,運算結(jié)果即為增加了該邊的新圖的k2-MDD;
步驟4.5、刪除邊
在步驟3所得的k2-MDD結(jié)構(gòu)圖上根據(jù)要刪除邊的起止頂點v1和v2的編碼得到該條邊的特征函數(shù)E(v1,v2),生成該條邊的k2-MDD,然后將步驟3所得原圖的k2-MDD與要刪除邊的k2-MDD進行DIFFERENCE運算,運算結(jié)果即為刪除了該邊的新圖的k2-MDD。DIFFERENCE是MEDDLY庫中提供的一個運算符,用來求兩個MDD的差運算,DIFFERENCE(A,B)={x|x屬于A且x不屬于B}。
根據(jù)上述圖的基本操作,可拓展完成圖的復雜操作,比如圖中頂點的添加與刪除、子圖的添加與刪除、寬度優(yōu)先搜索、求最短路、網(wǎng)絡流等等。
與現(xiàn)有技術(shù)相比,本發(fā)明一種基于k2樹和多值決策圖的大規(guī)模圖數(shù)據(jù)處理方法的優(yōu)點為:1、采用k2樹的規(guī)則對鄰接矩陣進行劃分,然后使用多值決策圖存儲圖數(shù)據(jù),使k2樹劃分鄰接矩陣時產(chǎn)生的大量相同的子矩陣,即k2樹中的同構(gòu)子樹,自然地被合并,最終生成的k2-MDD結(jié)構(gòu)比k2樹存儲結(jié)構(gòu)緊湊;2、由于k2-MDD中不論是0值還是1值的子矩陣,只要是同構(gòu)的,都將被合并,在表示稠密圖時,k2-MDD節(jié)點數(shù)會變少,結(jié)構(gòu)更為緊湊;3、k2-MDD存儲圖數(shù)據(jù)后,圖的相關(guān)基本操作可轉(zhuǎn)化為符號決策圖的邏輯操作,為動態(tài)圖數(shù)據(jù)的高效操作創(chuàng)造了條件,使得基于k2-MDD圖的查詢操作要比基于k2樹更為簡潔;4、k2-MDD是基于多值決策圖的結(jié)構(gòu),其本身結(jié)構(gòu)比k2樹更有利于子圖查詢、圖同構(gòu)、圖/子圖匹配以及多圖匹配等。
具體實施方式
以下結(jié)合實施例對本發(fā)明做進一步詳細的描述。
本基于k2樹和多值決策圖的大規(guī)模圖數(shù)據(jù)處理方法實施例原圖為有向圖G=(V,E),其頂點數(shù)|V|為大于等于1的整數(shù),邊數(shù)|E|為大于等于1的整數(shù);包括如下步驟:
步驟1、根據(jù)k2樹的規(guī)則對有向圖G=(V,E)的頂點進行n位編碼,其中,本例k=2;對于編號為N的頂點,1≤N≤|V|,將頂點總數(shù)|V|以遞歸2分方式進行編碼,在頂點的n位編碼中每一位都是2種狀態(tài)之一,0或1,
步驟1.1、依據(jù)k2樹對有向圖的鄰接矩陣劃分的規(guī)則,即k2劃分規(guī)則,確定圖數(shù)據(jù)頂點的編碼長度n為頂點個數(shù)以2為底的對數(shù)向上取整,即
步驟1.2、本例k=2,使用二分方式對頂點進行編碼。二分的下界LT=1,上界HT=2n;對于編號為N的頂點,1≤N≤|V|,對總數(shù)|V|的頂點按遞歸二分方式進行編碼。根據(jù)原圖中編號為N的頂點在所有頂點數(shù)中的所在位置,得到一個狀態(tài)作為其一位編碼,本例編號為N的頂點的n位編碼中每一位都是2種狀態(tài)之一,即0或1;
步驟1.3、若LT<HT,二分方式的中值等于上界與下界和的一半。若N小于或等于中值,得到編號為N的頂點的一位編碼為“0”,同時將中值減1作為上界HT;否則,得到編號為N的頂點的一位編碼為“1”,同時中值加1作為下界LT;
步驟1.4、步驟1.3重復進行,直至LT≥HT,此時便得到該編號為N的頂點的n位編碼。
步驟2、依據(jù)步驟1所得頂點編碼,對原圖的邊進行編碼;
步驟2.1、本發(fā)明中圖的有向邊為頂點之間的關(guān)系,用頂點之間的特征函數(shù)描述。如頂點v0到頂點v1之間的邊,用特征函數(shù)E(v0,v1)來描述。設X=(x1,…,xn),Y=(y1,…,yn)是圖中頂點的編碼向量,則頂點X到頂點Y的邊的特征函數(shù)表示為:
E(X,Y):{0,1,…k-1}n×{0,1,…k-1}n→{1,2,…k2}n
即兩個頂點編碼的每一位上的k種狀態(tài)組合得到k2種狀態(tài)。因此,邊的編碼長度依然是n位,編碼的每一位是k2種狀態(tài)之一,本例邊編碼的每一位即1,2,3,4四種狀態(tài)之一;
根據(jù)步驟1得到的將要進行編碼的某條邊的起、止兩個頂點的編碼,將該邊的兩個頂點的某對應位編碼狀態(tài)進行組合,即得到該邊的一位編碼;n位編碼狀態(tài)依次對應組合,即得到該邊的n位編碼;
步驟2.2、重復步驟2.1,直至得到圖中所有邊的編碼。
步驟3、根據(jù)步驟2所確定的邊編碼,構(gòu)造多值決策圖結(jié)構(gòu),即MDD(Multi-valued Decision Diagram)結(jié)構(gòu);所得為k2-MDD結(jié)構(gòu);
步驟3.1、使用多終點和邊值決策圖庫,即MEDDLY(Multi-terminal and Edge-Valued Decision Diagram Library),初始化一個含有n個變量的MDD,即頂點或邊的編碼長度n,其值域如步驟2.1所述為1~k2,本例為1~4。
對于無權(quán)圖,使用布爾型MDD,其終點是真(T)或者是假(F);對于加權(quán)圖,使用整數(shù)或者實數(shù)型MDD,其終點是整數(shù)或者實數(shù);
步驟3.2、根據(jù)步驟2所得的一條邊編碼,使用MEDDLY庫中的createEdge()函數(shù)生成一個初始MDD;用相同方法生成另一條邊的MDD;
步驟3.3、使用MEDDLY庫中提供的UNION運算符,對步驟3.2兩條邊生成的MDD進行UNION運算,合并結(jié)果保存在步驟3.1所得的初始MDD中;
步驟3.4、重復步驟3.2和3.3,直至所有邊都生成MDD并合并到初始MDD中,最終得到的MDD即為原圖的k2-MDD。
步驟4,根據(jù)步驟3所得的k2-MDD結(jié)構(gòu)進行圖的基本操作。
步驟4.1、邊查詢
在步驟3所得的k2-MDD結(jié)構(gòu)圖上,根據(jù)某條邊的起止頂點v1和v2的編碼得到該條邊的特征函數(shù)E(v1,v2),在步驟3所得原圖的k2-MDD中檢測E(v1,v2)的函數(shù)值。若值為T,則該邊存在,否則不存在。
使用MEDDLY庫中提供INTERSECTION運算符求兩個MDD的交運算。將步驟3所得原圖的k2-MDD與根據(jù)該條邊的特征函數(shù)E(v1,v2)生成的k2-MDD進行INTERSECTION運算,運算結(jié)果為T,則該邊存在,否則不存在;
步驟4.2、外鄰查詢
在步驟3所得的k2-MDD結(jié)構(gòu)圖上進行的外鄰查詢操作包括求得頂點出度,根據(jù)步驟4.1中的邊查詢的結(jié)果,將要進行外鄰查詢的頂點賦值為v1,圖中所有其它頂點依次賦值為v2,檢測E(v1,v2)的函數(shù)值。若值為T,則當前v2是v1的一個外鄰點,否則不是;通過統(tǒng)計v1外鄰點的個數(shù)得到該頂點v1的出度;
步驟4.3、內(nèi)鄰查詢
在步驟3所得的k2-MDD結(jié)構(gòu)圖上的內(nèi)鄰查詢操作包括求得頂點入度,與步驟4.2外鄰查詢類似,將要進行外鄰查詢的頂點賦值為v2,圖中所有其它頂點依次賦值為v1,檢測E(v1,v2)的函數(shù)值。若值為T,則當前v1是v2的一個內(nèi)鄰點,否則不是;通過統(tǒng)計v2內(nèi)鄰點的個數(shù)得到該頂點v2的入度;
步驟4.4、增加邊
在步驟3所得的k2-MDD結(jié)構(gòu)圖上,根據(jù)要增加邊的起止頂點v1和v2的編碼得到該條邊的特征函數(shù)E(v1,v2),生成該條邊的k2-MDD,然后與步驟3所得原圖的k2-MDD進行UNION運算,運算結(jié)果即為增加了該邊的新圖的k2-MDD;
步驟4.5、刪除邊
在步驟3所得的k2-MDD結(jié)構(gòu)圖上根據(jù)要刪除邊的起止頂點v1和v2的編碼得到該條邊的特征函數(shù)E(v1,v2),生成該條邊的k2-MDD,然后將步驟3所得原圖的k2-MDD與要刪除邊的k2-MDD進行DIFFERENCE運算,運算結(jié)果即為刪除了該邊的新圖的k2-MDD。DIFFERENCE是MEDDLY庫中提供的一個運算符,用來求兩個MDD的差運算,DIFFERENCE(A,B)={x|x屬于A且x不屬于B}。
上述實施例,僅為對本發(fā)明的目的、技術(shù)方案和有益效果進一步詳細說明的具體個例,本發(fā)明并非限定于此。凡在本發(fā)明的公開的范圍之內(nèi)所做的任何修改、等同替換、改進等,均包含在本發(fā)明的保護范圍之內(nèi)。