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