我的输入是一组整数列表。意思是,每个集合都有一个我需要跟踪的索引。那些(唯一的)集合包含整数,不同的集合可以具有一个或多个共同的整数元素(也可能两个集合是相同的)。将集合合并为有向图
我的目标是将这些集合不是作为一个列表来表示,而是作为一个树状结构,所以我可以消除多个集合共享的整数元素。该结构是具有人工根节点的有向图。其他节点是集合中的整数。根节点最多有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