Zrobienie z jednej listy dwóch z odpowiednim posortowaniem elementów.

0

Cześć,
Mam pewien problem do rozwiązania. Na wstępnie dodam że kod mi działa ale szukam czegoś bardziej optymalnego bo to co napisałem trwa bardzo długo. Słuchajcie. Mam sobie listę ponad 10 tysięcy elementów. Na liście mam jakieś tam dane pracownika oraz dane jego managera. Problem polega na tym, że jeden manager ma pod sobą kilku pracowników no i jest od powielony dlatego muszę zrobić że tak powiem listę w liście. Pierwszy poziom tej listy to managerowie i każdy element managera zawiera w sobie listę z jego pracownikami. Zrobiłem to w sposób następujący. Lecę sobie pętlą for po tej głównej liście jednopoziomowej gdzie mam wszystko wymieszane. i wewnątrz tej pętli wywołuję funkcję 'some' która sprawdza mi, czy na tej liście posortowanej, znajduje się już taki manager (sprawdzam po loginie). Jeśli znajduje się to zwracam wartość true oraz indeks pozycji na której się ten manager znajduje i wtedy dodaję mu pozycję z jego podwładnym (pracownikiem), jeśli nie ma, dodaję nową pozycję z managerem oraz tworzę pod nim pozycję z jego pracownikiem. I to niestety przy ponad 10 tysiącach użytkowników wykonuje się nawet 2min. Czy da się to zrobić w bardziej optymalny sposób?

0

Samo posortowanie pewnie ci niewiele da, chyba że wykorzystasz fakt posortowania do tego, żeby przeprowadzić wyszukiwanie binarne.

(sprawdzam po loginie).

Jeśli menedżer jest identyfikowany po loginie, to możesz zmienić strukturę danych na słownik indeksowany po loginie, co w JS można osiągnąć albo wrzucając to w obiekt, gdzie nazwy właściwości będą loginami poszczególnych menedżerów:
czyli zamiast:

[
  {name: "Elon Musk",  employees: .......},
  {name: "Sam Altman",  employees: .......},
]

robisz tak:

{
   "Elon Musk": {name: "Elon Musk", employees: .......},
   "Sam Altman": {name: "Sam Altman", employees: .......},
}

Tylko, że używając obiektów jako słowników trzeba mieć ciągle z tyłu głowy edge case'y i świadomość dziedziczenia prototypowego w JS. Więc możesz też użyć obiektów Map, które oferują bardziej eleganckie rozwiązanie (chociaż trochę mniej wygodne): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

w każdym razie mając słownik, nie musisz przeszukiwać liniowo całej tablicy, więc powinno być szybciej (pod spodem prawdopodobnie będzie to zaimplementowane jako haszmapa, ale to nie jest pewne. Chociaż jeśli chodzi o Mapy, to specyfikacja ma widzę jakieś wymogi:

The specification requires maps to be implemented "that, on average, provide access times that are sublinear on the number of elements in the collection". Therefore, it could be represented internally as a hash table (with O(1) lookup), a search tree (with O(log(N)) lookup), or any other data structure, as long as the complexity is better than O(N).

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

1 użytkowników online, w tym zalogowanych: 0, gości: 1