Dagx中DAG的幾個性質
DAG是有向無環圖,它由結點和邊組成。在Dagx中有一條特殊的路徑,稱為主鏈,它用來實現DAG中結點的全域性定序。一般來講,Dagx的DAG可以表示為如下形式,其中中間粗箭頭連線的為主鏈。

對於DAG中的一個結點,Dagx定義瞭如下幾個屬性:
1. level:表示結點所處的層級,通過遞迴方式進行計算,子結點的level等於父結點中最大的level加1,記作符號LL。
2. main_chain_index:表示結點與主鏈關聯的序號,稱為主鏈序號,記作符號MCIMCI。如果結點位於主鏈上,則MCIMCI為主鏈上前一結點的MCIMCI加1;如果結點不在主鏈上,則其MCIMCI為主鏈上最早包含該結點的主鏈結點的MCIMCI(即離開主鏈的最小位置);若結點不在主鏈上,且主鏈上任何結點都不包含該結點,則MCIMCI為空。
3. latest_included_mc_index:表示該結點包含的主鏈節點的最大MCIMCI(即從該結點回到主鏈的最大位置),記作符號LIMCILIMCI。創世結點的LIMCILIMCI為空。
4. witnessed_level:表示結點的見證級別,從當前結點的最優父結點沿主鏈開始回溯,當路徑上出現多於7個不同見證人發出的結點時停止回溯,witnessed_level等於回溯停止處的結點的級別level,記作符號WLWL。
給定結點ii和結點jj,它們對應的屬性分別記作:
· LiLi, MCIiMCIi, LIMCIiLIMCIi, WLiWLi
· LjLj, MCIjMCIj, LIMCIjLIMCIj, WLjWLj
如果存在一條從結點jj到達結點ii的路徑,則稱結點ii被結點jj包含或者結點jj包含結點ii。那麼,我們可以推導得出以下一系列的性質:
性質1:子結點的level一定大於父結點的level。
顯然,根據結點level的定義可以很容易得到上面的性質。進一步地,我們可以得到:
性質2:如果結點ii被結點jj包含,則一定有Lj>LiLj>Li;如果Li≥LjLi≥Lj,則結點ii一定不被結點jj包含。
通過反證法可以很容易得出以下性質:
性質3:當MCIMCI不為空時,子結點的MCIMCI一定大於等於父結點的MCIMCI。
性質4:如果結點ii被結點jj包含,則一定有MCIj≥MCIiMCIj≥MCIi;如果MCIi>MCIjMCIi>MCIj,則結點ii一定不被結點jj包含。
性質5:子結點的LIMCILIMCI一定大於等於父結點的LIMCILIMCI。
性質6:如果結點ii被結點jj包含,則一定有LIMCIj≥LIMCIiLIMCIj≥LIMCIi;如果LIMCIi>LIMCIjLIMCIi>LIMCIj,則結點ii一定不被結點jj包含。
性質7:當子結點與父結點的見證人列表相同時,子結點的WLWL一定大於等於父結點的WLWL。
性質8:如果結點 ii 被結點jj包含,則一定有WLj≥WLiWLj≥WLi;如果WLi>WLjWLi>WLj,則結點ii一定不被結點jj包含。
此外,在結點的MCIMCI和LIMCILIMCI這兩個屬性之間也具有如下幾條性質:
性質9:當一個結點的MCIMCI不為空時,則一定滿足MCI > LIMCI。
性質10:如果結點ii被結點jj包含,則一定有MCIj≥MCIi>LIMCIiMCIj≥MCIi>LIMCIi以及MCIj>LIMCIj≥LIMCIiMCIj>LIMCIj≥LIMCIi。
性質11:如果LIMCIi≥MCIjLIMCIi≥MCIj,且MCIjMCIj不為空,則結點ii一定不被結點jj包含;如果LIMCIj≥MCIiLIMCIj≥MCIi,且MCIiMCIi不為空,則結點ii一定被結點jj包含。
性質12:如果結點ii被結點jj包含,且結點jj位於主鏈上,則LIMCIj≥MCIiLIMCIj≥MCIi。
這些性質在快速判斷兩個結點之間的關聯關係時具有很大的作用,可以提高計算速度。具體的一些程式碼示例可以參考 graph.js。
作者:Alan&單向研究院
宣告:登載此文出於傳遞更多資訊之目的,並不意味著贊同其觀點或證實其描述。