本發(fā)明涉及數(shù)據(jù)結(jié)構(gòu)領(lǐng)域,尤其是大型樹形結(jié)構(gòu)數(shù)據(jù)的相似度計算方法。
背景技術(shù):
隨著計算機技術(shù)和Internet的迅速普及,人們正在進入一個信息爆炸時代。海量的數(shù)據(jù)不僅種類繁多,且結(jié)構(gòu)復(fù)雜多變,而從中獲取有用的信息又是一件及其困難而繁瑣的事情。這種現(xiàn)象被稱為“數(shù)據(jù)豐富而知識匱乏”,也就是所謂的數(shù)據(jù)危機。伴隨著海量數(shù)據(jù)急劇增加,迅速產(chǎn)生和積累了大量的結(jié)構(gòu)化與半結(jié)構(gòu)化數(shù)據(jù),而對于這些數(shù)據(jù),圖挖掘算法的研究逐漸興起并得到重視。樹作為圖的特殊表達形式,也有較為重要的研究意義。
樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構(gòu);樹結(jié)構(gòu)在計算機領(lǐng)域也有廣泛的應(yīng)用,可以用樹來表示源程序的語法結(jié)構(gòu)。樹形結(jié)構(gòu)的數(shù)據(jù)相似度計算是當前研究的熱點話題,可以用于軟件相似度比較,網(wǎng)頁聚類等。
在計算樹的相似度方面,有學者做了不少的研究。例如2007年喬少杰等提出基于樹編輯距離的層次聚類算法,2009年,祁鈺等提出網(wǎng)頁結(jié)構(gòu)相似度計算,都是不同的計算樹的相似度算法。上述算法共同之處在于都是直接計算樹的相似度,而如果樹的規(guī)模較大,計算樹的相似度將會是很費時的操作。
技術(shù)實現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題是提供一種計算大型樹形結(jié)構(gòu)數(shù)據(jù)相似度的方法,用于樹形結(jié)構(gòu)數(shù)據(jù)的相似度比較和聚類等操作。
為了解決這個問題,本發(fā)明提出基于樹T的結(jié)構(gòu)特征計算相似度的方法,構(gòu)造出K個節(jié)點的所有非同構(gòu)形態(tài)的子樹,從T中計算這些子樹的同構(gòu)個數(shù),將其作為特征向量來進行樹的相似度計算。包括下列3個步驟:
1、選定K值,構(gòu)造出所有K個節(jié)點的非同構(gòu)形態(tài)子樹;
2、計算樹T相對于上述子樹的同構(gòu)個數(shù),得到關(guān)于樹T的特征向量
3、利用步驟2得到的選用一種計算相似度的方法進行樹T的相似度計算。
關(guān)于步驟1,枚舉K個節(jié)點的所有子樹,并對每種子樹進行編碼,同構(gòu)子樹的編碼是相同的,以此來篩選出K個節(jié)點的所有非同構(gòu)子樹tK1,tK2,…,tKn°
關(guān)于步驟2,設(shè)構(gòu)造的子樹為tK1,tK2,…,tKn,共n棵子樹。分別計算tK1,tK2,…,tKn在T中同構(gòu)子樹的個數(shù),這些值構(gòu)成樹T的長度為n的特征向量在計算tKi在T中的同構(gòu)子樹個數(shù)時,需要將tKi和T中每一個節(jié)點進行比較,最后將結(jié)果進行累加。
關(guān)于步驟3,采用如下方式定義向量間的相似度:
其中A,B為兩組特征向量,長度為n,Ai,Bi代表特征向量第i維的值,min(Ai,Bi)為Ai,Bi中較小的一個的值,max(Ai,Bi)則相反。
需要特別說明,在本發(fā)明中,關(guān)注的重點是樹T的結(jié)構(gòu),而對T中節(jié)點屬性并沒有特別的關(guān)注。也就是說T中每一個節(jié)點都是等同的。
附圖說明
為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明作進一步的詳細描述,其中:
圖1是選取K=4時tK的4中非同構(gòu)形態(tài)示意圖;
圖2是對K=4時非同構(gòu)子樹的編碼示意圖;
圖3是樹T的每一個節(jié)點存儲的信息示意圖;
圖4是計算同構(gòu)子樹個數(shù)的示意圖。
具體實施方式
下面將結(jié)合附圖對本發(fā)明的技術(shù)方案進行更詳細的說明。
本發(fā)明主要分為3個步驟:構(gòu)造K個節(jié)點的非同構(gòu)子樹、計算樹T中上述子樹同構(gòu)個數(shù)并得到特征向量、利用上述特征向量計算T的相似度。
關(guān)于步驟1,枚舉出K個節(jié)點的所有子樹,并對每種子樹進行編碼,編碼形式如圖2所示,在一棵樹中,葉子節(jié)點的編碼為“01”,對于非葉子節(jié)點其編碼為將其孩子節(jié)點的編碼進行排序,將排序好的編碼進行拼接,然后在拼接好的編碼左邊添加數(shù)字0,右邊添加數(shù)字1,以圖2中的(3)為例,(3)中的節(jié)點3和節(jié)點4都是葉子節(jié)點所以編碼為“01”,節(jié)點2只有一個孩子節(jié)點3,所以編碼為在孩子節(jié)點編碼的基礎(chǔ)上左邊添加0,右邊添加1構(gòu)成編碼“0011”,對于根節(jié)點1,它有兩個孩子節(jié)點,對孩子節(jié)點的編碼進行排序(按照ASCII碼從小到大的形式)所以節(jié)點2的編碼排在節(jié)點4的編碼前面,將兩個編碼拼接得到編碼“001101”,然后在拼接得到的編碼的左邊添加數(shù)字0,有邊添加數(shù)字1就得到節(jié)點1的編碼“00011011”。
這樣得到的編碼,對于同構(gòu)的子樹其編碼形式是一樣的,如圖2中的(3)和(5),這兩個子樹是同構(gòu)的,按照上述的編碼方式,(3)和(5)根節(jié)點的編碼是相同的,因此,我們就以根節(jié)點的編碼來表示一棵樹的形態(tài),以此來篩選出K節(jié)點的所有非同構(gòu)子樹。
關(guān)于步驟2,主要分為兩個部分:一是樹的構(gòu)建,二是同構(gòu)子樹個數(shù)計算算法。
關(guān)于第一部分,樹的表示方式很大程度上決定第二部分的計算算法。為了高效計算同構(gòu)子樹個數(shù),我們需要自定義一種表示樹的形式。由圖3可知,每一個節(jié)點需要記錄本節(jié)點編號,父節(jié)點編號,子節(jié)點集合;而其孩子節(jié)點信息則根據(jù)孩子節(jié)點的出度進行歸類存儲。也就是說出度為0的孩子節(jié)點存儲在一起,然后是出度為1的,以此類推。算法采用插邊的方式進行樹的構(gòu)建。
關(guān)于第二部分,計算樹T中子樹tK的同構(gòu)子樹個數(shù),計算方法如下所示:
首先進行節(jié)點的合法性檢查。對于樹T中的節(jié)點n1和子樹tK中的節(jié)點n2,將n1和n2的子節(jié)點出度從大到小排列后進行比較,如果n1和n2不存在一個映射關(guān)系,保證n1子節(jié)點出度≥n2對應(yīng)子節(jié)點出度,則n1中不存在n2的子樹同構(gòu)。利用合法性檢查可以縮小T的搜索范圍。
設(shè)tK的根節(jié)點為則我們需要將和T中所有的節(jié)點進行比較,將每一次計算出來的同構(gòu)個數(shù)進行累加,最后累加的結(jié)果就是tK在T中的同構(gòu)子樹個數(shù)。而每一次根節(jié)點之間的比較又可分為兩部分的乘積:一部分是的葉子節(jié)點和RT的孩子節(jié)點的對應(yīng)結(jié)果,另一部分是的非葉子孩子結(jié)點和RT的非葉子孩子結(jié)點的對應(yīng)結(jié)果。下面是T中某一節(jié)點RT和tK的根節(jié)點的比較過程:
1)記RT的出度為DT,的出度為中為葉子節(jié)點的孩子節(jié)點個數(shù)為
2)如果返回0;
3)如果RT和的合法性檢查為非法,返回0;
4)計算第一部分,也就是的葉子節(jié)點排列的結(jié)果:就是從DT中去掉匹配中出度>0的孩子節(jié)點后的個數(shù),從中選出個并進行全排列;
5)計算第二部分,就需要計算兩棵樹所有非葉子孩子結(jié)點的對應(yīng)關(guān)系,并列出下列表格:
表中RTi(i=1,2,…)表示RT中第i個非葉子孩子結(jié)點,表示中第j個非葉子孩子結(jié)點,而a,b,c,…則表示對應(yīng)的RTi和這兩個孩子節(jié)點為根時同構(gòu)子樹的個數(shù)。這里就需要遞歸返回到1)進行計算;
6)列出表格后,我們就需要對表格中的數(shù)據(jù)進行組合。每一種組合代表兩棵子樹非葉子孩子結(jié)點的一種對應(yīng)關(guān)系。若表3-1為2行3列,則組合結(jié)果為a×(e+f)+b×(d+f)+c×(d+e);
7)最后將兩部分的結(jié)果相乘,就是在RT中同構(gòu)子樹的數(shù)目。
由上述比較過程可知,在RT中同構(gòu)子樹的數(shù)目由的葉子節(jié)點和非葉子孩子結(jié)點在RT中的對應(yīng)關(guān)系組合而成。而葉子節(jié)點的計算不需要兩棵樹葉子節(jié)點的一一對應(yīng),只需計算RT中能夠提供給葉子節(jié)點匹配的數(shù)目,從中選出個并進行全排列即可;非葉子結(jié)點孩子的計算則需要兩棵樹非葉子結(jié)點的一一對應(yīng),并進行組合。
下面將結(jié)合具體例子對本算法中同構(gòu)子樹個數(shù)計算進行模擬。
如圖4所示,左圖為樹T,右圖為子樹tK,需要計算T中tK的同構(gòu)子樹個數(shù)。
以節(jié)點1和12為根節(jié)點進行比較,首先進行節(jié)點合法性檢查。節(jié)點1的子節(jié)點出度列表為{1,0,1,3},表示有1個出度為3的節(jié)點,0個出度為2的節(jié)點,1個出度為1的節(jié)點和3個出度為0的節(jié)點;節(jié)點12的子節(jié)點出度列表為{2,1}??梢钥闯龉?jié)點1可以提供子節(jié)點來滿足節(jié)點12的子節(jié)點需求。
其次計算第一部分,即的葉子節(jié)點排列的結(jié)果:意思是RT中除去需要匹配的非葉子結(jié)點后剩下的節(jié)點,用于匹配的葉子節(jié)點。
最后計算第二部分,即的非葉子節(jié)點排列的結(jié)果。需要列出下列表格:
a表示以T中節(jié)點2和tK中節(jié)點13為根時的同構(gòu)個數(shù),可遞歸計算,b、c、d類似。最后第二部分結(jié)果可表示為a×d+b×c=6。意思是當節(jié)點2和13對應(yīng),5和14對應(yīng)時,同構(gòu)個數(shù)為a×d;當節(jié)點2和14對應(yīng),5和13對應(yīng)時,同構(gòu)個數(shù)為b×c,將兩種情況相加即得到最后的結(jié)果。
關(guān)于步驟3,采用如下方式定義向量間的相似度:
其中A,B為兩組特征向量,長度為n,Ai,Bi代表特征向量第i維的值,min(Ai,Bi)為Ai,Bi中較小的一個的值,max(Ai,Bi)則相反。在計算兩棵樹的相似度時,首先分別提取這兩棵樹的特征向量,之后利用上述式子計算這兩個向量的相似度,也就代表了這兩棵樹的相似度。