我有 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
那么如何自动解决这个问题以及各个解决方案的预期复杂性是多少?我需要它尽可能快。
答案 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)
你可以这样做 -
创建哈希表&插入每个项目和键的键。值作为它们所属的集合。
Eg: 10:[0,1,3,4]
80:[0,1,2,4]
22:[0,3,4]
72:[1,4]
26:[1,4]
50:[1,4]
在哈希表中的每两个元素之后,找到键值的交集。这里(10,80)的交点给出了[0,3,4]。为(10,22)(10,72)做这个......你有你的结果。
复杂性 - 将M个项目插入哈希表 - O(M) 搜索哈希表中的每个键 - O(1) 密钥值的交叉操作 - O(m ^ 2)[可以优化]
总的来说,我会说这是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;为了循环结束。