2012-08-09 51 views
0

我有一個特定的數組,我想檢查數組中的兩個值是否等於傳入函數的值,如果這兩個整數有效,則將它傳遞給新陣列。如何在Javascript中減少效率的兩個循環

我已經通過使用兩個向後的while循環並將長度緩存爲變量來解決此問題,這似乎是有效的。然而,有人向我提到,可能有辦法消除對其中一個循環的需求,並使其效率更高,從而優化BIG O符號。

任何想法如何做到這一點?這是我的...

var intArray = [1, 3, 7, 8, 10, 4, 6, 13, 0], 
    newArray = [], 
    i = intArray.length; 


function arrayCheck(k) { 
    while(i--) { 
     var z = i; 
     while (z--) { 
      if (intArray[i] + intArray[z] === k) { 
       newArray.push(intArray[i]); 
       newArray.push(intArray[z]); 
      } 
     } 
    } 
    alert(newArray); 
} 

arrayCheck(8); 
+1

總是會有'n *(n-1)'對,但只有在原始數組發生變化時才能預先計算總和。 – Pointy 2012-08-09 21:26:22

+3

也在函數之外初始化迭代變量是非常值得懷疑的。 – Pointy 2012-08-09 21:27:40

回答

2

有一種算法可以解決線性[O(n)]時間的這個問題。我建議你看看這個SO answer

另外,正如其他人所說,將答案標記爲已接受將使人們更有可能回答您的問題。您可能希望重溫您之前提出的問題並接受任何應得的答案。

+0

對不起,我不知道我需要接受的東西,我回去看看 – Yasir 2012-08-10 01:36:20

1

如果您檢查號碼NintArray[i] = M,那麼您需要在數組中找到值N-M

建立一個高效的樹搜索找到值N-M,你可以在O(n+logn)解決這個問題。