Acredito que possuo uma compreensão razoável de complexidades como , e .Θ ( n ) Θ ( n 2 )
Em termos de lista, é uma pesquisa constante, portanto, está apenas obtendo o cabeçalho da lista. é onde eu andaria na lista inteira, e caminha pela lista uma vez para cada elemento da lista.Θ ( n ) Θ ( n 2 )
Existe uma maneira intuitiva semelhante de entender além de apenas saber que ela está em algum lugar entre e ?O ( 1 ) Θ ( n )
Respostas:
A complexidade geralmente é conectada à subdivisão. Ao usar listas como exemplo, imagine uma lista cujos elementos sejam classificados. Você pode pesquisar nessa lista em - na verdade, você não precisa examinar cada elemento devido à natureza classificada da lista.O ( log n )Θ(logn) O(logn)
Se você olhar para o elemento no meio da lista e compará-lo com o elemento que procura, poderá dizer imediatamente se ele fica na metade esquerda ou direita da matriz. Em seguida, você pode pegar esta metade e repetir o procedimento até encontrá-la ou chegar a uma lista com 1 item que você compara trivialmente.
Você pode ver que a lista efetivamente divide pela metade cada etapa. Isso significa que, se você obtiver uma lista de tamanho , as etapas máximas necessárias para alcançar a lista de um item serão . Se você tiver uma lista de itens, precisará de apenas etapas; para uma lista de precisará de apenas etapas, etc.5 128 = 2 7 7 1024 = 2 10 1032 5 128=27 7 1024=210 10
Como você pode ver, o expoente em sempre mostra o número de etapas necessárias. O logaritmo é usado para "extrair" exatamente esse número do expoente, por exemplo . Também generaliza para listar comprimentos que não são potências de dois comprimentos.2 n log 2 2 10 = 10n 2n log2210=10
fonte
O(log n)
se a lista tiver acesso aleatório em tempo constante. Em implementações de lista mais típicas (listas vinculadas), isto éO(n log n)
Em termos de árvores (balanceadas) (por exemplo, árvore binária, então todos os 's são a base 2):log
fonte
Para que seja possível, é necessário reduzir o tamanho do problema proporcionalmente em uma quantia arbitrária em relação a com uma operação de tempo constante.nO(logn) n
Por exemplo, no caso de pesquisa binária, você pode reduzir o tamanho do problema pela metade a cada operação de comparação.
Agora, você precisa reduzir o tamanho do problema pela metade, na verdade não. Um algoritmo é mesmo que possa reduzir o espaço de pesquisa do problema em 0,0001%, desde que a porcentagem e a operação que ele usa para reduzir o tamanho do problema permaneçam constantes, é um algoritmo, não será um algoritmo rápido, mas ainda é com uma constante muito grande. (Supondo que estamos falando de com um log de base 2)O ( log n ) O ( log n ) log nO ( logn ) O ( logn ) O ( logn ) registron
fonte
Pense no algoritmo para converter o número decimal em binárion
Esseregistro( N )
while
loop é executado vezes.fonte
Sim, está entre e , mas é mais próximo de que . O que é ? A função log é a função inversa da exponenciação. Deixe-me começar com a exponenciação e você deve ter uma idéia melhor do que é o logaritmo.1 n 1 n log ( n )registro( N ) 1 1 n 1 1 n registro( N )
Considere dois números, e . é multiplicado por si mesmo vezes. Você pode, com algum esforço, contar números, mas pode contar ? Aposto que você não pode. Por quê? é um número tão grande que é maior que o número de todos os átomos no universo. Reflita sobre isso por um momento. É um número tão grande que permite que você dê um nome (número) a cada átomo. E o número de átomos em sua unha é provavelmente da ordem de bilhões. deve ser suficiente para qualquer pessoa (trocadilho intencional :)).2 100 2 100 2 100 100 2 100 2 100 2 100100 2100 2100 2 100 100 2100 2100 2100
Agora, entre os dois números, e , é o logaritmo de (na base ). é comparativamente um número tão pequeno que . Alguém deveria ter itens diferentes em sua casa. Mas, é bom o suficiente para o universo. Pense em casa versus universo ao pensar em e .2 100 100 2 100 2 100 2 100 100 2 100 log ( n ) n100 2100 100 2100 2 100 2100 100 2100 log(n) n
De onde vêm a exponenciação e os logaritmos? Por que eles têm tanto interesse em ciência da computação? Você pode não perceber, mas a exponentação está em toda parte. Você pagou juros no cartão de crédito? Você acabou de pagar um universo por sua casa (não é tão ruim, mas a curva se encaixa). Eu gosto de pensar que a exponenciação vem da regra do produto, mas outros são bem-vindos para dar mais exemplos. Qual é a regra do produto, você pode perguntar; E eu responderei.
Digamos que você tenha duas cidades e , e há duas maneiras de ir entre elas. Qual é o número de caminhos entre eles? Dois. Isso é trivial. Agora diga, existe outra cidade , e você pode ir de para de três maneiras. Quantos caminhos existem entre e agora? Seis, certo? Como você conseguiu isso? Você os contou? Ou você os multiplicou? De qualquer maneira, é fácil ver que ambas as formas dão um resultado semelhante. Agora, se você adicionar uma cidade que pode ser acessada a partir de de quatro maneiras, quantas maneiras existem entre eB C B C A C D C A D 2 ⋅ 3 ⋅ 4 24 2 10 1024 2 10 10 10 2 10 10 1024A B C B C A C D C A D ? Conte se você não confia em mim, mas é igual a que é . Agora, se houver dez cidades e houver dois caminhos de uma cidade para a próxima, eles serão organizados como se fossem uma linha reta. Quantos caminhos existem do começo ao fim? Multiplique-os se não confiar em mim, mas vou lhe dizer que existem , que é . Veja que é resultado exponencial de e é o logaritmo de . é um número pequeno em comparação com .2⋅3⋅4 24 210 1024 210 10 10 210 10 1024
A função do logaritmo é que é (observe que é a base do logaritmo). Se você multipy consigo mesmo vezes (observe que é a base do logaritmo), obtém . é tão pequeno, tão pequeno em comparação com , que é o tamanho da sua casa onde é o tamanho do universo.n n 2 n 2 log b ( n ) b b n log ( n ) n nlog2(n) n n 2n 2 logb(n) b b n log(n) n n
Em uma nota prática, as funções executam muito semelhante às funções constantes. Eles crescem com , mas crescem muito lentamente. Se você otimizou um programa para ser executado no tempo logarítmico que estava demorando um dia antes, provavelmente o executará na ordem de minutos. Verifique você mesmo com problemas no Project Euler.nlog(n) n
fonte
Para continuar seu tema, é como adivinhar repetidamente onde x está na lista e receber "alto" ou "baixo" (em termos de índice).O(logn) x
Ainda é baseado no tamanho da lista, mas você só precisa visitar uma fração dos elementos.
fonte
Se temos um algoritmo de divisão e conquista , e fazemos apenas uma chamada recursiva para um subproblema, e é o segundo caso no teorema mestre , ou seja, a complexidade do tempo da parte não recursiva é , então o a complexidade do algoritmo será Θ ( lg k + 1 n ) .Θ(lgkn) Θ(lgk+1n)
O algoritmo de busca binária é o exemplo clássico.
fonte
A intuição é quantas vezes você pode reduzir pela metade um número, digamos n, antes que ele seja reduzido a 1 seja O (lg n).
Para visualizar, tente desenhá-lo como uma árvore binária e conte o número de níveis, resolvendo essa progressão geométrica.
fonte