问题: 两组A和B各有n个元件。假设每个元素是[0,n ^ 100]范围内的整数。这些集合不一定排序。演示如何在O(n)时间内检查这两个集是否不相交。您的算法应使用O(n)空间。
我对此问题的最初想法是创建集合A的哈希表,并为B中的每个元素搜索此哈希表。但是,我不知道有任何方法可以创建数据集的哈希表这个范围只需要O(n)空间。我应该考虑采用完全不同的方法吗?
更新: 我联系了教授,询问有关实现哈希表的问题,他的回答如下: 请注意,散列仅在平均值上花费O(1)时间。对于这个问题,我们需要最坏情况的O(n)时间算法。
所以看来问题是寻找不同的方法......
答案 0 :(得分:6)
输入:数组A [m],B [n]
输出:如果它们不相交则为真,否则为假
<强> 1。蛮力: O(m * n)时间,O(1)空间
1. Search for each element of A into B
2. As soon as you get a match break and return false
3. If you reach till end, return true
优势:不修改输入
<强> 2。对两者进行排序 O(mlogm + nlogn + m + n)
1. Sort both arrays
2. Scan linearly
缺点:修改输入
第3。排序较小 O((m + n)logm)
1. Say, m < n, sort A
2. Binary search for each element of B into A
缺点:修改输入
<强> 4。排序更大 O((m + n)logn)
1. Say n > m, sort B
2. Binary search for each element of A into B
缺点:修改输入
<强> 5。散列 O(m + n)时间,O(m)或O(n)空间
优势:不修改输入
答案 1 :(得分:3)
为什么不使用哈希表?是不是要创建O(n)(假设它们都是唯一的),那么O(n)要搜索,是O(2n)= O(n)?
答案 2 :(得分:1)
哈希集可以正常工作。假设散列集/表是每个操作的恒定时间是非常常见的,即使这并非严格正确。
请注意,散列集/表绝对只使用与插入的元素成比例的空间,而不是潜在的元素总数。你似乎误解了这一点。
如果“通常认为足够好”由于某种原因是不可接受的,则可以使用基数排序。它在输入元素的总表示大小中是线性的。 (警告:这与元素数量的线性略有不同。)