Estou atualizando minha teoria do CS e quero saber como identificar a complexidade de um algoritmo O (log n). Especificamente, existe uma maneira fácil de identificá-lo?
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)?
algorithms
complexity
big-o
Atif
fonte
fonte
Respostas:
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):
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.
fonte
A idéia é que um algoritmo seja:
O(log n)
se, em vez de percorrer uma estrutura 1 por 1, você divide a estrutura pela metade uma e outra vez e realiza um número constante de operações para cada divisão. Existem algoritmos de busca nos quais o espaço de resposta continua sendo divididoO(log n)
. Um exemplo disso é a pesquisa binária , em que você continua dividindo uma matriz ordenada ao meio repetidas vezes até encontrar o número.Nota: Você não precisa necessariamente se dividir em partes iguais.
fonte
log n
reflexos de busca binária acionados nas pessoas.Os exemplos típicos são aqueles que lidam com pesquisa binária. Por exemplo, um algoritmo de pesquisa binária é geralmente
O(log n)
.Se você possui uma árvore de pesquisa binária , pesquisa, inserção e exclusão são
O(log n)
complexas.Qualquer situação em que você divida continuamente o espaço geralmente envolve um
log n
componente. É por isso que muitos algoritmos de classificação têmO(nlog n)
complexidade, porque geralmente particionam um conjunto e classificam à medida que avançam.fonte
Se você deseja que seja tão simples quanto "loop único -> O (n), loop duplo -> O (n ^ 2)", a resposta provavelmente é "Árvore -> O (log n)". Atravessar com mais precisão uma árvore da raiz para uma (não todas!) Folha ou o contrário. No entanto, essas são todas simplificações excessivas.
fonte
Você deseja saber se existe uma maneira fácil de identificar se um algoritmo é O (log N).
Bem: basta correr e cronometrar. Execute-o para entradas 1.000, 10.000, 100.000 e um milhão.
Se você observar um tempo de execução de 3,4,5,6 segundos (ou algum múltiplo), poderá dizer com segurança que é O (log N). Se é mais como: 1,10,100,1000 segundos, provavelmente é O (N). E se estiver em 3.40.500.6000 segundos, será O (N log N).
fonte