考虑集合A1
,A2
,...,An
的集合。我想确定最有效的算法来查找这些集合中的哪一个是不同集合B
的子集。
例如,让算法的输入为:
A1 = [1 2]
A2 = [2 3 4]
A3 = [1 3]
B = [1 2 3]
算法应返回:
output = [1 3]
由于A1
和A3
是B
的子集,但A2
不是。{/ p>
答案 0 :(得分:2)
简单的O(N)答案:从两个列表开始排序。选择较短的列表,并为每个条目检查它是否存在于另一侧。你不需要对其他列表进行花哨的搜索,只需保持一个指针并递增,直到我们找到或传递我们的目标号码。
另一方面,你仍然可以加速" O(N)"通过使计算机的每个步骤更简单的操作。例如,如果您只需要计算共有多少个数字,您可以使用bitmask
快速计算出这个数字。如果要将多个列表与一个特殊列表进行比较,并且大多数数字不相同,则可以创建Bloom Filter。这可以告诉你"数字X不在Y和#34;很快。它无法告诉您数字是否存在 - 您必须手动仔细检查。如果您认为MOST数字是未命中的,那么这是一个速度胜利,只有少数会被命中。