与O(n·m)列出交叉点

时间:2017-09-27 17:53:05

标签: algorithm list math

假设我们分别有两个长度为n和m的列表:

val result = Seq(2,4,6,8)

有没有办法计算它们的交点小于O(n·m)?

那是

filter

编辑:我们可以假设我们的列表已经过排序。

2 个答案:

答案 0 :(得分:2)

  1. 将其中一项放入哈希集。 O(分钟(N,M))

    var set2 = new HashSet<int>(){2,4,6,8,10,12};
    
  2. 取另一组并检查它是否存在于哈希集中。每次访问都是O(1),因为我们需要另一个集合,我们创建了具有较短集合的散列集,这意味着如果在另一个集合中返回true,则时间为O(max(m,n)) 将其添加到您的结果中。

  3. 结果是时间为O(n + m),内存为O(min(n,m))。

答案 1 :(得分:2)

对于排序列表,以下算法应该有效:

你可以有两个指针说(i和j)一个在l1另一个在l2。

现在你可以迭代l1和l2这样

 while (i< l1.size && j < l2.size ) {
    if l1[i] < l2[j] 
       i++ 
    else if (l1[i] == l2[j] )
       i++; j++; output = output U {l1[i]}
    else
       j++  
 }

这应该是O(max(m,n))