2015-06-08 8 views
5

Muszę wywołać 4-krotnie następującą funkcję: cross dla wszystkich permutacji zmiennej x i y o wartościach 1 i -1;iterować przez wszystkie permutacje dwóch zmiennych

moje podejście:

var p = [-1, 1]; 

p.forEach(function(x) { 
    p.forEach(function(y) { 
    cross(x, y); 
    }); 
}); 

Czy istnieje krócej sposób to zrobić?

+0

Myślę, że istnieje algorytm do tworzenia kombinacji n^2, który jest bardziej wydajny niż n^2. – ssube

+3

Mówiąc krótko, masz na myśli linie kodu lub w czasie (bardziej wydajne)? –

+0

oba byłyby interesujące. –

Odpowiedz

1

Istnieje pewne obciążenie podczas wywoływania funkcji. na przykład umieszczenie wskaźnika powrotu na stosie. Prawdopodobnie byłoby nieco szybciej użyć dwóch dla pętli zamiast wywołań dla forEach.

var p = [-1, 1]; 
for (var x = 0; x < p.length; x++) { 
    for (var y = 0; y < p.length; y++) { 
     cross(p[x], p[y]); 
    } 
} 
2

Ponieważ znasz długość twojej tablicy p, nie potrzebujesz pętli. Najszybszym rozwiązaniem byłoby:

var p = [-1, 1]; 
cross(p[0], p[0]); 
cross(p[0], p[1]); 
cross(p[1], p[0]); 
cross(p[1], p[1]); 
+0

dlaczego głosowanie w dół? – bhspencer

+2

to najbardziej oczywiste rozwiązanie dla konkretnego przypadku, przegłosowane! –

+0

dlaczego używasz '0' zamiast' -1'? – naomik

3

Jeśli chcesz być bardzo funkcjonalny, można użyć map a następnie reduce tablice w jedną. Nie sądzę, że byłoby to bardziej skuteczne niż to, co masz teraz, ani nie jest o wiele prostsze (jest bardziej funkcjonalne, tylko nieznacznie).

var d = [-1, 1]; 
 

 
var r = d.reduce(function(p, x) { 
 
    return p.concat(d.map(function(y) { 
 
    return cross(x, y); 
 
    })); 
 
}, []); 
 

 
document.getElementById('r').textContent = JSON.stringify(r);
<pre id=r></pre>

I naprawdę nie sądzę, że istnieje algorytm z lepiej niż n^2 efektywności produkować n^2 kombinacje.

1

To będzie szybciej:

for (var n = 0; n < 4; ++n) 
    cross(n & 2 ? 1:-1, n & 1 ? -1:1); 

ale jest krótsza?

+2

i czy jest czytelny? –

Powiązane problemy