Mam sekcję w moim kodzie, gdzie wiem, że potrzebuję tablicy i wiem dokładnie, ile elementów będzie potrzebować ta tablica. Ta sekcja kodu będzie wielokrotnie powtarzana, więc mógłbym uzyskać bardzo duże oszczędności czasu, najpierw inicjując tę tablicę do rozmiaru, który wiem, że będzie potrzebował, a następnie wypełniając go, a tylko naciskając elementy (pchanie byłoby O (n) w przeciwieństwie do wypełniania już utworzonych przestrzeni, które byłyby O (1)).Czy mogę zainicjować tablicę do podanego rozmiaru w Perlu?
Powiedział, że nie mogę znaleźć żadnego eleganckiego sposobu inicjowania tablicy do danego rozmiaru i nie mam pojęcia dlaczego. Wiem, że można zrobić:
my @array; $array[49] =0;
dostać tablicę 50 pozycję, ale to wygląda bardzo brzydko do mnie i czuję się tak, choć nie musi być lepszy sposób. Pomysły?
Nic złego z wcześniejszą alokacją tablic, ale to pachnie jak przedwczesna i mikrooptymalizacja. Dlaczego myślisz, że 'push' to O (n)? – mob
Nie ma czasu na znalezienie linku już teraz, ale długa historia: pchanie wymaga zapętlenia się przez tablicę, aby znaleźć ostatnią otwartą przestrzeń (to jest sposób, w jaki pchanie jest zwykle realizowane, tak czy inaczej, chociaż teraz o tym myślę, to jest dla pojedynczo połączonej listy zamiast zwykle tablicy). Mówisz, że jest inaczej zaimplementowany w Perlu? – Eli
Tak, jest trochę inaczej. Listy Perla są tablicami z pewnym luzem zarówno z przodu, jak iz tyłu. Znają także swój rozmiar, więc zarówno 'push' jak i' unshift' są zwykle O (1). Jeśli luzu zostanie całkowicie zużyty, Perl ponownie przydzieli nową tablicę z większą ilością miejsca. Realokacja jest operacją O (n), ale musi się zdarzyć po każdej operacji push (log) n. – mob