算法问题 - 找到最不常见的子集

时间:2012-10-23 18:33:50

标签: algorithm

a是具有多个“类别”的对象,例如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)类别进行分组。但是,这还不完整。我必须以某种方式限制输入域以使其成为可能。

我是否会错过一些明显的东西?您可以指向我的任何问题域的提示?有没有人认识到这种问题的任何其他方法。

2 个答案:

答案 0 :(得分:7)

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

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

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

按照内容对b组进行排序。

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

答案 1 :(得分:0)

如果您可以对类别进行排序(如果没有,那么LCS算法无法识别{b3,b4}和{b4,b3}),我认为您正在使用LCS进入正确的轨道。如果您可以对它们进行强制排序和排序,那么我认为这样的事情可以起作用:


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