Qual è la complessità temporale dell'inizializzazione dell'array?

Qual è la complessità temporale dell'inizializzazione dell'array?


Considera i seguenti due casi di inizializzazione dell'array in C o C++ :


Caso 1:


int array[10000] = {0}; // All values = 0

Caso 2:


int array[10000];
for (int i = 0; i < 10000; i++) {
array[i] = 0;
}

Entrambi impiegano lo stesso tempo? qual è la complessità del caso 1? e, quale è meglio?


Risposte:


Nel caso in cui l'array sia di durata statica (variabile globale), direi che il primo è molto preferibile, poiché non richiede alcun codice:è inizializzato dall'ambiente di runtime.


Se la variabile è una di durata automatica (variabile locale), quale è migliore, se una è migliore dell'altra, dipende dal compilatore. Molto probabilmente, entrambi saranno molto simili.


La complessità per la variabile di durata della memorizzazione automatica è O(n) per tutti i casi. Il primo caso è O(1) per una variabile di durata di archiviazione statica.


Ovviamente, se vuoi riempire l'array con il valore 5, la seconda opzione è molto meglio perché non richiede la scrittura di 10000 5 nel file sorgente.


Potresti anche scoprirlo usando memset(array, 0, sizeof(array)); è meglio di entrambi, ancora una volta, a seconda del compilatore. Questo è ancora O(n), ma il tempo effettivo necessario per riempire l'array potrebbe essere più breve, perché memset potrebbe essere ottimizzato meglio di quello che genera il compilatore per il tuo caso di loop [e cosa fa per le variabili inizializzate]. memset non funzionerà per riempire l'array con 5 o.


Puoi anche usare std::fill(array, &array[10000], 5); per impostare il valore 5 in tutto l'array, e il compilatore dovrebbe fare un lavoro decente per ottimizzarlo.


Infine, dovrei sottolineare che questo genere di cose contano VERAMENTE solo se vengono eseguite in codice che viene eseguito molto. È passato molto tempo da quando il riempimento di 40 KB di dati ha impiegato abbastanza tempo per preoccuparsene davvero da solo. Come più di 20 anni.