本發(fā)明屬于大數(shù)據(jù)處理技術(shù)領(lǐng)域,更具體地,涉及一種基于四維索引的大規(guī)模圖的可達(dá)查詢方法和系統(tǒng)。
背景技術(shù):
隨著大數(shù)據(jù)時(shí)代的到來(lái),圖的規(guī)模也越來(lái)越大。圖查詢作為一種基礎(chǔ)性操作被應(yīng)用于很多領(lǐng)域,比如社交網(wǎng)絡(luò)、運(yùn)輸網(wǎng)絡(luò)、交通定位、基因的生物學(xué)功能分析和數(shù)據(jù)挖掘等。圖的可達(dá)性代表了圖上一個(gè)結(jié)點(diǎn)到另一個(gè)結(jié)點(diǎn)的能力,即是否存在一條以u(píng)為起始結(jié)點(diǎn),以v為終止結(jié)點(diǎn)的路徑。
圖可達(dá)查詢有兩種極端的解決方法。第一種是基于預(yù)計(jì)算和存儲(chǔ)圖的完整傳遞閉包的方法,也就是預(yù)先記錄圖中任意兩個(gè)結(jié)點(diǎn)之間的可達(dá)性,該方法最早的研究工作可以追溯到1989年。這種方法的優(yōu)點(diǎn)是查詢時(shí)間很快,時(shí)間復(fù)雜度是o(1),但是該方法的缺點(diǎn)也很明顯,它需要o(|v|*|e|)的索引構(gòu)建時(shí)間和o(|v|2)的索引存儲(chǔ)空間。第二種方法是采用深度優(yōu)先遍歷或者廣度優(yōu)先遍歷的方法來(lái)回答結(jié)點(diǎn)對(duì)的可達(dá)性,該方法雖然不需要構(gòu)建索引,但是查詢時(shí)間的復(fù)雜度卻高達(dá)o(|v|+|e|)。因此,在大規(guī)模圖中,上述兩種方法都是不可行的。
目前,圖可達(dá)查詢的關(guān)鍵挑戰(zhàn)是在保證高效查詢時(shí)間的同時(shí)保證索引構(gòu)建時(shí)間比較快和索引大小也比較有競(jìng)爭(zhēng)力。到目前為止,很多研究者都研究了這個(gè)問(wèn)題,但是隨著圖規(guī)模的增加,現(xiàn)有的方法都或多或少存在著問(wèn)題,它們要么是索引構(gòu)建時(shí)間太長(zhǎng),要么是索引太大,要么是查詢時(shí)間太慢。因此,如何在索引構(gòu)建時(shí)間、索引大小和查詢時(shí)間三者之間找到一個(gè)平衡點(diǎn)是一個(gè)亟待解決的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)的以上缺陷或改進(jìn)需求,本發(fā)明提供了一種基于四維索引的大規(guī)模圖的可達(dá)查詢方法和系統(tǒng),其目的在于通過(guò)對(duì)給定圖進(jìn)行劃分,為每個(gè)結(jié)點(diǎn)構(gòu)建一個(gè)四維索引來(lái)回答結(jié)點(diǎn)對(duì)的可達(dá)性,由此確保高效的查詢時(shí)間的同時(shí)保證索引構(gòu)建時(shí)間和索引大小與現(xiàn)有方法相比都比較有競(jìng)爭(zhēng)力。
為實(shí)現(xiàn)上述目的,按照本發(fā)明的一個(gè)方面,提供了一種基于四維索引的大規(guī)模圖的可達(dá)查詢方法,所述方法包括以下步驟:
(1)通過(guò)遞歸遍歷從目標(biāo)圖中劃分出互不相交的不共享子圖和連接這些不共享子圖的跨子圖邊;結(jié)點(diǎn)的不共享子圖的編號(hào)為其所處不共享子圖所含根結(jié)點(diǎn)的編號(hào),其層次索引按遞歸次數(shù)增加;
(2)由不共享子圖中所有結(jié)點(diǎn)的拓?fù)渑判蛑登笕≡摻Y(jié)點(diǎn)的間隔域,所述間隔域包括初始間隔域和目標(biāo)間隔域;
(3)記錄所有不共享子圖中由于非樹(shù)邊的存在導(dǎo)致的不能使用間隔域判斷結(jié)點(diǎn)對(duì)可達(dá)性的異常情況;記錄所有不共享子圖中由于跨子圖邊的存在導(dǎo)致的不能直接判斷結(jié)點(diǎn)對(duì)可達(dá)性的異常情況;
(4)計(jì)算每個(gè)結(jié)點(diǎn)的向上等級(jí)索引
(5)通過(guò)結(jié)點(diǎn)對(duì)的層次索引、所在不共享子圖編號(hào)、間隔域和等級(jí)索引的對(duì)比關(guān)系確定結(jié)點(diǎn)對(duì)的可達(dá)性。
進(jìn)一步地,所述步驟(1)包括以下子步驟:
(11)找出目標(biāo)圖g=(v,e)中所有單根子圖m(r)=(vm(r),em(r)),單根子圖即目標(biāo)圖中一個(gè)根結(jié)點(diǎn)能到達(dá)的所有結(jié)點(diǎn)和該根結(jié)點(diǎn)的集合,其中,v表示目標(biāo)圖的結(jié)點(diǎn);e表示目標(biāo)圖的邊;r表示該單根子圖的根結(jié)點(diǎn);vm(r)表示單根子圖的結(jié)點(diǎn);em(r)表示單根子圖的邊;
(12)在目標(biāo)圖中找出所有位于兩個(gè)或兩個(gè)以上單根子圖中的結(jié)點(diǎn)vu,由所有結(jié)點(diǎn)vu和結(jié)點(diǎn)間相連的邊eu構(gòu)成共享子圖u=(vu,eu);
(13)構(gòu)建不共享子圖為n(r)=(vn(r),en(r)),其中,
(14)將共享子圖u=(vu,eu)設(shè)為新的目標(biāo)圖g=(v,e),重復(fù)步驟(11)~(13),每次重復(fù)遍歷得到的不共享子圖的層次索引都累加1,直到找不到共享子圖,最后得到一組有序的不共享子圖n0,n1,…,nx和連接不共享子圖的跨子圖邊k0,k1,…,ky,其中,x為不共享子圖的個(gè)數(shù);y為跨子圖邊個(gè)數(shù)。
進(jìn)一步地,所述步驟(2)包括以下子步驟:
(21)依次求出每個(gè)不共享子圖中結(jié)點(diǎn)的拓?fù)渑判蛑?,將拓?fù)渑判蛑蒂x值給該結(jié)點(diǎn)的初始間隔域su,其中,u為結(jié)點(diǎn);同時(shí)在拓?fù)渑判虻倪^(guò)程中,若邊(u,v)是該不共享子圖的邊且邊(u,v)未被訪問(wèn),則稱該邊為非樹(shù)邊,v為u的非樹(shù)邊出點(diǎn),u為v的非樹(shù)邊入點(diǎn);
(22)若不共享子圖中結(jié)點(diǎn)u為不共享子圖的葉子結(jié)點(diǎn),則其目標(biāo)間隔域eu等于其初始間隔域su;否則eu等于其后續(xù)鄰接點(diǎn)的e和su中的最大值;若結(jié)點(diǎn)u有后繼鄰接點(diǎn)v為結(jié)點(diǎn)u的非樹(shù)邊出點(diǎn),則在計(jì)算eu時(shí)不考慮v的目標(biāo)間隔域ev。
進(jìn)一步地,所述步驟(3)包括以下子步驟:
(31)若不共享子圖內(nèi)結(jié)點(diǎn)u為非樹(shù)邊入點(diǎn),則結(jié)點(diǎn)u的非樹(shù)邊集exception(u)初始化為其非樹(shù)邊出點(diǎn);否則exception(u)初始化為空集;若結(jié)點(diǎn)v為結(jié)點(diǎn)u的后繼鄰接點(diǎn),則exception(u)=exception(u)∪exception(v);若w∈exception(u),且滿足su≤sw和eu≥ew,則將w從exception(u)中除去,其中,su和sw為結(jié)點(diǎn)u和w的初始間隔域;eu和ew為結(jié)點(diǎn)u和w的目標(biāo)間隔域;
(32)若不共享子圖內(nèi)結(jié)點(diǎn)u為跨子圖邊入點(diǎn),則結(jié)點(diǎn)u的跨子圖邊集cross(u)初始化為其跨子圖邊出點(diǎn);否則cross(u)初始化為空集;若結(jié)點(diǎn)v和結(jié)點(diǎn)u屬于同一不共享子圖,且結(jié)點(diǎn)v為結(jié)點(diǎn)u的后繼鄰接點(diǎn),則cross(u)=cross(u)∪cross(v);若x,y∈crossu(),且滿足x,y屬于同一不共享子圖并且x可達(dá)y,則把y從cross(u)中除去。
進(jìn)一步地,所述步驟(5)包括以下子步驟:
(51)對(duì)于結(jié)點(diǎn)對(duì)(u,v),判斷
(52)判斷若layeru>layerv則進(jìn)入步驟(53);若layeru=layerv則進(jìn)入步驟(54);若layeru<layerv則進(jìn)入步驟(55);其中,layeru和layerv表示表示結(jié)點(diǎn)u和v的層次索引;
(53)結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;
(54)判斷:若rootu≠rootv,則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;若su>sv,則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;若eu≥ev,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;若w∈exception(u)且結(jié)點(diǎn)w可達(dá)結(jié)點(diǎn)v,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;否則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;其中,rootu和rootv表示結(jié)點(diǎn)u和v所在不共享子圖的編號(hào);eu和ev表示結(jié)點(diǎn)u和v的目標(biāo)間隔域;su和sv表示結(jié)點(diǎn)u和v的初始間隔域;
(55)若w∈cross(u)且結(jié)點(diǎn)w可達(dá)結(jié)點(diǎn)v,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;否則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v。
按照本發(fā)明的另一方面,提供了一種基于四維索引的大規(guī)模圖的可達(dá)查詢系統(tǒng),所述系統(tǒng)包括:
不共享子圖劃分模塊,用于通過(guò)遞歸遍歷從目標(biāo)圖中劃分出互不相交的不共享子圖和連接這些不共享子圖的跨子圖邊;結(jié)點(diǎn)的不共享子圖的編號(hào)為其所處不共享子圖所含根結(jié)點(diǎn)的編號(hào),其層次索引按遞歸次數(shù)增加;
結(jié)點(diǎn)間隔域求取模塊,用于由不共享子圖中所有結(jié)點(diǎn)的拓?fù)渑判蛑登笕≡摻Y(jié)點(diǎn)的間隔域,所述間隔域包括初始間隔域和目標(biāo)間隔域;
可達(dá)性異常記錄模塊,用于記錄所有不共享子圖中由于非樹(shù)邊的存在導(dǎo)致的不能使用間隔域判斷結(jié)點(diǎn)對(duì)可達(dá)性的異常情況;記錄所有不共享子圖中由于跨子圖邊的存在導(dǎo)致的不能直接判斷結(jié)點(diǎn)對(duì)可達(dá)性的異常情況;
等級(jí)索引計(jì)算模塊,用于計(jì)算每個(gè)結(jié)點(diǎn)的向上等級(jí)索引
結(jié)點(diǎn)對(duì)可達(dá)性判斷模塊,用于通過(guò)結(jié)點(diǎn)對(duì)的層次索引、所在不共享子圖編號(hào)、間隔域和等級(jí)索引的對(duì)比關(guān)系確定結(jié)點(diǎn)對(duì)的可達(dá)性。
進(jìn)一步地,所述不共享子圖劃分模塊包括:
單根子圖劃分單元,用于找出目標(biāo)圖g=(v,e)中所有單根子圖m(r)=(vm(r),em(r)),單根子圖即目標(biāo)圖中一個(gè)根結(jié)點(diǎn)能到達(dá)的所有結(jié)點(diǎn)和該根結(jié)點(diǎn)的集合,其中,v表示目標(biāo)圖的結(jié)點(diǎn);e表示目標(biāo)圖的邊;r表示該單根子圖的根結(jié)點(diǎn);vm(r)表示單根子圖的結(jié)點(diǎn);em(r)表示單根子圖的邊;
共享子圖劃分單元,用于在目標(biāo)圖中找出所有位于兩個(gè)或兩個(gè)以上單根子圖中的結(jié)點(diǎn)vu,由所有結(jié)點(diǎn)vu和結(jié)點(diǎn)間相連的邊eu構(gòu)成共享子圖u=(vu,eu);
不共享子圖劃分單元,用于構(gòu)建不共享子圖為n(r)=(vn(r),en(r)),其中,
遞歸遍歷單元,用于將共享子圖u=(vu,eu)設(shè)為新的目標(biāo)圖g=(v,e),重復(fù)單根子圖劃分單元、共享子圖劃分單元和不共享子圖劃分單元,每次重復(fù)遍歷得到的不共享子圖的層次索引都累加1,直到找不到共享子圖,最后得到一組有序的不共享子圖n0,n1,…,nx和連接不共享子圖的跨子圖邊k0,k1,…,ky,其中,x為不共享子圖的個(gè)數(shù);y為跨子圖邊個(gè)數(shù)。
進(jìn)一步地,所述結(jié)點(diǎn)間隔域求取模塊包括:
初始間隔域單元,用于依次求出每個(gè)不共享子圖中結(jié)點(diǎn)的拓?fù)渑判蛑?,將拓?fù)渑判蛑蒂x值給該結(jié)點(diǎn)的初始間隔域su,其中,u為結(jié)點(diǎn);同時(shí)在拓?fù)渑判虻倪^(guò)程中,若邊(u,v)是該不共享子圖的邊且邊(u,v)未被訪問(wèn),則稱該邊為非樹(shù)邊,v為u的非樹(shù)邊出點(diǎn),u為v的非樹(shù)邊入點(diǎn);
目標(biāo)間隔域單元,用于判斷若不共享子圖中結(jié)點(diǎn)u為不共享子圖的葉子結(jié)點(diǎn),則其目標(biāo)間隔域eu等于其初始間隔域su;否則eu等于其后續(xù)鄰接點(diǎn)的e和su中的最大值;若結(jié)點(diǎn)u有后繼鄰接點(diǎn)v為結(jié)點(diǎn)u的非樹(shù)邊出點(diǎn),則在計(jì)算eu時(shí)不考慮v的目標(biāo)間隔域ev。
進(jìn)一步地,所述可達(dá)性異常記錄模塊包括:
非樹(shù)邊異常單元,用于判斷若不共享子圖內(nèi)結(jié)點(diǎn)u為非樹(shù)邊入點(diǎn),則結(jié)點(diǎn)u的非樹(shù)邊集exception(u)初始化為其非樹(shù)邊出點(diǎn);否則exception(u)初始化為空集;若結(jié)點(diǎn)v為結(jié)點(diǎn)u的后繼鄰接點(diǎn),則exception(u)=exception(u)∪exception(v);若w∈exception(u),且滿足su≤sw和eu≥ew,則將w從exception(u)中除去,其中,su和sw為結(jié)點(diǎn)u和w的初始間隔域;eu和ew為結(jié)點(diǎn)u和w的目標(biāo)間隔域;
跨子圖邊異常單元,用于判斷若不共享子圖內(nèi)結(jié)點(diǎn)u為跨子圖邊入點(diǎn),則結(jié)點(diǎn)u的跨子圖邊集cross(u)初始化為其跨子圖邊出點(diǎn);否則cross(u)初始化為空集;若結(jié)點(diǎn)v和結(jié)點(diǎn)u屬于同一不共享子圖,且結(jié)點(diǎn)v為結(jié)點(diǎn)u的后繼鄰接點(diǎn),則cross(u)=cross(u)∪cross(v);若x,y∈crossu(),且滿足x,y屬于同一不共享子圖并且x可達(dá)y,則把y從cross(u)中除去。
進(jìn)一步地,所述結(jié)點(diǎn)對(duì)可達(dá)性判斷模塊包括:
第一判斷單元,用于對(duì)于結(jié)點(diǎn)對(duì)(u,v),判斷
第二判斷單元,用于判斷若layeru>layerv則進(jìn)入第三判斷單元;若layeru=layerv則進(jìn)入第四判斷單元;若layeru<layerv則進(jìn)入第五判斷單元;其中,layeru和layerv表示表示結(jié)點(diǎn)u和v的層次索引;
第三判斷單元,用于確定結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;
第四判斷單元,用于判斷若rootu≠rootv,則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;若su>sv,則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;若eu≥ev,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;若w∈exception(u)且結(jié)點(diǎn)w可達(dá)結(jié)點(diǎn)v,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;否則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;其中,rootu和rootv表示結(jié)點(diǎn)u和v所在不共享子圖的編號(hào);eu和ev表示結(jié)點(diǎn)u和v的目標(biāo)間隔域;su和sv表示結(jié)點(diǎn)u和v的初始間隔域;
第五判斷單元,用于判斷若w∈cross(u)且結(jié)點(diǎn)w可達(dá)結(jié)點(diǎn)v,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;否則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v。
總體而言,通過(guò)本發(fā)明所構(gòu)思的以上技術(shù)方案與現(xiàn)有技術(shù)相比,具有以下技術(shù)特征及有益效果:
(1)由于采用了圖劃分方法,把圖劃分為若干個(gè)互不相交的不共享子圖,利用不共享子圖間的關(guān)系達(dá)到加速可達(dá)查詢的效果;
(2)由于在不共享子圖中采用了間隔域的方法來(lái)判斷結(jié)點(diǎn)間的可達(dá)性,達(dá)到了加速可達(dá)查詢的效果;
(3)由于圖劃分和間隔域的有效性,可以快速的構(gòu)建規(guī)模合理的索引,更好地完成了查詢時(shí)間、索引構(gòu)建時(shí)間和索引大小三者之間的平衡。
附圖說(shuō)明
圖1是本發(fā)明的目標(biāo)圖最后劃分示意圖;
圖2為本發(fā)明單根子圖示意圖;
圖3為本發(fā)明共享子圖和不共享子圖示意圖;
圖4為本發(fā)明不共享子圖n(1)中結(jié)點(diǎn)的間隔域值和初始非樹(shù)邊集;
圖5為本發(fā)明不共享子圖n(1)中結(jié)點(diǎn)的最終非樹(shù)邊集。
具體實(shí)施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說(shuō)明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。此外,下面所描述的本發(fā)明各個(gè)實(shí)施方式中所涉及到的技術(shù)特征只要彼此之間未構(gòu)成沖突就可以相互組合。
如圖1所示,本發(fā)明通過(guò)對(duì)給定圖進(jìn)行劃分,然后根據(jù)每個(gè)結(jié)點(diǎn)所處位置為其構(gòu)建索引來(lái)回答結(jié)點(diǎn)對(duì)的可達(dá)性。具體包括以下步驟:
(1)通過(guò)遞歸遍歷從目標(biāo)圖中劃分出互不相交的不共享子圖和連接這些不共享子圖的跨子圖邊;結(jié)點(diǎn)的不共享子圖的編號(hào)為其所處不共享子圖所在根結(jié)點(diǎn)編號(hào),其層次索引按遞歸次數(shù)增加;
(11)給定圖g=(v,e),其中,v表示結(jié)點(diǎn)集;e表示邊集,則從g中入度為0的結(jié)點(diǎn)(根r)開(kāi)始遍歷圖,找出該結(jié)點(diǎn)可以到達(dá)的所有結(jié)點(diǎn)vm(r);結(jié)點(diǎn)vm(r)和結(jié)點(diǎn)間相連的邊em(r)構(gòu)成的子圖稱為單根子圖m(r)=(vm(r),em(r)),其中,r表示該單根子圖的根結(jié)點(diǎn);
如圖2所示,圖g有4個(gè)根結(jié)點(diǎn):1、2、3和4,則g有四個(gè)單根子圖:m(1)、m(2)、m(3)和m(4);
(12)找出所有位于兩個(gè)或兩個(gè)以上單根子圖的結(jié)點(diǎn);這些結(jié)點(diǎn)vu和連接結(jié)點(diǎn)的邊eu構(gòu)成的子圖稱為共享子圖u=(vu,eu),如圖3所示;
(13)則不共享子圖為n(r)=(vn(r),en(r)),其中,
第一次遍歷結(jié)束得到的所有不共享子圖中結(jié)點(diǎn)的層次索引為1,結(jié)點(diǎn)的不共享子圖編號(hào)為該不共享子圖的根結(jié)點(diǎn)id值;
(14)把共享子圖u設(shè)為圖g,再次從其根結(jié)點(diǎn)開(kāi)始遍歷,使接下來(lái)每次遍歷結(jié)束得到的不共享子圖的層次索引加1,重復(fù)(11)~(13)直到找不到共享子圖,則圖劃分結(jié)束,得到一組有序的不共享子圖n0,n1,…,nx,其中,x為不共享子圖的個(gè)數(shù),和連接不共享子圖的跨子圖邊k0,k1,…,ky,其中,y為跨子圖邊個(gè)數(shù);若邊(u,v)為圖g的跨子圖邊,則稱v為u的跨子圖邊出點(diǎn),u為v的跨子圖邊入點(diǎn);
例如,在圖1中,我們首先把圖g劃分為4個(gè)不共享子圖n(1)、n(2)、n(3)和n(4),和相應(yīng)的共享子圖u;
然后,我們把u設(shè)為g,繼續(xù)進(jìn)行劃分,得到3個(gè)不共享子圖n(7),n(11)和n(12)以及相應(yīng)的共享子圖u';
接著,我們繼續(xù)劃分u',由于u'只有一個(gè)單根子圖n(14),劃分后該單根子圖就是不共享子圖,而沒(méi)有共享子圖產(chǎn)生;因此,劃分結(jié)束;
最終,圖g被劃分為8個(gè)不共享子圖和10條跨子圖邊,其中,不共享子圖的順序?yàn)椋簄(1)、n(2)、n(3)、n(4)、n(7)、n(11)、n(12)和n(14);跨子圖邊為:(1,7)、(2,7)、(2,11)、(3,11)、(3,12)、(4,12)、(6,10)、(7,14)、(11,14)和(10,18)。
(2)由不共享子圖中所有結(jié)點(diǎn)的拓?fù)渑判蛑登笕≡摻Y(jié)點(diǎn)的間隔域,所述間隔域包括初始間隔域和目標(biāo)間隔域;
這樣處于同一不共享子圖的結(jié)點(diǎn)對(duì)間的可達(dá)性可以用結(jié)點(diǎn)的間隔域的包含關(guān)系來(lái)判斷;
(21)根據(jù)步驟1中得到的一組有序不共享子圖n0,n1,…,nx,依次求出每個(gè)不共享子圖中結(jié)點(diǎn)的拓?fù)渑判蛑祍,則s為該結(jié)點(diǎn)的初始間隔域;另外,在求不共享子圖的拓?fù)渑判蜻^(guò)程中,若邊(u,v)是該不共享子圖的邊且邊(u,v)未被訪問(wèn),則稱該邊為非樹(shù)邊,v為u的非樹(shù)邊出點(diǎn),u為v的非樹(shù)邊入點(diǎn);
(22)結(jié)點(diǎn)u的目標(biāo)間隔域值e的計(jì)算方法如下:若u為不共享子圖的葉子結(jié)點(diǎn),則其目標(biāo)間隔域值e為其初始間隔域值s;若u不是葉子結(jié)點(diǎn),則其目標(biāo)間隔域值e為其后繼鄰接點(diǎn)的e值和該點(diǎn)s值中的最大值,但是,若有后繼鄰接點(diǎn)v為u的非樹(shù)邊出點(diǎn),則在計(jì)算u的e值時(shí)不考慮v的e值;這樣做是為了保證當(dāng)su≤sv并且eu≥ev時(shí),結(jié)點(diǎn)u可以到達(dá)結(jié)點(diǎn)v;
例如,如圖1所示,圖g的不共享子圖的順序?yàn)閚(1)、n(2)、n(3)、n(4)、n(7)、n(11)、n(12)和n(14),然后順序遍歷這些不共享子圖,求出不共享子圖中結(jié)點(diǎn)的拓?fù)渑判?,并賦值給結(jié)點(diǎn)的初始間隔域值;比如,首先,我們處理不共享子圖n(1),如圖4所示;n(1)中結(jié)點(diǎn)的拓?fù)漤樞驗(yàn)?,6,5,9,8,16和17,也即s1=1,s6=2,s5=3,s9=4,s8=5,s16=6和s17=7;此外,n(1)中有4條非樹(shù)邊(5,16)、(5,17)、(6,9)和(9,17),這些非樹(shù)邊在圖4中以虛線邊表示;因此,對(duì)于葉子結(jié)點(diǎn)17來(lái)說(shuō),e17=s17=7;對(duì)于結(jié)點(diǎn)16,e16=max{s16,e17}=7;對(duì)于結(jié)點(diǎn)8,e8=max{s8,e16}=7;至于結(jié)點(diǎn)9,由于它僅有一條非樹(shù)出邊,所以e9=s9=4;同理,對(duì)于結(jié)點(diǎn)5,e5=max{s5,e8,e9}=7;對(duì)于結(jié)點(diǎn)6,e6=s6=2;對(duì)于結(jié)點(diǎn)1,e1=max{s1,e5,e6}=7;接下來(lái),我們處理不共享子圖n(2),由于n(2)中僅有一個(gè)結(jié)點(diǎn),則e2=s2=8;隨后,剩下的不共享子圖中的結(jié)點(diǎn)均可以按照上述算法求出間隔域。
(3)記錄所有不共享子圖中由于非樹(shù)邊的存在導(dǎo)致的不能使用間隔域判斷結(jié)點(diǎn)對(duì)可達(dá)性的異常情況;記錄所有不共享子圖中由于跨子圖邊的存在導(dǎo)致的不能直接判斷結(jié)點(diǎn)對(duì)可達(dá)性的異常情況;
(31)不共享子圖內(nèi)結(jié)點(diǎn)對(duì)可達(dá)性判斷的異常情況是由于非樹(shù)邊的存在導(dǎo)致間隔域不能完全判斷不共享子圖內(nèi)結(jié)點(diǎn)對(duì)的可達(dá)性情況,該異常處理步驟包括:
初始化不共享子圖內(nèi)結(jié)點(diǎn)u的非樹(shù)邊集exception(u);若u為非樹(shù)邊入點(diǎn),則exception(u)初始化為其非樹(shù)邊出點(diǎn);否則exception(u)初始化為空集;
例如,如圖4所示,n(1)中有4條非樹(shù)邊(5,16)、(5,17)、(6,9)和(9,17);那么,結(jié)點(diǎn)5、結(jié)點(diǎn)6和結(jié)點(diǎn)9的初始非樹(shù)邊集分別為exception(5)={16,17},exception(6)={9}和exception(9)={17};圖4給出了不共享子圖n(1)中每個(gè)結(jié)點(diǎn)的間隔域([s,e])和初始非樹(shù)邊集;
u為某一不共享子圖中結(jié)點(diǎn),若v為u的后繼鄰接點(diǎn),則exception(u)=exception(u)∪exception(v);
若w∈exception(u),滿足su≤sw和eu≥ew,則把w從exception(u)中除去;這樣可以既保證了可達(dá)性判斷的準(zhǔn)確性,又減小了索引大?。?/p>
圖5標(biāo)示的是n(1)中結(jié)點(diǎn)的最終的非樹(shù)邊集;
(32)不共享子圖間結(jié)點(diǎn)對(duì)可達(dá)性判斷的異常情況是由于跨子圖邊的存在導(dǎo)致結(jié)點(diǎn)對(duì)的可達(dá)性無(wú)法用上述索引來(lái)直接判斷;該異常處理步驟包括:
初始化不共享子圖中結(jié)點(diǎn)u的跨子圖邊集cross(u);若u為跨子圖邊入點(diǎn),則cross(u)初始化為其跨子圖邊出點(diǎn);否則cross(u)初始化為空集;
u為某一不共享子圖中結(jié)點(diǎn),若v和u屬于同一不共享子圖,且v為u的后繼鄰接點(diǎn),則cross(u)=cross(u)∪cross(v);
若x,y∈cross(u),且滿足x,y屬于同一不共享子圖并且x可以到達(dá)y,則可以把y從cross(u)中除去;這樣同樣可以既保證可達(dá)性判斷的準(zhǔn)確性,又減小索引大??;
例如,這里以不共享子圖n(1)為例,計(jì)算結(jié)點(diǎn)的跨子圖邊集,而其它不共享子圖中結(jié)點(diǎn)的跨子圖邊集的計(jì)算方法與此類似;如圖1所示,結(jié)點(diǎn)5、結(jié)點(diǎn)8、結(jié)點(diǎn)9、結(jié)點(diǎn)16和結(jié)點(diǎn)17都沒(méi)有任何后繼鄰接點(diǎn)可以到達(dá)不在不共享子圖n(1)中的點(diǎn),所以,它們的跨子圖邊集為空集;對(duì)于結(jié)點(diǎn)6,它有一個(gè)跨子圖邊出點(diǎn),所以,cross(6)={10};對(duì)于結(jié)點(diǎn)1,首先,它有一個(gè)跨子圖邊出點(diǎn)7;其次,它的后繼鄰接點(diǎn)6的跨子圖邊異常集中有一個(gè)結(jié)點(diǎn)10,但是由于結(jié)點(diǎn)7和結(jié)點(diǎn)10位于同一不共享子圖且結(jié)點(diǎn)7可以到達(dá)結(jié)點(diǎn)10,所以,結(jié)點(diǎn)1的跨子圖邊異常集為cross(1)={7}。
(4)為每個(gè)結(jié)點(diǎn)創(chuàng)建向上等級(jí)索引
(5)通過(guò)結(jié)點(diǎn)對(duì)的層次索引、所在不共享子圖編號(hào)、間隔域和等級(jí)索引的對(duì)比關(guān)系確定結(jié)點(diǎn)對(duì)的可達(dá)性;
(51)對(duì)于結(jié)點(diǎn)對(duì)(u,v),判斷
(52)判斷若layeru>layerv則進(jìn)入步驟(53);若layeru=layerv則進(jìn)入步驟(54);若layeru<layerv則進(jìn)入步驟(55);其中,layeru和layerv表示表示結(jié)點(diǎn)u和v的層次索引;
(53)結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;
(54)判斷若rootu≠rootv,則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;若su>sv,則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;若eu≥ev,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;若w∈exception(u)且結(jié)點(diǎn)w可達(dá)結(jié)點(diǎn)v,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;否則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v;其中,rootu和rootv表示結(jié)點(diǎn)u和v所在不共享子圖的編號(hào);eu和ev表示結(jié)點(diǎn)u和v的目標(biāo)間隔域;su和sv表示結(jié)點(diǎn)u和v的初始間隔域;
(55)若w∈cross(u)且結(jié)點(diǎn)w可達(dá)結(jié)點(diǎn)v,則結(jié)點(diǎn)u可達(dá)結(jié)點(diǎn)v;否則結(jié)點(diǎn)u不可達(dá)結(jié)點(diǎn)v。
本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。