簡體   English   中英

在有向無環圖的分裂和合並處插入節點

[英]Inserting nodes at split and merges of directed acyclic graphs

我有以下有向無環圖,其中邊緣方向從上到下

                A
                |  
                B
               / \  
              C   D
             / \  |    
            E   F | 
             \ /  | 
              G   |
               \ /
                H 

並且我想插入特殊的拆分節點,節點拆分和合並節點再次合並,即我希望將上面的圖形結構轉換為下面的圖形

                A
                |
                B  
                | 
               B-S
               / \  
              C   D
              |   |  
             C-S  |  
             / \  |    
            E   F | 
             \ /  | 
             C-M  |
              |   | 
              G   |
               \ /
               B-M 
                |
                H 

如何進行上述轉換?

我將把圖片改寫成這樣,這樣就清楚了哪個MS是相關的。 我也在考慮這棵樹最多有兩個孩子,但它可以很容易地在合並部分更新為更多的孩子。

            A
            |
            B  
            | 
           B-S1
           / \  
          C   D
          |   |  
         C-S2 |  
         / \  |    
        E   F | 
         \ /  | 
         C-M2 |
          |   | 
          G   |
           \ /
           B-M1
            |
            H 

主要原則是,當您進行拆分時,您必須通過所有其他節點傳遞有關該信息的信息,直到您再次合並它們。

算法如下:

開始:創建stack變量並將A與空tokenStack一起推送到它(它將像一個 object {node: A, tokenStack: {}}

  1. stack中取出item
  2. 使用item.parents.length檢查父母的數量
    • 如果是2,檢查item.token是否存在
      • 如果沒有,則從tokenStack中取出最后一項並將其保存在item.token
        • 跳過下面的所有其他內容並從 1 繼續。
      • 如果存在值,它應該與您在tokenStack中的最后一個值相同。 從你的tokenStack中取出那個值,你可以繼續 3。
  3. 使用item.childrens.length檢查孩子的數量
    • 如果等於 1,則將該子項與未更改tokenStack一起推入stack
    • 如果有兩個孩子,則進行拆分,創建令牌(即唯一字符串),將此令牌添加到tokenStack ,將其保存到當前item.token並將兩個孩子與tokenStack一起推送到stack

現在您完成了所有操作,Split 和 Merge 節點具有相同的item.token

注意:如果您想稍后調查哪些節點位於哪些拆分分支的左/右部分,您還可以在流程期間將有關所有現有令牌的信息保存在tokenStack中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM