通用子集算法问题

时间:2009-08-29 02:52:01

标签: algorithm logic set

我有以下问题。

我有一组项目{a1, a2, a3, ... aN}。这些项目中的每一项都可以包含另一组项目{b1, b2, b3, ... bN}。所以最终结果看起来像这样:

a1
  b4
  b22
  b40
  b11
  b9
a2
  b30
  b23
  b9
  b4
  b11
a3
  b22
  b4
  b60
  b9

由于算法的执行,我希望得到符合以下规则的b类对象组:

  1. 如果a型对象下只有多个b型对象存在于该a型对象下,则应将它们分组。
  2. 如果在一个以上的a型对象中使用了多个b型对象,则它们也应该被分组。
  3. 示例:

    b4, b9
    b30, b23
    
    b40, b60, b11 and b22 shouldn't be grouped because there are no pairs for them.
    

    我将在C#中编写此算法的实现,因此最好避免使用其中不存在的数据结构,例如二叉树,链表等。但这不是必需的;所有这些都可以实施。

    澄清:集合可以根据需要包含任意数量的对象,但每个对象不能超过1个。规则是在同一a类型中的所有b类型的唯一对象应该被分组(大于1),并且如果多于1个b类型的对象属于多于1个类型的对象,则它们应该被分组。这些小组应该尽可能大。

    现实生活中的示例:网页是 a-type ,这些网页上使用的CSS文件是 b-type 。为了加快页面的加载速度,您希望将尽可能少的请求发送到服务器,因此您可以组合CSS文件,但是您不希望将仅在几页上使用的文件组合在一起,因为它们将被缓存,您不必再次重新下载它们。

1 个答案:

答案 0 :(得分:2)

首先,创建一个地图,将每个b类型项目与包含该b类型项目的a类型项目的集合相关联。

在您的示例中,您将获得:

b4:{a1,a2,a3}

b9:{a1,a2,a3}

b11:{a1,a2}

b22:{a1,a3}

b23:{a2}

b30:{a2}

b40:{a1}

b60:{a3}

要创建此地图,请扫描a类型对象中的所有b类型对象,如果b类型对象没有关联,请在地图中为其创建条目;但是将a型对象添加到与b型对象关联的集合中。

然后,比较每对可能的集合(O(n2))。如果两个b型对象具有相同的a型对象集合,则将它们合并。

它在地图上实现为一对嵌套循环(I = 1到N-1,J = N + 1到N)。

要比较两个集合,请使用集合库及其比较运算符。

如果a型对象可以用小整数表示,则可以将该集合表示为位数组,这非常紧凑且可以快速比较。