天天看點

java 有向無環圖_資料結構筆記:如何随機生成有向無環圖

在驗證有向無環圖相關的各種算法時需要一些測試資料,手動構造的話太麻煩了,于是便想着能不能自動生成一些測試資料來。這個問題的難點在于如何保證生成的圖沒有環,查了一下相關資料,這個可以借助拓撲排序的原理來實作,想象一下一個有向無環圖要對其拓撲排序,需要從圖中找出一個入度為0的頂點,将它和它的出邊都從圖中删除,重複執行這個操作直到圖為空,隻需要逆向執行這個過程即可從拓撲排序的結果恢複出一個有向無環圖,比如下面這個有向無環圖:

java 有向無環圖_資料結構筆記:如何随機生成有向無環圖

對其拓撲排序的結果是:

a, b, c

那麼隻需要随機地将前面頂點連接配接到後面頂點即可将拓撲排序的結果還原為有向無環圖,比如随機地從a連向b或c,從b連向c,不過需要注意的是因為拓撲排序會丢失邊的資訊,是以這個還原并不能保證和原圖一緻。

下面是針對這個原理寫的一個工具類,輸入拓撲排序,根據此拓撲排序生成随機有向無環圖。

表示頂點和其鄰接關系的實體類:

然後是根據拓撲排序生成DAG的工具類:

為了更直覺的觀察生成的結果,我們将其繪制為圖形,這裡使用dot language,IDEA可以借助PlatUML插件友善的渲染,這裡不是介紹工具或語言的用法的,如有興趣請自行查閱相關資料。

測試類,将生成結果轉換為dot language以渲染:

建立.puml檔案,将上面的輸出粘貼進去:

檢視渲染效果:

java 有向無環圖_資料結構筆記:如何随機生成有向無環圖

通過圖形渲染,能夠更直覺的看到,生成的确實是一個有向無環圖,至此實作了測試資料可以自動生成,下面的實驗可以開心的繼續下去了。

.