[英]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
如何進行上述轉換?
我將把圖片改寫成這樣,這樣就清楚了哪個M
和S
是相關的。 我也在考慮這棵樹最多有兩個孩子,但它可以很容易地在合並部分更新為更多的孩子。
A
|
B
|
B-S1
/ \
C D
| |
C-S2 |
/ \ |
E F |
\ / |
C-M2 |
| |
G |
\ /
B-M1
|
H
主要原則是,當您進行拆分時,您必須通過所有其他節點傳遞有關該信息的信息,直到您再次合並它們。
算法如下:
開始:創建stack
變量並將A
與空tokenStack
一起推送到它(它將像一個 object {node: A, tokenStack: {}}
stack
中取出item
item.parents.length
檢查父母的數量
item.token
是否存在
tokenStack
中取出最后一項並將其保存在item.token
tokenStack
中的最后一個值相同。 從你的tokenStack
中取出那個值,你可以繼續 3。item.childrens.length
檢查孩子的數量
tokenStack
一起推入stack
tokenStack
,將其保存到當前item.token
並將兩個孩子與tokenStack
一起推送到stack
現在您完成了所有操作,Split 和 Merge 節點具有相同的item.token
注意:如果您想稍后調查哪些節點位於哪些拆分分支的左/右部分,您還可以在流程期間將有關所有現有令牌的信息保存在tokenStack
中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.