我的輸入是一組整數列表。意思是,每個集合都有一個我需要跟蹤的索引。那些(唯一的)集合包含整數,不同的集合可以具有一個或多個共同的整數元素(也可能兩個集合是相同的)。將集合合併爲有向圖
我的目標是將這些集合不是作爲一個列表來表示,而是作爲一個樹狀結構,所以我可以消除多個集合共享的整數元素。該結構是具有人工根節點的有向圖。其他節點是集合中的整數。根節點最多有n個孩子(n是組數)。這些孩子實際上是來自不同組的第一個整數,並且必須由該算法添加。有幾個條件:
- 必須有可能通過樹中的一個路徑重新創建這樣一個集合。
- 通過樹的路徑必須是無歧義的,沒有頂點可以有多個孩子。
- 有一個例外:人工牙根節點被允許多生幾個孩子(那些孩子會成爲起點的路徑重新創建套)
顯然,這將是不可能消除所有重複,但我想找到一個算法,找到最可能的淘汰。這是我不得不尋求幫助。我可以通過手工完成,但不能用正式的算法來表達它,這在所有情況下都可行)。
編輯:但願這個小例子說明了這個問題更好:
我們有三個列表,list0 = [0,3,4,7,8], list1 = [1,2,3,6,7], list3 = [5,6,7,8]
。這些列表的索引是來自根節點R
的第一條邊的標題。在這個第一個邊緣之後,導致到沒有子節點的節點(在這個例子中它是所有三個節點的同一個節點,但不一定是這種情況)。此路徑上節點的所有標題都與相應的索引一起構成列表。
正如您所看到的,值7出現三次,值3,6和8每次兩次。所以最好的情況是擺脫5個不必要的節點。但是,根據我們的條件,沒有節點可以有多於一個孩子,並不總是可以擺脫所有重複。下圖顯示了一個可能的解決方案,其中重複的6和8無法解析。 [邊注:6或8可以與3進行交換,並且仍然具有一個12節點溶液]
我不清楚你想要的結構。你說你可以用手做;你能展示一個或兩個例子以及由此產生的樹嗎?我一點也不清楚你想在「???」上得到什麼*結果,所以我無法幫助你達到目標。 – Prune
我添加了一個例子,並刪除了部分???,很難描述我的算法思想,所以我將它加回來,當我正式化它,使其更好理解。 – flowit
好得多;謝謝。 – Prune