Eu sei que com O (n), você geralmente tem um único loop; O (n ^ 2) é um loop duplo; O (n ^ 3) é um loop triplo, etc. E quanto a O (log n)?
Você realmente está fazendo o caminho errado aqui. Você está tentando memorizar qual expressão big-O combina com uma determinada estrutura algorítmica, mas você deve apenas contar o número de operações que o algoritmo requer e compará-lo com o tamanho da entrada. Um algoritmo que faz um loop em toda a entrada tem desempenho O (n) porque executa o loop n vezes, não porque possui um único loop. Aqui está um loop único com desempenho O (log n):
for (i = 0; i < log2(input.count); i++) {
doSomething(...);
}
Portanto, qualquer algoritmo em que o número de operações necessárias esteja na ordem do logaritmo do tamanho da entrada é O (log n). O importante que a análise big-O diz é como o tempo de execução de um algoritmo muda em relação ao tamanho da entrada: se você duplicar o tamanho da entrada, o algoritmo dará mais um passo (O (log n)) , duas vezes mais etapas (O (n)), quatro vezes mais etapas (O (n ^ 2)) etc.
Ajuda, por experiência própria, que algoritmos que particionam repetidamente sua entrada normalmente tenham 'log n' como um componente de seu desempenho? Certo. Mas não procure o particionamento e chegue à conclusão de que o desempenho do algoritmo é O (log n) - pode ser algo como O (n log n), que é bem diferente.