将集合合并为有向图

时间:2017-08-08 16:30:38

标签: algorithm tree graph-algorithm

我的输入是一组整数。意思是,每个集合都有一个我需要跟踪的索引。那些(唯一的)集合包含整数,不同的集合可以有一个或多个共同的整数元素(两个集合也可能相同)。

我的目标是将这些集合表示为不是列表,而是表示为树状结构,因此我可以消除多个集合共享的整数元素。该结构是具有人工根节点的有向图。其他节点是集合中的整数。根节点最多有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节点解决方案。]

enter image description here

1 个答案:

答案 0 :(得分:1)

不知道现有的算法来解决这个问题,但我想我看到了一些攻击。首先,将图形颠倒过来,使其成为一棵简单的树,以 7 为根。接下来,请注意您的"列表"无序:它们将作为集合更好地工作(假设没有重复的值)。

旁注:您可以将此转换为单根问题 - 只需为每个集添加一个新的唯一符号。这将自动成为根节点。

现在你可以使用更像决策树的东西攻击它。子树的递归算法将产生可用的解决方案。您首先尝试分解的偏好应该由启发式驱动,例如

  • 在子树的集合中最常出现的值
  • 所有集合中最大的公共子集。
  • 将从问题中删除大部分元素的子集。例如,3组的3个成员子集将比仅2组的4个成员子集更好。

最后一项不是你在CS 101中解决的问题,并且它不是第一次打击时保证的最佳解决方案。在过去的24小时内,我大部分时间都相信自己没有直接的单一攻击来为您提供所有输入的最佳解决方案。

相关问题