Ho una sezione nel mio codice dove so che avrò bisogno di un array, e so esattamente quanti elementi quell'array dovrà avere. Questa sezione di codice verrà ripetuta molto, quindi potrei ottenere dei grossi risparmi di tempo inizializzando quella matrice alla dimensione che so di aver bisogno e poi riempiendola vs semplicemente spingendo gli elementi in avanti (premendo sarebbe O (n) al contrario di riempire spazi già creati, che sarebbe O (1)).Posso inizializzare una matrice con una determinata dimensione in Perl?
Detto questo, non riesco a trovare alcun modo elegante di inizializzare un array per una determinata dimensione, e non ho idea del perché. So che posso fare:
my @array; $array[49] =0;
per ottenere un array di 50 articolo, ma che sembra davvero brutto per me e mi sento come se ci deve essere un modo migliore. Idee?
Niente di male con preallocazione di array, ma questo odora di prematura e micro-ottimizzazione. Perché pensi che 'push' è O (n)? – mob
Non c'è tempo per trovare un collegamento in questo momento, ma per farla breve: il push di richiede il looping attraverso l'array per trovare l'ultimo spazio aperto (è il modo in cui normalmente viene implementato il push, comunque, anche se ora ci sto pensando, è per una lista collegata singolarmente piuttosto che una matrice normalmente). Stai dicendo che è implementato in modo diverso in Perl? – Eli
Sì, è un po 'diverso. Gli elenchi di Perl sono array con un po 'di gioco sia nella parte anteriore che in quella posteriore. Inoltre conoscono le loro dimensioni, quindi sia 'push' che' unshift' sono generalmente O (1). Se il gioco si esaurisce, Perl ridistribuisce un nuovo array con più spazio. La riallocazione è un'operazione di tipo O (n), ma deve avvenire solo dopo ogni operazione di push di ~ log (n). – mob