Algorithm 广义子集算法问题

Algorithm 广义子集算法问题,algorithm,logic,set,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型对象组: 如果a型对象下仅存在一个以上的b型对象,则应将其分组 如果在多个a型对象中使用了多个b型对象,则还应将其分组 示例: b

我有以下问题

我有一组项目
{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型对象组:

  • 如果a型对象下仅存在一个以上的b型对象,则应将其分组
  • 如果在多个a型对象中使用了多个b型对象,则还应将其分组
  • 示例:

    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型对象属于多个a型对象,则应将其分组。小组应尽可能大


    现实生活中的示例:网页是a型的,这些网页上使用的CSS文件是b型的。为了加快页面的加载速度,您希望向服务器发送的请求尽可能少,因此您可以合并CSS文件,但不希望合并仅在少数页面上使用的文件,因为这些文件将被缓存,您无需再次下载。

    首先,创建一个映射,将每个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型对象可以用小整数表示,您可以将集合表示为位数组,这非常紧凑,比较起来也很快。

    C#有链表吗?顺便问一下:您可以尝试澄清分组规则吗?另外,您是否只是试图获取一组对,或者一个组是否可能包含3个或更多b型对象?我理解您为什么将{b4,b9}和{b30,b23}分组,但我无法理解{b4,b60}分组。对此非常抱歉。。那是我的错误,不知道我在想什么。b40和b60也应分组。更正了原来的帖子。谢谢你注意到这一点!回答得很好。谢谢而且也很容易。。我自己应该想到的:-)