我有以下问题。
我有一组项目{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类对象组:
示例:
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文件,但是您不希望将仅在几页上使用的文件组合在一起,因为它们将被缓存,您不必再次重新下载它们。
答案 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型对象可以用小整数表示,则可以将该集合表示为位数组,这非常紧凑且可以快速比较。