1. 程式人生 > 其它 >演算法構造domaintree

演算法構造domaintree

 

1,D{n} 的求解

求一個一個流圖的所有節點的支配節點的演算法 輸入:一個流圖G,G的節點集合是{N},邊的集合是{E} 輸出:對於N中的每個節點n,給出D{n},即所有支配節點n的節點集合D{n} 方法: 對於N中所有節點 D{n} = OUT[n]     圖1 演算法執行過程 D{1} = {1} D{2} = {2} U D{1} = {1,2} D{3} = {3} U {D{1} ∩ D{2} ∩D{4} ∩D{8} } = {3} U {{1} ∩ {1,2} ∩{1-N} ∩D{1-N} = {1,3} D{4} = {1,3,4} D{5} = {1,3,4,5} D{6} = {1,3,4,6} D{7} = {1,3,4,7} D{8} = {1,3,4,7,8} D{9} = {1,3,4,7,8,9} D{10} = {1,3,4,7,8,10}

2,深度優先排序

對一個流圖G的深度優先遍歷。 從入口節點開始,並首先訪問離入口節點最遠的節點,一個深度優先過程過程中的搜尋路徑形成一個深度優先樹{Depth-First-Spanning-Tree} 如圖1右側,實線邊構成了一個深度優先生成樹。虛線邊是流圖中的其他邊。 這個樹的深度優先遍歷是1-3-4-6-7-8-10,回退到8,在訪問9,回到8,回到7-6-4,前進到5,從5回到4,回到3-1,最後從1前進到2   深度優先排序: 對一個流圖G,他的生成樹是T,那麼對T的後序遍歷的反序列就是一個流圖G的一個深度優先排序。 對於圖1的深度生成樹 前序遍歷 1 3 4 6 7 8 10 9 5 2 後續遍歷 10 9 8 7 6 5 4 3 2 1 深度優先排序 1 2 3 4 5 6 7 8 9 10   深度優先生成樹和深度優先排序 輸入:一個流圖G 輸出:G的一個深度優先樹T和一個深度優先排序 方法:我們用遞迴過程search(n),該演算法先將G中所有節點初始化為unvisited,然後呼叫search(n0),其中n0是入口節點,當它呼叫search(n),首先將n設定為visited,未免將n再次加入樹中,使用一個c作為計數器,G的節點總數,一個倒計數到1,在演算法執行的時候,把c的值賦給節點n的深度優先編號dfn[n],邊的集合T形成了G的深度優先生成樹。 Search (n) {   將n設定為visited for(n的所有後繼s){ if(s標記為unvistied){ 將邊n->s 加入T中; search(s) } dfn[n] = c; c = c - 1; } main(){ T = {}//空集 for(G的所有節點n) 把n標記為unvisted c = G 的節點個數 search() }     深度生成樹中的邊 1,前進邊 從生成樹節點到達後代節點的邊 。 2,後退邊 從生成樹到達其祖先的邊。 3,交叉邊,兩個節點不存在父子關係。不互為祖先。