專利名稱:標(biāo)識(shí)強(qiáng)連通分量的入口和出口的技術(shù)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)技術(shù),更具體地,涉及有向圖遍歷。
背景技術(shù):
有向圖被用于計(jì)算機(jī)軟件中的建模和解決多個(gè)問題。例如,編譯器通常創(chuàng)建調(diào)用圖,其中有向圖上的每個(gè)節(jié)點(diǎn)表示一函數(shù),并且每個(gè)連接表示一個(gè)函數(shù)調(diào)用其他函數(shù)的路徑。有向圖(特別是有向非循環(huán)圖)常被用于貝葉斯(Bayesian)網(wǎng)絡(luò),用于在不確定條件下使用多種已知概率來進(jìn)行決策。有向圖中的強(qiáng)連通分量(SCC)是最大化強(qiáng)連通的那些子圖。如果存在從圖中的每個(gè)節(jié)點(diǎn)通向每個(gè)其他節(jié)點(diǎn)的路徑,那么圖或子圖就是強(qiáng)連通的。路徑沿雙向前進(jìn),意味著對于成為強(qiáng)連通圖的一部分的兩個(gè)節(jié)點(diǎn)而言,存在兩個(gè)節(jié)點(diǎn)之間在每一個(gè)方向上的路徑。標(biāo)識(shí)有向圖中的強(qiáng)連通分量在許多基于圖的數(shù)據(jù)結(jié)構(gòu)中是有用的,并且已經(jīng)研發(fā)了若干種有效的算法,諸如Tarjan的算法。Tar jan的算法執(zhí)行從起始節(jié)點(diǎn)開始的深度優(yōu)先搜索。在遇到節(jié)點(diǎn)時(shí)將它們放置在堆棧中。每次搜索從子樹返回,就在子樹節(jié)點(diǎn)上執(zhí)行一測試,以確定子樹節(jié)點(diǎn)下方的多個(gè)節(jié)點(diǎn)是否形成強(qiáng)連通路徑。如果是,則那些節(jié)點(diǎn)被從樹上移除,并被標(biāo)識(shí)為強(qiáng)連接分量。尋找強(qiáng)連通分量的入口和出口在多種應(yīng)用中是有價(jià)值的。例如,如果開發(fā)者添加一在軟件應(yīng)用中引入循環(huán)的從一個(gè)函數(shù)到另一個(gè)函數(shù)的調(diào)用,編譯器可產(chǎn)生不同代碼。在保有該軟件應(yīng)用的函數(shù)的有向圖中新引入的邊在標(biāo)識(shí)循環(huán)邊時(shí)產(chǎn)生了一不同的遍歷順序, 并可導(dǎo)致之前的非循環(huán)邊被標(biāo)識(shí)為循環(huán)邊。許多編譯器不跨循環(huán)邊內(nèi)聯(lián)函數(shù),因此對開發(fā)者看起來將是小改動(dòng)的改動(dòng)會(huì)減少內(nèi)聯(lián)并極大地影響軟件應(yīng)用的二進(jìn)制代碼的大小和執(zhí)行時(shí)間。如果存在從強(qiáng)連通分量外部的一些節(jié)點(diǎn)到原始節(jié)點(diǎn)的邊,則節(jié)點(diǎn)是入口,如果存在從一節(jié)點(diǎn)到強(qiáng)連通分量外部的一些節(jié)點(diǎn)的邊,那么該節(jié)點(diǎn)是出口。使用當(dāng)前的技術(shù),標(biāo)識(shí)入口和出口是不夠的,且通常涉及在強(qiáng)連通分量被標(biāo)識(shí)之后對該樹從頭至尾的第二次搜索。 當(dāng)用于具有許多函數(shù)的軟件代碼的編譯器時(shí),這可極大地增加編譯時(shí)間和資源使用。
發(fā)明內(nèi)容
在此描述了有效標(biāo)識(shí)強(qiáng)連通分量并且同時(shí)標(biāo)識(shí)入口、出口以及相應(yīng)的邊的圖遍歷系統(tǒng)。入口和出口節(jié)點(diǎn)可通過在標(biāo)識(shí)強(qiáng)連通分量之后掃描每個(gè)節(jié)點(diǎn)來標(biāo)識(shí),但重新訪問這些節(jié)點(diǎn)引起了不期望的開銷。本圖遍歷系統(tǒng)在當(dāng)正在標(biāo)識(shí)強(qiáng)連通分量時(shí)在單次遍歷期間標(biāo)識(shí)入口和出口。此外,本系統(tǒng)修改了用于一些應(yīng)用的語義,使得單個(gè)節(jié)點(diǎn)獨(dú)自不被認(rèn)為是強(qiáng)連通分量。通過在標(biāo)識(shí)強(qiáng)連通分量時(shí)有效標(biāo)識(shí)入口和出口,本系統(tǒng)減少了時(shí)間。因此,本圖遍歷系統(tǒng)允許以可被應(yīng)用于使用有向圖作為數(shù)據(jù)結(jié)構(gòu)的大量計(jì)算機(jī)軟件問題的方式從強(qiáng)連通分量中有效標(biāo)識(shí)入口和出口。提供本發(fā)明內(nèi)容以便以簡化形式介紹將在以下的具體實(shí)施方式
中進(jìn)一步描述的概念精選。本發(fā)明內(nèi)容并不旨在標(biāo)識(shí)出所要求保護(hù)主題的關(guān)鍵特征或必要特征,也不旨在用于限定所要求保護(hù)主題的范圍。
圖1是示出一個(gè)實(shí)施例中的圖遍歷系統(tǒng)的組件的框圖。圖2是示出在一個(gè)實(shí)施例中的圖遍歷系統(tǒng)處理圖并報(bào)告入口和出口的處理過程的流程圖。圖3是示出在一個(gè)實(shí)施例中的圖遍歷系統(tǒng)標(biāo)識(shí)在同一遍歷中標(biāo)識(shí)SCC以及入口 / 出口的處理過程的流程圖。圖4是示出在一個(gè)實(shí)施例中的圖遍歷系統(tǒng)處理節(jié)點(diǎn)的派生節(jié)點(diǎn)的處理過程的流程圖。
具體實(shí)施例方式在此描述了有效標(biāo)識(shí)強(qiáng)連通分量并且同時(shí)標(biāo)識(shí)入口、出口以及相應(yīng)的邊的圖遍歷系統(tǒng)?,F(xiàn)有技術(shù)無法在標(biāo)識(shí)強(qiáng)連通分量時(shí)標(biāo)識(shí)入口和出口。入口和出口節(jié)點(diǎn)可通過在標(biāo)識(shí)強(qiáng)連通分量之后掃描每個(gè)節(jié)點(diǎn)來標(biāo)識(shí),但重新訪問這些節(jié)點(diǎn)引起了不期望的開銷。本圖遍歷系統(tǒng)在當(dāng)正在標(biāo)識(shí)強(qiáng)連通分量時(shí)在單次遍歷期間標(biāo)識(shí)入口和出口。此外,本系統(tǒng)修改了用于一些應(yīng)用的語義,使得單個(gè)節(jié)點(diǎn)獨(dú)自不被認(rèn)為是強(qiáng)連通分量。當(dāng)被用于編譯器中時(shí),本圖遍歷系統(tǒng)將具有最多入口的節(jié)點(diǎn)用于循環(huán)邊的恒定標(biāo)識(shí)。這樣做穩(wěn)定了跨多個(gè)小改動(dòng)的代碼生成,由此開發(fā)者的小改動(dòng)不減少內(nèi)聯(lián)或產(chǎn)生極其不同的生成二進(jìn)制代碼。通過在標(biāo)識(shí)強(qiáng)連通分量時(shí)有效標(biāo)識(shí)入口和出口,本系統(tǒng)減少了編譯時(shí)間。在一些實(shí)施例中,本系統(tǒng)執(zhí)行Tarjan的算法的修改版本,使得當(dāng)正在檢測強(qiáng)連通分量時(shí),也標(biāo)識(shí)入口 /出口節(jié)點(diǎn)和多個(gè)邊。包括單個(gè)節(jié)點(diǎn)的簡單強(qiáng)連通分量將不被標(biāo)識(shí),除非它們來自自循環(huán)。在時(shí)間復(fù)雜度方面,修改版本與Tarjan的算法一樣有效。因此,本圖遍歷系統(tǒng)允許以可被應(yīng)用于使用有向圖作為數(shù)據(jù)結(jié)構(gòu)的大量計(jì)算機(jī)軟件問題的方式從強(qiáng)連通分量中有效標(biāo)識(shí)入口和出口。在對圖的深度優(yōu)先搜索中,Tarjan的算法保持對每個(gè)節(jié)點(diǎn)的兩個(gè)指標(biāo)索引和 LoWLink(低鏈接)。索引指定了節(jié)點(diǎn)獲取的順序,而LowLink指定了可以從特定節(jié)點(diǎn)獲取的最低索引節(jié)點(diǎn)的索引。當(dāng)算法對圖進(jìn)行遍歷時(shí),這些指標(biāo)被更新以標(biāo)識(shí)強(qiáng)連通分量的根。 一堆棧被用于高速緩存那些潛在地是強(qiáng)連通分量的集合但還沒有被完全標(biāo)識(shí)的節(jié)點(diǎn)。一旦標(biāo)識(shí)了強(qiáng)連通分量根,就能容易地發(fā)現(xiàn)在同一個(gè)強(qiáng)連通分量中的所有節(jié)點(diǎn),并且它們可以連續(xù)占據(jù)堆棧的頂端。本圖遍歷系統(tǒng)在如何初始化節(jié)點(diǎn)的兩個(gè)索引中的一個(gè)方面修改了 Tarjan的算法索引的實(shí)施方式。該改動(dòng)避免了將單個(gè)節(jié)點(diǎn)本身標(biāo)識(shí)為簡單強(qiáng)連通分量。除了將節(jié)點(diǎn)的 LowLink初始化為與其索引相同的值,本系統(tǒng)將LowLink初始化為無限大或比最高索引值更高的非常大的數(shù)目。以此方式,本系統(tǒng)可測試LowLink的值以將不指向任何其他節(jié)點(diǎn)的節(jié)點(diǎn)與其自身是強(qiáng)連通分量的節(jié)點(diǎn)(即,自循環(huán))區(qū)分開。本圖遍歷系統(tǒng)還向Tarjan的算法的實(shí)施方式中增加了用于的標(biāo)識(shí)強(qiáng)連通分量出口和入口的邏輯。Tarjan的算法的一個(gè)屬性是強(qiáng)連通分量的節(jié)點(diǎn)被一起從堆棧彈出。當(dāng)深度優(yōu)先搜索完成對邊的訪問,源節(jié)點(diǎn)位于堆棧上,并且對目的節(jié)點(diǎn)的訪問已經(jīng)結(jié)束。由于該特別屬性,如果在該時(shí)間點(diǎn)上目的節(jié)點(diǎn)不位于堆棧上,那么這兩個(gè)節(jié)點(diǎn)不能位于同一個(gè)強(qiáng)連通分量上。因此,如果目的節(jié)點(diǎn)屬于一強(qiáng)連通分量,那么該目的節(jié)點(diǎn)是入口且源節(jié)點(diǎn)是出口。這條邊在目的節(jié)點(diǎn)(或源節(jié)點(diǎn))的強(qiáng)連通分量(如果存在的話)的視角而言是入口邊 (或出口邊)。在一些實(shí)施例中,圖遍歷系統(tǒng)是編譯器(諸如微軟TM Visual C++編譯器)的循環(huán)檢測組件的一部分,但本系統(tǒng)可與任何基于圖的數(shù)據(jù)結(jié)構(gòu)一起使用以標(biāo)識(shí)強(qiáng)連通分量以及入口和出口。在編譯器中,本系統(tǒng)有助于在軟件代碼改動(dòng)時(shí)產(chǎn)生恒定的代碼生成。編譯器使用本系統(tǒng)來確定在每一個(gè)強(qiáng)連通分量中具有最多入口的節(jié)點(diǎn),并使用所確定的節(jié)點(diǎn)作為起始點(diǎn)來確定哪些邊是循環(huán)邊(即,在強(qiáng)連通分量中導(dǎo)致返回到所確定的節(jié)點(diǎn)的那些邊)。 循環(huán)邊可指示編譯器將不內(nèi)聯(lián)的函數(shù)調(diào)用,或可產(chǎn)生其他代碼生成差別。具有最多入口的節(jié)點(diǎn)有可能在圖的其他部分改動(dòng)時(shí)保持恒定。當(dāng)每個(gè)節(jié)點(diǎn)表示軟件代碼中的函數(shù),具有最多入口的節(jié)點(diǎn)是被大量使用并因此被頻繁調(diào)用的函數(shù)。改變具有最多入口的節(jié)點(diǎn)會(huì)意味著要么另一個(gè)函數(shù)變得更為頻繁地被其他函數(shù)所引用,要么原始函數(shù)不再被頻繁使用。因?yàn)檫@些是與在函數(shù)中增加對另一個(gè)函數(shù)的單個(gè)調(diào)用相比更少發(fā)生的事件,對循環(huán)邊的確定仍然保持相當(dāng)?shù)睾愣ǎ虼水?dāng)軟件代碼隨時(shí)間改動(dòng)時(shí),二進(jìn)制代碼以更為恒定的方式被生成。圖1是示出一個(gè)實(shí)施例中的圖遍歷系統(tǒng)的組件的框圖。系統(tǒng)100包括圖存儲(chǔ)器 110、初始化組件120、圖搜索組件130、SCC標(biāo)識(shí)組件140、入口 /出口標(biāo)識(shí)組件150、入口計(jì)數(shù)組件160、報(bào)告組件170、以及循環(huán)檢測組件180。此處更詳細(xì)地描述了這些組件中的每一個(gè)。圖存儲(chǔ)器110是數(shù)據(jù)存儲(chǔ)器,其存儲(chǔ)與一個(gè)或多個(gè)圖有關(guān)的信息,諸如由系統(tǒng)確定的節(jié)點(diǎn)、邊、以及強(qiáng)連接分量信息。圖存儲(chǔ)器110可包括一個(gè)或多個(gè)文件、硬盤、內(nèi)存內(nèi)數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫、基于云的儲(chǔ)存服務(wù)、或用于持久保存圖數(shù)據(jù)的任何其他儲(chǔ)存設(shè)備。初始化組件120初始化一個(gè)或多個(gè)變量,并準(zhǔn)備標(biāo)識(shí)所選擇的圖數(shù)據(jù)結(jié)構(gòu)中的強(qiáng)連通分量、入口和出口。例如,初始化組件120可標(biāo)識(shí)要處理的圖、初始化被用于對搜索中所遇到的每個(gè)節(jié)點(diǎn)進(jìn)行計(jì)數(shù)的全局節(jié)點(diǎn)索引/計(jì)數(shù)、并創(chuàng)建用于存儲(chǔ)可能是強(qiáng)連通的節(jié)點(diǎn)的堆棧。初始化組件120可調(diào)用圖搜索組件以在所選擇的圖上開始循環(huán)的深度優(yōu)先搜索。圖搜索組件130執(zhí)行對所選擇的圖數(shù)據(jù)結(jié)構(gòu)的搜索,以標(biāo)識(shí)強(qiáng)連通分量、入口和出口。存儲(chǔ)在圖存儲(chǔ)器Iio中的每個(gè)圖可標(biāo)識(shí)根節(jié)點(diǎn),圖搜索組件130從根節(jié)點(diǎn)開始深度優(yōu)先搜索以遍歷整個(gè)圖。圖搜索組件130可使用任何提供有效的圖處理以及強(qiáng)連通分量、 入口和出口標(biāo)識(shí)的搜索技術(shù)。在一些實(shí)施例中,圖搜索組件130使用循環(huán)軟件代碼來搜索所選擇的圖數(shù)據(jù)結(jié)構(gòu),并通過以所標(biāo)識(shí)的根節(jié)點(diǎn)喚起該循環(huán)軟件代碼來開始。SCC標(biāo)識(shí)組件140標(biāo)識(shí)所選擇的圖數(shù)據(jù)結(jié)構(gòu)的給定子圖中的強(qiáng)連通分量。組件140 接收潛在根節(jié)點(diǎn)、基于初始化的全局索引來設(shè)置節(jié)點(diǎn)索引、將LowLink初始化為高數(shù)目以指示還沒有遇到任何連接,并開始對節(jié)點(diǎn)的派生節(jié)點(diǎn)的循環(huán)搜索。在處理了節(jié)點(diǎn)的派生節(jié)點(diǎn)之后,組件140通過測試索引值是否等于LowLink值(這指示從當(dāng)前節(jié)點(diǎn)無法到達(dá)更低的索引節(jié)點(diǎn))來確定潛在根節(jié)點(diǎn)是否在強(qiáng)連通分量的根上。如果兩個(gè)索引相等,則該節(jié)點(diǎn)是強(qiáng)連通分量子圖的根節(jié)點(diǎn),并且從堆棧彈出節(jié)點(diǎn),直到彈出當(dāng)前節(jié)點(diǎn)。入口 /出口標(biāo)識(shí)組件150在標(biāo)識(shí)強(qiáng)連通分量的遍歷期間標(biāo)識(shí)強(qiáng)連通分量之間的入口和出口。在如剛剛所描述的處理節(jié)點(diǎn)的派生節(jié)點(diǎn)期間,如果節(jié)點(diǎn)的派生節(jié)點(diǎn)不在堆棧上,則如果該派生節(jié)點(diǎn)是在強(qiáng)連通分量子圖中且父節(jié)點(diǎn)是出口,那么該派生節(jié)點(diǎn)是進(jìn)入強(qiáng)連通分量子圖的入口。組件150使用該信息來標(biāo)記節(jié)點(diǎn),使其可以在之后被使用,諸如設(shè)置節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)的變量以指示該節(jié)點(diǎn)是否是入口 /出口。組件150也可將入口和出口存儲(chǔ)在分開的數(shù)據(jù)結(jié)構(gòu)中,用于跟蹤入口和出口(諸如,分開的列表),使得入口和出口在日后可被容易地遍歷。入口計(jì)數(shù)組件160維持對被標(biāo)識(shí)為所選擇的圖中的入口的特定節(jié)點(diǎn)的入口計(jì)數(shù)。 其他軟件代碼可使用系統(tǒng)100以標(biāo)識(shí)在每一個(gè)強(qiáng)連通分量集合中具有最多入口的節(jié)點(diǎn)。例如,在此處所給出的編譯器示例中,具有最多入口的節(jié)點(diǎn)可被用作為每一個(gè)強(qiáng)連通分量子圖的開始節(jié)點(diǎn)用于循環(huán)檢測。入口計(jì)數(shù)組件160在此處所描述的搜索遍期間每次標(biāo)識(shí)到新節(jié)點(diǎn)時(shí)更新節(jié)點(diǎn)的入口計(jì)數(shù)。在搜索結(jié)束時(shí),通過檢查每個(gè)節(jié)點(diǎn)的最終計(jì)數(shù)值可標(biāo)識(shí)具有最多入口的節(jié)點(diǎn)。報(bào)告組件170提供搜索結(jié)果,并標(biāo)識(shí)強(qiáng)連通分量、入口和出口。報(bào)告組件170可顯示報(bào)告或向其它軟件組件提供對結(jié)果的編程訪問,其它軟件組件可使用從搜索中導(dǎo)出的信息來完成各種任務(wù)。報(bào)告組件170可提供應(yīng)用程序編程接口(API),軟件組件可調(diào)用該API 以搜索圖并標(biāo)識(shí)所選擇的圖數(shù)據(jù)結(jié)構(gòu)的強(qiáng)連通分量、入口和/或出口。循環(huán)檢測組件180標(biāo)識(shí)每個(gè)所標(biāo)識(shí)的強(qiáng)連通分量集中的具有最大數(shù)目的來自其他強(qiáng)連通分量集的入口的節(jié)點(diǎn),并使用所標(biāo)識(shí)的節(jié)點(diǎn)來檢測所選擇的圖數(shù)據(jù)結(jié)構(gòu)中的循環(huán)邊。循環(huán)邊是那些引導(dǎo)回起始點(diǎn)的邊。編譯器和其他軟件工具可使用與循環(huán)邊有關(guān)的信息來執(zhí)行多種任務(wù),諸如從軟件程序的調(diào)用圖中生成正確的二進(jìn)制代碼。其上實(shí)現(xiàn)圖遍歷系統(tǒng)的計(jì)算設(shè)備可包括中央處理單元、存儲(chǔ)器、輸入設(shè)備(例如, 鍵盤和定點(diǎn)設(shè)備)、輸出設(shè)備(例如,顯示設(shè)備)和存儲(chǔ)設(shè)備(例如,盤驅(qū)動(dòng)器或其他非易失性存儲(chǔ)介質(zhì))。存儲(chǔ)器和存儲(chǔ)設(shè)備是可以用實(shí)現(xiàn)或允許該系統(tǒng)的計(jì)算機(jī)可執(zhí)行指令(例如, 軟件)來編碼的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。另外,數(shù)據(jù)結(jié)構(gòu)和消息結(jié)構(gòu)可以被存儲(chǔ)或通過諸如通信鏈路上的信號(hào)之類的數(shù)據(jù)傳輸介質(zhì)傳輸。可以使用各種通信鏈路,如因特網(wǎng)、局域網(wǎng)、 廣域網(wǎng)、點(diǎn)對點(diǎn)撥號(hào)連接、蜂窩電話網(wǎng)絡(luò)等等。系統(tǒng)的各實(shí)施例可以在各種操作環(huán)境中實(shí)現(xiàn),操作環(huán)境包括個(gè)人計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、手持式或膝上型設(shè)備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、可編程消費(fèi)電子產(chǎn)品、 數(shù)碼相機(jī)、網(wǎng)絡(luò)PC、小型計(jì)算機(jī)、大型計(jì)算機(jī)、包括任意上述系統(tǒng)或設(shè)備中的的分布式計(jì)算機(jī)環(huán)境等。計(jì)算機(jī)系統(tǒng)可以是蜂窩電話、個(gè)人數(shù)字助理、智能電話、個(gè)人計(jì)算機(jī)、可編程消費(fèi)電子產(chǎn)品、數(shù)碼相機(jī)等等??梢栽谟梢慌_(tái)或多臺(tái)計(jì)算機(jī)或其他設(shè)備執(zhí)行的諸如程序模塊之類的計(jì)算機(jī)可執(zhí)行的指令的一般上下文中來描述本系統(tǒng)。一般而言,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。通常,程序模塊的功能可以按需在各個(gè)實(shí)施例中進(jìn)行組合或分布。圖2是示出在一個(gè)實(shí)施例中的圖遍歷系統(tǒng)處理圖并報(bào)告入口和出口的處理過程的流程圖。在框210開始,系統(tǒng)標(biāo)識(shí)圖數(shù)據(jù)結(jié)構(gòu)以搜索強(qiáng)連通分量以及強(qiáng)連通分量之間的入口和出口,其中所標(biāo)識(shí)的圖包括至少一個(gè)節(jié)點(diǎn),以及方向性地將多個(gè)節(jié)點(diǎn)連接在一起的一條或多條邊。例如,系統(tǒng)可從調(diào)用系統(tǒng)的另一個(gè)軟件組件接收圖。圖可表示軟件程序中的函數(shù)調(diào)用圖或其他數(shù)據(jù)。在框220中繼續(xù),本系統(tǒng)初始化全局節(jié)點(diǎn)索引,全局節(jié)點(diǎn)索引跟蹤在對圖數(shù)據(jù)結(jié)構(gòu)的遍歷期間所標(biāo)識(shí)的節(jié)點(diǎn)的計(jì)數(shù)。例如,本系統(tǒng)可初始化一全局變量為零(或一,對于基于一的計(jì)數(shù)),并在遍歷期間每次遇到節(jié)點(diǎn)時(shí)就使變量增加。在遇到節(jié)點(diǎn)時(shí),就將每個(gè)節(jié)點(diǎn)初始化為全局節(jié)點(diǎn)索引的值。在框230中繼續(xù),系統(tǒng)開始對所標(biāo)識(shí)的圖數(shù)據(jù)結(jié)構(gòu)的深度優(yōu)先搜索,依次遍歷每個(gè)節(jié)點(diǎn)以確定每個(gè)節(jié)點(diǎn)是否是所標(biāo)識(shí)的圖數(shù)據(jù)結(jié)構(gòu)中的強(qiáng)連通分量的根節(jié)點(diǎn)。在框240中繼續(xù),系統(tǒng)標(biāo)識(shí)所標(biāo)識(shí)的圖數(shù)據(jù)結(jié)構(gòu)之中的任何強(qiáng)連通分量、入口和出口,并存儲(chǔ)描述所標(biāo)識(shí)的強(qiáng)連通分量、入口和出口的信息。例如,系統(tǒng)可將指示節(jié)點(diǎn)是否是強(qiáng)連通分量的根節(jié)點(diǎn)、入口和/或出口的元數(shù)據(jù)與每個(gè)節(jié)點(diǎn)和/或邊一起存儲(chǔ)。一個(gè)節(jié)點(diǎn)可以同時(shí)是這些中的任意一些或全部。入口標(biāo)識(shí)一節(jié)點(diǎn),該節(jié)點(diǎn)有一邊從強(qiáng)連通分量的一個(gè)集合跨越到強(qiáng)連通分量的另一個(gè)集合。出口即是邊的除了入口之外的源側(cè)上的節(jié)點(diǎn)。本系統(tǒng)在標(biāo)識(shí)強(qiáng)連通分量的同一次搜索中標(biāo)識(shí)入口和出口,而不需要第二次對圖進(jìn)行遍歷。這提高了處理圖的效率,并可極大地減少用于大型圖的時(shí)間。參考圖3進(jìn)一步描述這一過程。在框250中繼續(xù),系統(tǒng)完成對所標(biāo)識(shí)的圖數(shù)據(jù)結(jié)構(gòu)的搜索,并存儲(chǔ)描述搜索結(jié)果的信息。例如,本系統(tǒng)可存儲(chǔ)所標(biāo)識(shí)的節(jié)點(diǎn)的計(jì)數(shù)、從哪些節(jié)點(diǎn)入口 /出口、哪些節(jié)點(diǎn)是強(qiáng)連通分量、等等。在框沈0中繼續(xù),系統(tǒng)存儲(chǔ)至少每一個(gè)被標(biāo)識(shí)為入口節(jié)點(diǎn)的節(jié)點(diǎn)的入口計(jì)數(shù)。其它軟件組件可使用本系統(tǒng)來確定每一個(gè)強(qiáng)連通分量子圖中的具有最多入口的節(jié)點(diǎn)。 對于表示調(diào)用圖的圖,具有最多入口的節(jié)點(diǎn)通常是隨著時(shí)間將保持相當(dāng)恒定的節(jié)點(diǎn)。在框 270中繼續(xù),系統(tǒng)將搜索結(jié)果報(bào)告給一個(gè)或多個(gè)軟件組件用于進(jìn)一步的處理。例如,系統(tǒng)可將結(jié)果提供給編譯器中的循環(huán)檢測組件或使用圖數(shù)據(jù)結(jié)構(gòu)的其他組件。在框270之后,這些步驟結(jié)束。圖3是示出在一個(gè)實(shí)施例中的圖遍歷系統(tǒng)標(biāo)識(shí)在單次遍歷中標(biāo)識(shí)SCC以及入口 / 出口的處理過程的流程圖。在框310中開始,系統(tǒng)接收圖數(shù)據(jù)結(jié)構(gòu)的節(jié)點(diǎn),以為該圖數(shù)據(jù)結(jié)構(gòu)標(biāo)識(shí)強(qiáng)連通分量、入口和出口。例如,這些框可位于遍歷圖數(shù)據(jù)結(jié)構(gòu)的循環(huán)函數(shù)中。在框 320中繼續(xù),系統(tǒng)將節(jié)點(diǎn)索引設(shè)置為遞增索引,當(dāng)遇到圖數(shù)據(jù)結(jié)構(gòu)中標(biāo)識(shí)的節(jié)點(diǎn)時(shí),遞增索引跟蹤這些節(jié)點(diǎn)的計(jì)數(shù)。例如,本系統(tǒng)可使用跨多個(gè)對循環(huán)函數(shù)的調(diào)用而共享的全局變量, 函數(shù)在每次向新的節(jié)點(diǎn)賦予索引時(shí)遞增該全局變量。在框330中繼續(xù),本系統(tǒng)初始化節(jié)點(diǎn)的低鏈接(low link)值為比圖數(shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)數(shù)目更大的數(shù)目,其中低鏈接值跟蹤通過跟著連接到節(jié)點(diǎn)的邊可到達(dá)的其他節(jié)點(diǎn)的最低索引。例如,系統(tǒng)可設(shè)置低鏈接值為無限大或存儲(chǔ)值的數(shù)據(jù)類型所允許的最大值(諸如, MAX_DWARD、OxFFFFFFFF、或-1)。在遍歷圖數(shù)據(jù)結(jié)構(gòu)期間更新低鏈接值,并將其用于確定節(jié)點(diǎn)是否是強(qiáng)連通分量集的根節(jié)點(diǎn)。在框340中繼續(xù),系統(tǒng)將該節(jié)點(diǎn)與可能是強(qiáng)連接分量集的一部分的任何其他節(jié)點(diǎn)一起存儲(chǔ)在臨時(shí)儲(chǔ)存設(shè)備中。例如,系統(tǒng)可將節(jié)點(diǎn)推送入堆棧,在遍歷圖數(shù)據(jù)結(jié)構(gòu)期間使用可能是相同的強(qiáng)連通分量集的一部分的節(jié)點(diǎn)更新該堆棧。當(dāng)標(biāo)識(shí)一節(jié)點(diǎn)為強(qiáng)連通分量集的根時(shí),在堆棧中的任何位于該節(jié)點(diǎn)上方的節(jié)點(diǎn)均是相同的強(qiáng)連接分量集的一部分,并且可被一起移除。在判決框350中繼續(xù),如果該節(jié)點(diǎn)具有派生節(jié)點(diǎn),則系統(tǒng)在框360中繼續(xù),否則系統(tǒng)跳轉(zhuǎn)至框370。在框360中繼續(xù),系統(tǒng)處理所接收的節(jié)點(diǎn)的派生節(jié)點(diǎn),以確定每個(gè)派生節(jié)點(diǎn)其自身是否是強(qiáng)連通分量集的根。例如,本系統(tǒng)可對每個(gè)派生節(jié)點(diǎn)循環(huán)地調(diào)用一函數(shù)來遍歷圖數(shù)據(jù)結(jié)構(gòu),如以下將參考圖4所詳細(xì)描述的。在判決框370中繼續(xù),如果節(jié)點(diǎn)索引等于節(jié)點(diǎn)的低鏈接值,那么系統(tǒng)在框380中繼續(xù),否則系統(tǒng)在框390繼續(xù)。節(jié)點(diǎn)索引等于其低鏈接值表示從當(dāng)前節(jié)點(diǎn)無法達(dá)到更低的索引節(jié)點(diǎn),因此當(dāng)前節(jié)點(diǎn)是強(qiáng)連通分量集的根。在此時(shí)強(qiáng)連通分量被包括在存儲(chǔ)可能是相同的強(qiáng)連通分量集的一部分的節(jié)點(diǎn)的堆?;蚱渌麅?chǔ)存設(shè)備中。在框380中繼續(xù),如果節(jié)點(diǎn)索引等于節(jié)點(diǎn)的低鏈接值,那么本系統(tǒng)標(biāo)識(shí)該節(jié)點(diǎn)為強(qiáng)連通分量集的根。系統(tǒng)可在該節(jié)點(diǎn)上設(shè)置一變量,或存儲(chǔ)表示該節(jié)點(diǎn)為根的其它元數(shù)據(jù),在框380之后,系統(tǒng)跳轉(zhuǎn)到框395。在判決框390中繼續(xù),如果節(jié)點(diǎn)索引小于節(jié)點(diǎn)的低鏈接值,那么系統(tǒng)在框395中繼續(xù),否則系統(tǒng)完成。因?yàn)榈玩溄又当怀跏蓟癁楸人泄?jié)點(diǎn)索引更大的數(shù)目,如果在上述處理之后索引仍然小于低鏈接值,那么該節(jié)點(diǎn)不導(dǎo)向至任何其他節(jié)點(diǎn)(甚至也不是其本身),且因此是孤立節(jié)點(diǎn)。對強(qiáng)連通分量的傳統(tǒng)定義將這些節(jié)點(diǎn)標(biāo)識(shí)為強(qiáng)連通分量。然而,對這些節(jié)點(diǎn)的處理與確實(shí)連接到其他節(jié)點(diǎn)或自循環(huán)的強(qiáng)連通分量不同,因此本系統(tǒng)可將這些節(jié)點(diǎn)不同地標(biāo)識(shí)。例如,系統(tǒng)可不將孤立節(jié)點(diǎn)標(biāo)識(shí)為強(qiáng)連通分量。在框395中繼續(xù),系統(tǒng)將之前存儲(chǔ)在臨時(shí)儲(chǔ)存設(shè)備中的節(jié)點(diǎn)移除,直至移除所接收的節(jié)點(diǎn),其中所移除的節(jié)點(diǎn)是一強(qiáng)連通分量集。例如,系統(tǒng)可將節(jié)點(diǎn)彈出堆棧,直至將根節(jié)點(diǎn)彈出堆棧。在框395之后,這些步驟結(jié)束。圖4是示出在一個(gè)實(shí)施例中的圖遍歷系統(tǒng)處理節(jié)點(diǎn)的派生節(jié)點(diǎn)的處理過程的流程圖。在框410中開始,系統(tǒng)選擇父節(jié)點(diǎn)的第一派生節(jié)點(diǎn),其中這些節(jié)點(diǎn)是具有一個(gè)或多個(gè)節(jié)點(diǎn)以及連接節(jié)點(diǎn)的多個(gè)邊的圖數(shù)據(jù)結(jié)構(gòu)的一部分。在一些情況中(諸如邊是自循環(huán)的), 第一派生節(jié)點(diǎn)和父節(jié)點(diǎn)可以是同一個(gè)節(jié)點(diǎn)。在判決框420中繼續(xù),如果派生節(jié)點(diǎn)先前在搜索期間沒有被訪問過,則系統(tǒng)在框 430中繼續(xù),否則系統(tǒng)跳轉(zhuǎn)至框440。對每個(gè)派生節(jié)點(diǎn)進(jìn)行訪問,作為參考圖2和圖3所描述的深度優(yōu)先搜索的一部分。對派生節(jié)點(diǎn)的重新訪問可表示引導(dǎo)到派生節(jié)點(diǎn)的邊的循環(huán)。在框430中繼續(xù),系統(tǒng)標(biāo)識(shí)與所選擇的派生節(jié)點(diǎn)相關(guān)聯(lián)的強(qiáng)連通分量、入口和出口。例如,系統(tǒng)可調(diào)用正經(jīng)過所選擇的派生節(jié)點(diǎn)作為當(dāng)前根節(jié)點(diǎn)的循環(huán)函數(shù),以循環(huán)標(biāo)識(shí)強(qiáng)連通分量、 入口和出口。在判決框440中繼續(xù),如果該派生節(jié)點(diǎn)位于堆棧上,則系統(tǒng)在框450中繼續(xù),否則本系統(tǒng)在框460中繼續(xù)。不位于堆棧上的派生節(jié)點(diǎn)表示之前所標(biāo)識(shí)的強(qiáng)連通分量集包括該派生節(jié)點(diǎn)或該派生節(jié)點(diǎn)是孤立節(jié)點(diǎn)。因此,在父節(jié)點(diǎn)和所選擇的派生節(jié)點(diǎn)之間的邊在強(qiáng)連通分量之間通過出口到入口。在框450中繼續(xù),系統(tǒng)將低鏈接值設(shè)置為父節(jié)點(diǎn)的低鏈接值、 所選擇的派生節(jié)點(diǎn)的低鏈接值以及派生節(jié)點(diǎn)的索引中的較低的那個(gè),低鏈接值跟蹤從所選擇的派生節(jié)點(diǎn)可到達(dá)的節(jié)點(diǎn)的最低索引。具有更低的低鏈接值的父節(jié)點(diǎn)表示該節(jié)點(diǎn)是強(qiáng)連通分量集的一部分,但不是根(父節(jié)點(diǎn)或更高的節(jié)點(diǎn)是根)。在框450之后,系統(tǒng)跳轉(zhuǎn)到框 470。在框460中繼續(xù),系統(tǒng)將所選擇的派生節(jié)點(diǎn)的父節(jié)點(diǎn)標(biāo)記為出口節(jié)點(diǎn),并且該派生節(jié)點(diǎn)是入口節(jié)點(diǎn)。不和它們的父節(jié)點(diǎn)一起在堆棧上的派生節(jié)點(diǎn)此時(shí)在處理中是一分立的強(qiáng)連通分量集的一部分或是孤立節(jié)點(diǎn),因此它們之間的連接是入口 /出口路徑。在判決框 470中繼續(xù),如果存在更多的派生節(jié)點(diǎn),則系統(tǒng)循環(huán)到框410以選擇下一個(gè)派生節(jié)點(diǎn),否則系統(tǒng)完成。在框470之后,這些步驟結(jié)束。在圖2、3、4的處理之后,其他組件可查看指示每個(gè)強(qiáng)連通分量集、哪些節(jié)點(diǎn)是入口、哪些節(jié)點(diǎn)是出口、以及每一個(gè)強(qiáng)連通分量集中具有最多入口(或出口,取決于目的)的節(jié)點(diǎn)的結(jié)果。在一些實(shí)施例中,圖遍歷系統(tǒng)不將那些非自循環(huán)的單獨(dú)節(jié)點(diǎn)標(biāo)識(shí)為強(qiáng)連通分量。 強(qiáng)連通分量的傳統(tǒng)定義包括那些不具有任何邊的葉節(jié)點(diǎn)的節(jié)點(diǎn)作為強(qiáng)連通分量。通常對于使用本系統(tǒng)來標(biāo)識(shí)強(qiáng)連通分量或入口及出口的軟件組件而言,對這些節(jié)點(diǎn)具有較少的或不同的關(guān)注。在圖4的框450中,通過將低鏈接值設(shè)置為比所有節(jié)點(diǎn)索引更高的數(shù)目并將該值重設(shè)為索引值,系統(tǒng)可將孤立節(jié)點(diǎn)與自循環(huán)的單個(gè)節(jié)點(diǎn)或其它作為強(qiáng)連通分量多節(jié)點(diǎn)組的一部分的節(jié)點(diǎn)相區(qū)分開。這可以在圖遍歷期間完成,僅增加了少量的處理時(shí)間,且不增加額外的時(shí)間復(fù)雜度級(jí)數(shù)。在一些實(shí)施例中,圖遍歷系統(tǒng)將其它用于標(biāo)識(shí)強(qiáng)連通分量的算法修改為也標(biāo)識(shí)入口和出口。雖然在此描述了對Tarjan的算法的修改,其它用于尋找強(qiáng)連通分量的算法(諸如,Gabow或Kosaraju的算法)可被本系統(tǒng)所使用以在標(biāo)識(shí)強(qiáng)連通分量的同時(shí)標(biāo)識(shí)入口和出口,且不增加額外的時(shí)間復(fù)雜度級(jí)數(shù)。在一些實(shí)施例中,本圖遍歷系統(tǒng)在每個(gè)所標(biāo)識(shí)的強(qiáng)連通分量集中執(zhí)行深度優(yōu)先搜索以標(biāo)識(shí)循環(huán)邊。循環(huán)邊是返回所選定的起始節(jié)點(diǎn)的那些邊。因?yàn)閷ρh(huán)邊的標(biāo)識(shí)是取決于哪個(gè)節(jié)點(diǎn)被選定為起始節(jié)點(diǎn),本系統(tǒng)可使用不怎么隨時(shí)間變化的特征來選擇節(jié)點(diǎn)。例如,本系統(tǒng)可選擇特定強(qiáng)連通分量集中的具有最大數(shù)目的入口的節(jié)點(diǎn)而不是其它強(qiáng)連通分量來作為起始節(jié)點(diǎn)。在調(diào)用圖中,這樣的節(jié)點(diǎn)表示被頻繁調(diào)用的函數(shù),其不怎么隨時(shí)間而改變。從上文將會(huì)認(rèn)識(shí)到,雖然在此已出于說明目的描述了圖遍歷系統(tǒng)的具體實(shí)施例, 但是可以做出各種修改而不背離本發(fā)明的精神和范圍。相應(yīng)地,本發(fā)明不受限制,只受所附的權(quán)利要求書的限制。
權(quán)利要求
1.一種計(jì)算機(jī)可執(zhí)行方法,用于在圖中標(biāo)識(shí)強(qiáng)連通分量的同時(shí)標(biāo)識(shí)入口和出口,其特征在于,所述方法包括接收待標(biāo)識(shí)強(qiáng)連通分量、入口和出口的圖數(shù)據(jù)結(jié)構(gòu)的節(jié)點(diǎn)(310);將所接收的節(jié)點(diǎn)的索引設(shè)置為遞增值,當(dāng)遇到圖數(shù)據(jù)結(jié)構(gòu)中所標(biāo)識(shí)的節(jié)點(diǎn)時(shí),所述遞增值跟著所述節(jié)點(diǎn)的計(jì)數(shù)(320);將所接收的節(jié)點(diǎn)的低鏈接值初始化為比圖數(shù)據(jù)結(jié)構(gòu)中的節(jié)點(diǎn)數(shù)目更大的數(shù)目(330), 其中低鏈接值跟蹤通過跟著連接到節(jié)點(diǎn)的邊可到達(dá)的其它節(jié)點(diǎn)的最低索引;將該節(jié)點(diǎn)與可能是強(qiáng)連接分量集的一部分的任何其它節(jié)點(diǎn)一起存儲(chǔ)在臨時(shí)儲(chǔ)存設(shè)備中(340);確定所接收的節(jié)點(diǎn)是否具有任何派生節(jié)點(diǎn)(350);當(dāng)確定所接收的節(jié)點(diǎn)具有派生節(jié)點(diǎn)時(shí),處理所接收的節(jié)點(diǎn)的派生節(jié)點(diǎn)以確定每個(gè)派生節(jié)點(diǎn)其自身是否是強(qiáng)連通分量集的根(350);以及如果節(jié)點(diǎn)索引等于節(jié)點(diǎn)LowLink值(370),將節(jié)點(diǎn)標(biāo)識(shí)為強(qiáng)連通分量集的根(380);以及將之前存儲(chǔ)在臨時(shí)儲(chǔ)存設(shè)備中的節(jié)點(diǎn)移除,直至移除所接收的節(jié)點(diǎn)(395),其中所移除的節(jié)點(diǎn)是一強(qiáng)連通分量集;其中以上步驟由至少一個(gè)處理器來執(zhí)行。
2.如權(quán)利要求1所述的方法,其特征在于,接收節(jié)點(diǎn)包括接收節(jié)點(diǎn)作為循環(huán)軟件函數(shù)的參數(shù),所述循環(huán)軟件參數(shù)用于標(biāo)識(shí)強(qiáng)連通分量、入口和出口。
3.如權(quán)利要求1所述的方法,其特征在于,設(shè)置所接收的節(jié)點(diǎn)的索引包括存儲(chǔ)在遍歷圖數(shù)據(jù)結(jié)構(gòu)的節(jié)點(diǎn)期間所共享的全局變量的當(dāng)前值,并遞增所述全局變量的值。
4.如權(quán)利要求1所述的方法,其特征在于,初始化低鏈接值包括選擇允許將孤立節(jié)點(diǎn)與連接到其它節(jié)點(diǎn)的節(jié)點(diǎn)相區(qū)分開的值。
5.如權(quán)利要求1所述的方法,其特征在于,在遍歷圖數(shù)據(jù)結(jié)構(gòu)期間更新低鏈接值,并測試低鏈接值以確定節(jié)點(diǎn)是否是強(qiáng)連通分量集的根節(jié)點(diǎn)。
6.如權(quán)利要求1所述的方法,其特征在于,存儲(chǔ)所接收的節(jié)點(diǎn)包括將所接收的節(jié)點(diǎn)推送入堆棧,在遍歷圖數(shù)據(jù)結(jié)構(gòu)期間使用可能是相同的強(qiáng)連通分量集的一部分的節(jié)點(diǎn)更新所述堆棧,且其中移除節(jié)點(diǎn)包括將節(jié)點(diǎn)彈出堆棧,直至將根節(jié)點(diǎn)彈出堆棧。
7.如權(quán)利要求1所述的方法,其特征在于,確定所接收的節(jié)點(diǎn)是否具有任何派生節(jié)點(diǎn)包括標(biāo)識(shí)將所接收的節(jié)點(diǎn)作為源節(jié)點(diǎn)的一條或多條邊。
8.如權(quán)利要求1所述的方法,其特征在于,處理派生節(jié)點(diǎn)包括依次使用每個(gè)派生節(jié)點(diǎn)循環(huán)地調(diào)用用于遍歷圖數(shù)據(jù)結(jié)構(gòu)的軟件函數(shù)。
9.如權(quán)利要求1所述的方法,其特征在于,將節(jié)點(diǎn)標(biāo)識(shí)為強(qiáng)連通分量集的根包括確定從當(dāng)前節(jié)點(diǎn)無法到達(dá)更低的索引節(jié)點(diǎn)。
10.如權(quán)利要求1所述的方法,其特征在于,將節(jié)點(diǎn)標(biāo)識(shí)為強(qiáng)連通分量集的根包括將節(jié)點(diǎn)添加到強(qiáng)連通分量的根節(jié)點(diǎn)列表。
11.如權(quán)利要求1所述的方法,其特征在于,還包括如果節(jié)點(diǎn)索引小于節(jié)點(diǎn)低鏈接值, 則如果節(jié)點(diǎn)是沒有任何邊的孤立節(jié)點(diǎn),那么將節(jié)點(diǎn)從臨時(shí)儲(chǔ)存設(shè)備中移除,使得該節(jié)點(diǎn)不被標(biāo)識(shí)為強(qiáng)連通分量。
12.一種用于有效地標(biāo)識(shí)圖數(shù)據(jù)結(jié)果中的強(qiáng)連通分量的入口和出口的計(jì)算機(jī)系統(tǒng),其特征在于,所述系統(tǒng)包括被配置成執(zhí)行軟件指令的處理器和存儲(chǔ)器;圖存儲(chǔ)器(110),被配置為存儲(chǔ)與一個(gè)或多個(gè)圖有關(guān)的信息,信息包括由所述系統(tǒng)確定的節(jié)點(diǎn)、邊以及強(qiáng)連通分量信息;初始化組件(120),被配置為初始化一個(gè)或多個(gè)索引變量,并準(zhǔn)備標(biāo)識(shí)所選擇的圖數(shù)據(jù)結(jié)構(gòu)中的強(qiáng)連通分量、入口和出口 ;圖搜索組件(130),被配置為執(zhí)行對所選擇的圖數(shù)據(jù)結(jié)構(gòu)的搜索,以標(biāo)識(shí)強(qiáng)連通分量、 入口和出口;SCC標(biāo)識(shí)組件(140),被配置為標(biāo)識(shí)所選擇的圖數(shù)據(jù)結(jié)構(gòu)的強(qiáng)連通分量;入口 /出口標(biāo)識(shí)組件(150),被配置為在標(biāo)識(shí)強(qiáng)連通分量的遍歷期間標(biāo)識(shí)強(qiáng)連通分量之間的入口和出口 ;以及報(bào)告組件(170),被配置為提供搜索結(jié)果,并標(biāo)識(shí)強(qiáng)連通分量、入口和出口。
13.如權(quán)利要求12所述的系統(tǒng),其特征在于,所述初始化組件(120)進(jìn)一步被配置為標(biāo)識(shí)要處理的圖、初始化被用于對搜索中所遇到的每個(gè)節(jié)點(diǎn)進(jìn)行計(jì)數(shù)的全局節(jié)點(diǎn)計(jì)數(shù)、并 創(chuàng)建用于存儲(chǔ)可能是強(qiáng)連通的節(jié)點(diǎn)的堆棧。
14.如權(quán)利要求12所述的系統(tǒng),其特征在于,所述圖搜索組件進(jìn)一步被配置為標(biāo)識(shí)所選擇的圖數(shù)據(jù)結(jié)構(gòu)的根節(jié)點(diǎn),并開始深度優(yōu)先搜索以遍歷整個(gè)圖。
15.如權(quán)利要求12所述的系統(tǒng),其特征在于,所述SCC標(biāo)識(shí)組件進(jìn)一步被配置為接收潛在根節(jié)點(diǎn)、基于初始化的全局計(jì)數(shù)來設(shè)置節(jié)點(diǎn)索引、將低鏈接值初始化為高數(shù)目以指示還沒有遇到任何連接,并開始對節(jié)點(diǎn)的派生節(jié)點(diǎn)的循環(huán)搜索。
全文摘要
在此描述了有效識(shí)別強(qiáng)連通分量并同時(shí)識(shí)別入口、出口以及相應(yīng)的邊的圖遍歷系統(tǒng)。入口和出口節(jié)點(diǎn)可通過在識(shí)別強(qiáng)連通分量之后掃描每個(gè)節(jié)點(diǎn)來識(shí)別,但重新訪問這些節(jié)點(diǎn)引起了不期望的開銷。本圖遍歷系統(tǒng)在當(dāng)正在識(shí)別強(qiáng)連通分量時(shí)在單次遍歷中識(shí)別入口和出口。此外,本系統(tǒng)修改了用于一些應(yīng)用的語義,使得單個(gè)節(jié)點(diǎn)獨(dú)自不被認(rèn)為是強(qiáng)連通分量。因此,本圖遍歷系統(tǒng)允許以可被應(yīng)用于使用有向圖作為數(shù)據(jù)結(jié)構(gòu)的大量計(jì)算機(jī)軟件問題的方式從強(qiáng)連通分量中有效識(shí)別入口和出口。
文檔編號(hào)G06F9/44GK102279738SQ20111016484
公開日2011年12月14日 申請日期2011年6月9日 優(yōu)先權(quán)日2010年6月10日
發(fā)明者S·周, T·H·澤恩 申請人:微軟公司