【发布时间】:2017-01-19 13:08:06
【问题描述】:
- 让
S1和S2是两组整数(它们不一定不相交)。- 我们知道
|S1| = |S2| = n(即每个集合都有n整数)。- 每个集合都存储在一个长度为
n的数组中,其中 它的整数按升序排序。- 设
k ≥ 1为整数。- 设计一个算法来找到
k在 O(n) 时间内S1 ∩ S2中的最小整数。
这是我目前所拥有的:
- 创建一个名为
Intersection的新数组 - 对于
S1中的每个e,将e添加到哈希集在O(n) 时间内 - 对于
S2中的每个e,检查e是否存在于哈希集中在O(n) 时间内 - 如果
e存在于哈希集中,则将e添加到Intersection - 完成比较后,按计数排序
Intersection在 O(n) 时间内 - 返回第一个
k整数
因此 O(n) + O(n) + O(n) = O(n)
我走对了吗?
【问题讨论】:
-
由于数组已经按升序排序,这可以使用 2-pointer 技术来完成(几乎与 mergesort 中的合并过程相同)。
-
哈希是杀死苍蝇的锤子。使用合并操作。
-
@Yves:合并是使用稍微更小的锤子来杀死苍蝇 - 更好,但它仍然是锤子 :-) 没有必要合并 any 方式,它可以在 O(n) 时间和 O(1) 空间内完成。当然,除非根据我的回答,您的意思是“虚拟”合并操作,在这种情况下,我提前道歉。
-
@paxdiablo:如果结果必须可用于进一步处理,则合并是强制性的,绝不是矫枉过正。顺便说一句,用追加替换你的打印就足够了,你会得到完全相同的算法。
-
计数排序很可能是不合适的,因为它的复杂度不是 O(n) 而是 O(n+m),其中 m 是键范围的大小。通常,m>>n。
标签: algorithm sorting time-complexity hashset