Tablice w JavaScript można bardzo łatwo modyfikować, dodając i usuwając elementy. To nieco maskuje fakt, że większość tablic językowych ma stały rozmiar i wymaga skomplikowanych operacji, aby zmienić rozmiar. Wygląda na to, że JavaScript ułatwia pisanie słabo działającego kodu tablicowego. To prowadzi do pytania:
Jakiej wydajności (pod względem dużej złożoności czasu O) mogę oczekiwać od implementacji JavaScript w odniesieniu do wydajności macierzy?
Zakładam, że wszystkie rozsądne implementacje JavaScript mają co najwyżej następujące duże O.
- Dostęp - O (1)
- Dołączanie - O (n)
- Prepending - O (n)
- Wstawienie - O (n)
- Usunięcie - O (n)
- Zamiana - O (1)
JavaScript umożliwia wstępne wypełnienie tablicy do określonego rozmiaru przy użyciu new Array(length)
składni. (Pytanie dodatkowe: czy tworzy tablicę w ten sposób O (1) lub O (n)) To jest bardziej jak konwencjonalna tablica i jeśli jest używana jako tablica o ustalonym rozmiarze, może pozwolić O (1) na dołączanie. Jeśli dodana jest logika bufora cyklicznego, można uzyskać wyprzedzanie O (1). Jeśli używana jest tablica rozwijana dynamicznie, O (log n) będzie średnim przypadkiem dla obu z nich.
Czy mogę spodziewać się lepszej wydajności w niektórych przypadkach niż moje założenia? Nie spodziewam się, że cokolwiek zostanie opisane w żadnych specyfikacjach, ale w praktyce może się zdarzyć, że wszystkie główne implementacje używają zoptymalizowanych tablic za kulisami. Czy działają dynamicznie rozwijające się tablice lub inne algorytmy zwiększające wydajność?
PS
Zastanawiam się nad tym, ponieważ badam niektóre algorytmy sortowania, z których większość wydaje się zakładać, że dołączanie i usuwanie to operacje O (1), opisując ich ogólne duże O.
length
właściwości i wstępne przydzielanie miejsca to dwie zupełnie różne rzeczy.
array[5]
a new Array(10)
jest O (1)?
.length
ale to wszystko.) Tablice nie różnią się zbytnio od zwykłych instancji Object.