随机选择两个集合,每个集合都包含不同的键(一个键可能属于多个集合,一个集合永远不会包含重复的键)。
返回一个整数,表示属于两个集合的键的数量。
例如,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边权。这证明了我的说法。)
返回一个整数,表示属于两个集合的键的数量。
例如,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边权。这证明了我的说法。)