2013-02-24 56 views
1

我遇到了這個問題 - 輸入 - 我給了兩個排序數組a1和a2。我需要找到第二個數組中不存在的元素。修改已排序的數組的交集

我有兩種方法

1)哈希表 - O(M + N)
[使用時第二陣列是小]

2)二進制搜索 - O(M * logn)時間
[當第二個陣列很大時使用]

是否有其他方法具有更好的時間複雜性?

謝謝你

+6

如果數組已經排序,您可以簡單地在O(n + m)中迭代它們。這應該比散列表方法更快。 – nwellnhof 2013-02-24 23:49:48

+0

使用兩個指針?但是使用這種方法,我只能得到兩組之間的共同元素。我將不得不遍歷第一個數組以減去通用元素。 – Fox 2013-02-24 23:55:47

+1

是的,使用兩個指針並確保您按升序從兩個數組中處理元素。這樣你也可以從a1中找到不在a2中的元素。但我懶得展示一些示例代碼;) – nwellnhof 2013-02-25 00:05:03

回答

1

只是並行迭代它們。

這裏是一個JavaScript例如:

var a1 = [1, 2, 3, 4, 5, 6, 7, 9]; 
var a2 = [0, 2, 4, 5, 8]; 

findNotPresent(a1, a2); // [1, 3, 6, 7, 9] 


function findNotPresent(first, second) { 
    var first_len = first.length; 
    var first_index = 0; 

    var second_len = second.length; 
    var second_index = 0; 

    var result = []; 

    while (first_index < first_len && second_index < second_len) { 
     if (first[first_index] < second[second_index]) { 
      result.push(first[first_index]); 
      ++first_index; 
     } 
     else if (first[first_index] > second[second_index]) { 
      ++second_index; 
     } 
     else { 
      ++first_index; 
      ++second_index; 
     } 
    } 

    while (first_index < first_len) { 
     result.push(first[first_index++]); 
    } 

    return result; 
} 

我相信這將需要O(MAX(N,M))。

+0

這個例子是不正確的。用'a2 = [0,2,4,5]'嘗試一下,它不會返回任何結果。 – nwellnhof 2013-02-25 00:24:25

+0

您還需要增加a2_index計數器...您沒有考慮另一種情況,其中a2 [index]> a1 [index] – Fox 2013-02-25 00:47:05

+0

已修復。對不起,我在3AM寫了這段代碼。 – sigod 2013-02-25 09:10:58