好的,所以我需要设计以下算法(无需代码,只需步骤):
给定两个集合A
,B
长度m
分别n
为,其中每个集合中的数字是不同的,未排序的,并且m<n
. 计算两个集合的交集和并集,在任一结果中都没有任何重复值。该算法应该在 O(mlog(n)) 时间内工作。
我很难找出具有如此时间复杂度的算法。最初,我想连接两个未排序的数组,然后对其执行合并排序并删除重复项,但这超出了很多复杂性。
好的,所以我需要设计以下算法(无需代码,只需步骤):
给定两个集合A
,B
长度m
分别n
为,其中每个集合中的数字是不同的,未排序的,并且m<n
. 计算两个集合的交集和并集,在任一结果中都没有任何重复值。该算法应该在 O(mlog(n)) 时间内工作。
我很难找出具有如此时间复杂度的算法。最初,我想连接两个未排序的数组,然后对其执行合并排序并删除重复项,但这超出了很多复杂性。
我错过了性能要求。解决方案在 中O(n log(m))
,而不是在O(m log(n) )
.
恕我直言,所需的运行时是不可能的。证据已经在评论中勾勒出来了。基本思想是去极端情况下A
单例集。然后性能要求归结为检查给定元素是否包含B
在运行时的集合中O(log(|B|))
。这是据我所知,但是,只有在B
已排序或存在某种索引结构时才有可能B
。
解决O(blog(m))
方案
正如m<n
你可以排序A
的结果是As
。排序A
是O(m log(m)) < O(m log(n) )
。
As
在 sorted中找到一个元素O(log(m))
。所以你只需要检查每个实例B
并确定它是否包含在As
.
结果运行时(滥用符号)是
O(n log(n))+ m* O(log(n)) = O(n log(n))+ O(n* log(m))=O(n log(m))