2010-04-28 26 views
1

我想項目的多個列表合併成一個列表,保留了整體訂單的要求。即:算法 - 合併多個名單,導致獨特的名單和保持秩序

1: A C E 
2: D E 
3: B A D 

result: B A C D E 
以上

,從列表1,我們有ACE,我們後來才知道Ë之前d一定要來,並從清單3中,我們知道,B必須走過了面前,d一定要來B之後和

如果有衝突的排序,應該使用A.第一排序。即

1: A C E 
2: B D E 
3: F D B 

result: A C F B D E 

3與2(B D對D B)衝突,因此將使用2的要求。

如果訂購要求意味着一個項目一定要來之前或之後另一個,如果它之前或之後馬上來臨的時候,或者在開始或列表的末尾,只要總的排序保持沒關係。

這是使用VB.Net開發的,所以LINQy解決方案(或任何.Net解決方案)會很好 - 否則指針的方法會很好。

編輯:編輯來讓例子2有意義(最後一分鐘的變化已經使得它無效)

+0

爲什麼在第二個例子中衝突的排序?在我看來,'C B F D E'滿足所有的排序...... – 2010-04-28 09:05:26

回答

3

關鍵字你是在爲「拓撲排序」可能感興趣。基於此的解決方案如下所示:

  • 創建一個空的有向圖。爲了
  • 過程序列,對於每兩個連續元素X,Y中的序列添加一個邊緣X-> Y到圖,除非這將形成循環。
  • 上圖的頂點執行拓撲排序。結果序列應該滿足您的要求。
+0

感謝您關於拓撲排序的提示 - 這不是我以前聽說過的,而是我的問題的解決方案。以下這個算法的基礎知識在這裏: http://www.brpreiss.com/books/opus6/html/page559.html 我開發了一個解決方案。 我能夠對算法進行修改以防止圖中的循環(即,如果將它作爲子/父添加,如果它已經作爲特定節點的父/子存在,則忽略該項)需要更多測試,但我認爲我已經掌握了基本面。 再次感謝。 – hitch 2010-04-29 01:26:23