I know with O(n), you usually have a single loop; O(n^2) is a double
loop; O(n^3) is a triple loop, etc. How about O (log n)?
Stai davvero andando nel modo sbagliato qui. Stai cercando di memorizzare quale espressione di O grande va con una determinata struttura algoritmica, ma dovresti davvero contare il numero di operazioni che l'algoritmo richiede e confrontarlo con le dimensioni dell'input. Un algoritmo che scorre su tutto il suo input ha prestazioni O (n) perché esegue il ciclo n volte, non perché ha un singolo ciclo. Ecco un singolo ciclo con prestazioni O (log n):
for (i = 0; i < log2(input.count); i++) {
doSomething(...);
}
Quindi, qualsiasi algoritmo in cui il numero di operazioni richieste è nell'ordine di il logaritmo della dimensione dell'input è O (log n). La cosa importante che l'analisi big-O ti dice è come cambia il tempo di esecuzione di un algoritmo rispetto alla dimensione dell'input: se raddoppia la dimensione dell'ingresso, l'algoritmo richiede un ulteriore passo (O (log n)) , il doppio dei passaggi (O (n)), quattro volte il numero di passaggi (O (n ^ 2)), ecc.
Aiuta a sapere per esperienza che gli algoritmi che dividono ripetutamente il loro input di solito hanno 'log n' come componente delle loro prestazioni? Sicuro. Ma non cercare il partizionamento e saltare alla conclusione che la performance dell'algoritmo è O (log n) - potrebbe essere qualcosa come O (n log n), che è abbastanza diverso.