【发布时间】:2017-01-02 10:46:15
【问题描述】:
随机选择两个集合,两个集合都包含不同的键(一个键可能属于多个集合,一个集合永远不能包含重复的键)。
返回一个整数,表示属于两个集合的键数。
例如 intersect({1,2,3,4},{3,4,5}) 返回 2 。
我只需要十字路口的大小。我不需要确切知道十字路口有哪些钥匙。
是否有任何数据结构在不到 O(n) 时间内支持这种操作?
编辑:
读取数据确实需要 O(n) 时间,但 这不会导致您无法在 O(n) 时间内完成交集运算的结论 .
想象一下这个场景:
我有 N 个集合,每个包含 100 个键。我读了它们,那是 N*100 操作。现在我想知道女巫对集合有最大的交集,即 O(N²) 交集操作。所以我想降低交集操作的复杂性。我真的不关心读取和构造集合需要多少时间,最多 N*100,这与 O(N²) 的交集操作相比没什么。
请注意,您无法通过小于 O(N²) 的交集运算找到具有最大交集的集合对,我可以证明这一点。您必须完成所有相交操作。
(他的基本思想是,让我们想象一个完整的图,有 N 个顶点,每个顶点代表一个集合,Nx(N-1)/2 个边,每个代表连接对的交点。现在给每个边一个你想要的非负权重(代表交叉点大小),我总是可以构造 N 个集合满足那些 Nx(N-1)/2 个边缘权重。这证明了我的主张。)
【问题讨论】:
-
这些集合是否有任何潜在有用的属性,例如,也许它们通常可以描述为几个范围的并集?
-
获得更好复杂性的唯一方法是获得有关数据的更多信息。即便如此,我也不确定你能否达到 O(log n)。
-
我在下面写了一个证明这样的算法不存在。
-
无论你切片它,你都必须阅读所有的项目。没有比 O(n) 更好的解决方案。
-
@JimMischel 你的理由不充分。
标签: algorithm data-structures time-complexity intersection set-operations