• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Set vs pętla w pętli w filtracji - performance

Object Storage Arubacloud
+1 głos
114 wizyt
pytanie zadane 30 maja 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)
edycja 30 maja 2019 przez BT101

Robię filtracje tablicy obiektów A na zasadzie jeśli A.name zawiera się w tablicy stringów B to go usuwam.

Skoro ten kod jest O(1):

const input = [ 
  { nick: 'Some name1', x: 19, y: 24, grp: 4, id: '19340' },
  { nick: 'Some name2', x: 20, y: 27, grp: 11, id: '19343' },
  { nick: 'Some name1', x: 22, y: 27, grp: 11, id: '19344' },
  { nick: 'Some name3', x: 22, y: 30, grp: 11, id: '19350' },
  { nick: 'Some name4', x: 22, y: 12, grp: 23, id: '19374' },
  { nick: 'Some name5', x: 22, y: 29, grp: 23, id: '19377' } 
];

const nameToOmit = ['Some name1', 'Some name4'];
const namesToOmitSet = new Set(nameToOmit);

const finalArr = input.filter(it => (!namesToOmitSet.has(it.nick)));
console.log(finalArr)

a ten kod jest O(n):

const input = [ 
  { nick: 'Some name1', x: 19, y: 24, grp: 4, id: '19340' },
  { nick: 'Some name2', x: 20, y: 27, grp: 11, id: '19343' },
  { nick: 'Some name1', x: 22, y: 27, grp: 11, id: '19344' },
  { nick: 'Some name3', x: 22, y: 30, grp: 11, id: '19350' },
  { nick: 'Some name4', x: 22, y: 12, grp: 23, id: '19374' },
  { nick: 'Some name5', x: 22, y: 29, grp: 23, id: '19377' } 
];
const nameToOmit = ['Some name1', 'Some name4'];
const finalArr = [];

const findInArray = (val, arr) => {
    for(let i = 0, l = arr.length; i < l; i++) {
        if(arr[i] === val) return true;
    }
    return false;
};

for(let i = 0, l = input.length; i < l; i++) {
    if (!findInArray(input[i].nick, nameToOmit)) {
        finalArr.push({
            name: input[i].nick,
            id: input[i].id
        });
    }
}

console.log(finalArr)

To jakim cudem ta pętla w pętli jest szybsza wg jsperf? Czy może się myle i ten 1 kod defacto nie jest O(1)? Istnieje jakiś inny, szybszy sposób na przefiltrowanie tej tablicy obiektów w ten sposób jak w przykładach?

komentarz 30 maja 2019 przez Patrycjerz Mędrzec (192,320 p.)
Oba algorytmy mają chyba klasę złożoności O(n), gdzie n to rozmiar wejścia. Zauważ, że w obu przypadkach iterujemy po tablicy wejść bez zagnieżdżeń tej iteracji.

A że jeden sposób jest szybszy od drugiego, może być spowodowane narzutem metody `filter`.
komentarz 30 maja 2019 przez BT101 Stary wyjadacz (12,540 p.)
Właśnie czytałem gdzieś w necie, że ten 1 sposób jest liniowy ale nie wiem na 100%, bo w końcu skąd ta metoda `.has` by wiedziała czy zawiera się w tej kolekcji bez przelecenia po niej. Może @Comandeer się wypowie :-)
komentarz 30 maja 2019 przez Patrycjerz Mędrzec (192,320 p.)
Ale metoda `has` nie ma tutaj zbyt wiele do powiedzenia, gdyż nie zależy od rozmiaru wejścia.
1
komentarz 30 maja 2019 przez BT101 Stary wyjadacz (12,540 p.)
edycja 30 maja 2019 przez BT101

Mi chodzi o to, że 1 pętla zawsze powinna być szybsza od pętli w pętli. W tym przykładzie drugim zagnieżdżam pętle w pętli a w pierwszym pętle są "ukryte" pod metodami z javascriptu i nie wiem do końca jak to działa.


Znalazłem teraz ciekawy wpis na SO, szczególnie zainteresował mnie ten fragment:

 it was about three times faster to remove items from the set (2.6 ms vs 7.1 ms) but things changed drastically for the "big" test

Sprawdziłem swój kod zmieniając tablice input na taką zawierającą kolejno 200 a potem 5k elementów i faktycznie przykład nr 1 zaczyna wygrywać już od tablicy zawierającej 200 elementów.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 185 wizyt
pytanie zadane 22 maja 2019 w JavaScript przez BT101 Stary wyjadacz (12,540 p.)
+1 głos
1 odpowiedź 265 wizyt
0 głosów
1 odpowiedź 267 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...