【问题标题】:algorithm issue - find the least common subset算法问题 - 找到最不常见的子集
【发布时间】:2012-10-23 18:33:50
【问题描述】:

a 是具有多个“类别”的对象,b,例如 a1 具有三个类别 b1、b2、b3。 问题在于,将类别的数量(可能会变得相当大)减少到总是一起出现的组中。一个“最大公共子集”的东西。

例如,给定以下数据集:

a1{ b1,b2,b3 } 
a2{ b2,b3 }
a3{ b1,b4 }

我们可以发现 b2 和 b3 总是在一起..

b23 = {b2,b3}

..我们可以将类别集缩减为:

a1{ b1, b23 }
a2{ b23 }
a3{ b1,b4 }

所以,我的问题是找到一些算法来解决这个问题。

我已经开始研究Longest Common Sequence 问题,它可能是一个解决方案。即像这样重复分组类别b' = LCS(set_of_As),直到遍历所有类别。然而,这并不完整。我必须以某种方式限制输入域才能做到这一点。

我错过了一些明显的东西吗?您可以指出我的问题域的任何提示吗?有没有人认识到解决此类问题的任何其他方法。

【问题讨论】:

  • 你很有可能是正确的。 LCS 绝对可以解决手头的问题。 您的主要问题的最短答案不,您没有错过任何明显的事情。不过,这似乎是一个不错的问题。
  • 真的,您需要做的就是运行与获得 b23 对的相同的配对算法。重复它,直到集合没有变化。第一次运行将成对,第二次运行将成对成对或成对成对和单成对。因此,您将涵盖三重和四重重复。
  • 我认为你可以通过说你的类别是有序的来提高你的表现。因此,如果您绘制一个包含所有类别 x 所有对象(axb 矩阵)的矩阵,您所要做的就是找到相等的列。我知道,它也很大,但可能更快:)
  • 将集合转换为矩阵并比较列类似于我在下面的答案 - 但会占用更多内存并且比较列将效率低下,除非您对列进行排序。
  • 确实,您的方法似乎更快

标签: algorithm


【解决方案1】:

将您的集合转换为包含 a 的 b 集合:

b1 { a1, a3 }
b2 { a1, a2 }
b3 { a1, a2 }
b4 { a3 }

确保新 b 集的内容已排序。

按内容对 b 集进行排序。

具有相同元素的任何两个相邻集合都是出现在同一 a 集合中的 b。

【讨论】:

  • 另一个优化是先按长度排序 b 集,然后按内容排序。
  • 谢谢!没想到。
【解决方案2】:

如果您可以对类别进行排序,我认为您在 LCS 上是正确的(否则,LCS 算法将无法识别 {b3, b4} 和 {b4, b3})。如果您可以对它们进行强制排序和排序,那么我认为这样的事情可能会奏效:


As = {a1={b1, b2},a2={b3},...}
while ((newgroup = LCS(As)) != empty) {
  for (a in As) {
     replace newgroup in a
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多