Cercando di rispolverare la comprensione del Big-O per un test (Una comprensione di base del Big-O richiesta ovviamente) Sto arrivando e stava facendo alcuni problemi di pratica nel mio libro.Notazione Big-Oh per un singolo ciclo while che copre due metà di un array con due iterator vars
Mi hanno dato il seguente frammento
public static void swap(int[] a)
{
int i = 0;
int j = a.length-1;
while (i < j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
abbastanza facile da capire che penso. Ha due iteratori che coprono metà della matrice con una quantità fissa di lavoro (che penso li tocchi entrambi a O (n/2))
Pertanto O (n/2) + O (n/2) = O (2n/2) = O (n)
Ora, per favore perdonami, poiché questa è la mia attuale comprensione e questo è stato il mio tentativo di risolvere il problema. Ho trovato molti esempi di big-o online ma nessuno che è abbastanza come questo in cui gli iteratori incrementano e modificano l'array praticamente nello stesso tempo.
Il fatto che abbia un ciclo mi fa pensare che sia O (n) comunque.
Qualcuno mi dispiacerebbe chiarire questo per me?
Grazie
FYI: anche se si esegue solo l'iterazione su metà di un array, ad esempio 'sumOddIndexElements()', è ancora O (n). Il fattore costante di 1/2 va via. Quando inizi ad analizzare algoritmi più complessi, è utile passare dai conteggi esatti al big-O all'inizio dell'analisi. Quindi i passaggi intermedi diventano più semplici perché puoi eliminare termini. OSSIA se una subroutine fa funzionare O (n) + O (log n), è possibile ridurla immediatamente a O (n) per il resto dell'analisi. – japreiss
@japreiss Mi dispiace, non sto cercando di essere ridondante con qualsiasi mezzo, ma la tua ultima frase mi ha confuso un po '. Se ho capito bene, O (log n) diventerà insignificante a O (n) ad un certo punto che non vale la pena calcolare nell'efficienza temporale e quindi lo abbandoniamo? – Habitat
Con la definizione di O grande, quando si aggiungono termini è sempre possibile eliminare tutto tranne i più grandi asintoticamente. Puoi provare che 'n + log n <2n' ma' 2n' è O (n). Quindi sì, è insignificante, in un modo molto ben definito. – japreiss