Complexidade e estruturas
Notação assimptótica revista, regras de soma e produto, e a escolha da estrutura certa antes de desenhar.
Antes de desenhares um algoritmo, precisas de duas coisas: uma régua para medir o custo e uma caixa de ferramentas com as estruturas que fazem cada operação depressa. Esta página revê a notação assimptótica e mostra como a estrutura escolhida decide o custo antes de escreveres a primeira linha do algoritmo.
A régua: O grande
Dizemos que é quando cresce no máximo tão depressa como , a menos de constantes e para entradas grandes. Na prática, lês como “duplica a entrada e o tempo quadruplica, mais coisa menos coisa”. O que conta é o termo dominante: é , porque para grande o esmaga o resto.
Duas regras chegam para quase tudo. Na sequência, somas e ficas com o pior: um passo seguido de um passo dá . Nos ciclos aninhados, multiplicas: dois ciclos de iterações com trabalho constante dão . E diz sempre o que é e o que estás a contar: ” é o tamanho do vetor e conto comparações” evita metade das confusões.
A caixa de ferramentas
Cada estrutura compra velocidade numa operação e paga-a noutra. O vetor dá acesso direto por posição em mas inserir no meio custa . A lista ligada inverte a troca em alguns casos, mas perde o acesso direto. A tabela de dispersão dá procura, inserção e remoção em médio à custa de memória extra e de um pior caso degradado. A árvore equilibrada de pesquisa dá tudo em com garantias. Não há estrutura melhor em absoluto; há a estrutura certa para o padrão de acessos do teu algoritmo.
Exemplo: procurar num vetor de inteiros
Tens o vetor [4, 1, 7, 3, 9, 2, 8, 5] e queres saber se contém o valor 8 e em que posição. A procura linear percorre do início: compara 4, 1, 7, 3, 9, 2 e só no sétimo elemento encontra 8. São 7 comparações para , e no pior caso são . Custo: tempo e memória extra.
Com uma tabela de dispersão construída sobre os mesmos valores, a procura de 8 calcula a função de dispersão, salta diretamente para o balde e confirma em 1 comparação típica. Custo médio: tempo, à custa de memória para a tabela e de um pior caso se tudo colidir no mesmo balde. Para a diferença é irrelevante; para com muitas procuras, é a diferença entre segundos e horas. É este raciocínio, feito antes de desenhar, que as próximas páginas assumem: cada técnica de força bruta a programação dinâmica vive ou morre do custo das operações que repete.