这是我的求职面试中的一个问题
如何在两个数组中找到共同元素?如何证明此解决方案的时间复杂度是最优的,即无法进一步降低此问题的时间复杂度?
我为这个问题提供了一个nlogn +(n + m)算法解决方案.n,m是给定数组的大小,n> m。我无法回答问题的第二部分。有人可以帮助我吗?
答案 0 :(得分:3)
在仅比较模型中,基本上需要排序。考虑一个选择输入的对手,在两个数组的排序顺序中,元素在输入数组之间交替。对于每个元素,算法必须“证明”它小于其他数组的某些元素,并且大于所有其他元素。由于严格的交错,这些信息总计所有元素的总顺序,从而产生Omega(n log n)下限。
答案 1 :(得分:2)
您可以按时间复杂度n + m
执行此操作您可以创建时间复杂度HashSet
的{{1}},然后对另一个数组中的每个元素执行包含。这是时间复杂度n
。共计(O(1)*m)=m
。
你可以通过矛盾来证明这一点。如你所说,你认为与你认为是正确的相反,然后从逻辑上证明它一定是不可能的,因此你的假设是错误的。如果你正确地选择了你的假设,那么对它的否定将证明你原来的观点。
假设:假设有一个时间复杂度低于n+m
的算法,它找到两个数组中的所有常见元素。
这意味着至少有一个元素你没有检查过。这个元素可能是常见的。没有检查它你就无法知道。所以这个算法并不能保证你找到所有常见的元素,这与原来的假设相矛盾。因此,没有用于查找公共元素的复杂度小于m+n
的算法。