查找公共子集的算法

时间:2010-10-15 11:28:27

标签: algorithm

我有 N 数量的 S i 数量,每个都有不同的大小。设 m 1 m 2 ,... m n 是各个集合的大小( m i = | S i | ), M 是最大集的大小。我必须找到至少有两个数字的公共子集。例如:

Set  Items
1    10,80,22
2    72, 10, 80, 26,50
3    80,
4    10, 22
5    22, 72, 10, 80, 26,50

所以结果就像那样

Items                Found in sets
10, 22               1, 4
10, 80               1, 2, 5
10, 80, 22           1, 5
10, 72, 80, 26, 50   2, 5

那么如何自动解决这个问题以及各个解决方案的预期复杂性是多少?我需要它尽可能快。

5 个答案:

答案 0 :(得分:4)

由于原始问题要求尽快进行讨论,以下是如何缩短讨论时间。

首先,讨论输出是否呈指数输入。假设你有2个元素和N个集合。假设每个元素属于每个集合;它将需要N行作为您的输入。那么,你应该打印多少行?

我认为您打算打印2 N -N-1行,如下所示:

1,2     1,2
1,2     1,3
.....
1,2     1,N
1,2     2,1
.....
1,2     1,2,3
.....
1,2     1,2,3,...N

由于您打算花费O(2 N )时间打印,您可以选择此页面上的任何建议来计算此信息 - 无论如何您已被指数捕获。

这个论点会让你的讨论非常快。

答案 1 :(得分:2)

你可以这样做 -

  1. 创建哈希表&插入每个项目和键的键。值作为它们所属的集合。 Eg: 10:[0,1,3,4] 80:[0,1,2,4] 22:[0,3,4] 72:[1,4] 26:[1,4] 50:[1,4]

  2. 在哈希表中的每两个元素之后,找到键值的交集。这里(10,80)的交点给出了[0,3,4]。为(10,22)(10,72)做这个......你有你的结果。

  3. 复杂性 - 将M个项目插入哈希表 - O(M) 搜索哈希表中的每个键 - O(1) 密钥值的交叉操作 - O(m ^ 2)[可以优化]

  4. 总的来说,我会说这是O(m ^ 2)算法。但是如果每个“Set”中“Items”的大小不大,那么你就不会注意到性能受到很大影响。

答案 2 :(得分:2)

我能想到的一个解决方案:

使用哈希表,生成该“行”中数字的“一对数字”的所有组合,即O(M * M)时间。

然后使用那些作为哈希键,映射到主数组索引。

For each row of those N elements,
  do the step above... and if the hash already maps to a number, then it is a match,
    then return the pair, or else just put those in the hash

是O(N * M * M)

更新:如果您在评论中说M可以最大为15,那么O(N * M * M)实际上与O(N)相同。


如果您最初的问题是找到所有对,那么

For each row of those N elements,
  do the step first mentioned... and if the hash already maps to a number, 
    then it is a match and just print out the pair if this pair is not printed yet
  and in any event, put the mapping into the hash

to tell whether a pair has been printed, created another hash, such as
  printed_or_not[i,j] = true or false, 
    and make sure to check printed_or_not[i,j] or printed_or_not[j, i]
    because not need to print again if just different order

答案 3 :(得分:2)

您被要求进行所有集合的成对交叉,然后收集大小> = 2的所有结果。

有O(N ^ 2)对。每个交叉点都是O(M)。组合所有结果,通过设置内容对它们进行排序以计算重复项是N ^ 2 Log N ^ 2(最坏的情况是每个对的交集是不同的,因此可以有O(N ^ 2)个结果集)

所以我认为复杂度是O((N ^ 2 + N log N)* M)

但某处可能存在错误。

保罗

答案 4 :(得分:0)

我有一些提示。当你循环循环以计算该集合中的数字时,你应该对集合中的所有项目进行排序。您应该添加条件以检查数字是否大于您的搜索值并使用break;为了循环结束。