2016-05-11 21 views
0

folgende Funktion:O (n log n) in Javascript-Algorithmus

function solution(K, A) { 
    var counter=0; 
    for (var i=0;i<A.length;i++) { 
     for (var j=i;j<A.length;j++) { 
      if (A[i]+A[j]===K) { 
       if (i===j) 
       counter++; 
       else 
       counter+=2; 
      } 
     } 
    } 
    return counter; 
} 

die Anzahl der Paarelemente innerhalb einer Anordnung findet, die eine Summe von K. I s es O hat (n^2/2) Gibt es einen anderen Algorithmus, um das oben genannte mit O(nlogn) zu implementieren?

+0

Warum wird der Zähler auf i == j erhöht? Es ist wahrscheinlich kein Paar, wenn es der gleiche Index ist. – Nomaed

+2

Eigentlich können Sie eins besser gehen und dieses Problem in O (n) lösen, indem Sie eine Nachschlagetabelle verwenden. Es ist eine Standard-Interviewfrage. –

+0

Ja, es ist n^2. Wenn das Array ungeordnet ist, glaube ich nicht, dass es besser geht. – nurdyguy

Antwort

2

Ja die Lösung, die Sie gebucht haben, hat O(n^2) Komplexität wegen der zwei for-Schleifen. Sie können das Problem in O(n) tatsächlich lösen, indem Sie map verwenden, das nur ein assoziatives Array in JavaScript ist.

function solution(k, arr){ 
    var map = {}; 
    for (var i=0; i < arr.length ; i++){ 
     var tmp = k - arr[i]; 
     if (temp > 0 && map[tmp] == 1) 
      console.log("Found the pair :", temp, arr[i]); 
     else 
      map[arr[i]] = 1; 
    } 
} 
+1

'map' sollte wahrscheinlich ein Objekt sein, kein Array. –

+1

Associate Array ist in der Tat ein Objekt in JavaScript –

+0

Möchten Sie sagen, dass der obige Code richtig funktioniert ?? !!! –

0

Wenn Sie Paare von Elementen zu finden, die Summe K in O (n log n) haben Sie sollten ein neues Array erstellen, in dem Sie eine sortierte Version des Array speichern, die als Parameter übergeben wurde, dann wie folgt vorgehen:

var i = 0; 
var j = A.length - 1; 
while(i < j) { 

    if(A[i] + A[j] == k) { 

     counter++; 
     ++i; 
     --j; 
    } 
    else 
     if(A[i] + A[j] < k) { 

      ++i; 
     } 
     else 
      ++j; 
} 

Nun wird die Sortier- O (n log n) und der obige Code O (n), die es O (n log n) macht nimmt.

Verwandte Themen