análise de tempo do algoritmo "tamanho da entrada" vs "elementos de entrada"

13

Ainda estou um pouco confuso com os termos "comprimento da entrada" e "tamanho da entrada" quando usado para analisar e descrever o limite superior assintomático de um algoritmo

Parece que o tamanho da entrada do algoritmo depende muito do tipo de dados e do algoritmo de que você está falando.

Alguns autores referem-se ao tamanho da entrada para o tamanho dos caracteres necessários para representar a entrada; portanto, "abcde" se usado como conjunto de entrada em um algoritmo terá um "comprimento de entrada" de 6 caracteres.

Se em vez de caracteres tivermos número (números inteiros, por exemplo), às vezes a representação binária é usada em vez de caracteres, para que o "comprimento da entrada" seja calculado como (Sendo L o número máximo no conjunto de entrada) .Nlog(L)

Existem outros problemas que mesmo se o conjunto de entrada são números, eles descrevem o "comprimento de entrada" como "variáveis de decisão", portanto, para um conjunto de entrada de comprimento N com números na faixa de o comprimento de entrada é apenas N ( soma de subconjuntos, por exemplo), ou ainda mais complicado, o número de valores binários de lugares necessários para declarar o problema (o que acredito ser exatamente o mesmo que N l o g ( L ) )0232Nlog(L)

Então:

  • depende do algoritmo?
  • O que significa e quando usar cada tamanho de entrada "versão"
  • Existe alguma regra que eu possa usar para decidir qual usar?
Jesus Salas
fonte

Respostas:

10

No sentido mais formal, o tamanho da entrada é medido em referência a uma implementação do algoritmo da Turing Machine e é o número de símbolos do alfabeto necessários para codificar a entrada.

Naturalmente, isso é bastante abstrato e é muito difícil trabalhar na prática, ou pelo menos muito irritante - precisaríamos considerar como especificar os delímetros, etc. etc. O que acontece normalmente na prática é que procuramos uma medição proxy do tamanho da entrada - algo mais conveniente e acessível, mas que não causa problemas matemáticos em nossa análise.

Usando o exemplo "abcde", normalmente o alfabeto que usamos para a entrada é pequeno; portanto, mesmo usando a medição de proxy de caracteres, sabíamos que, mesmo em uma máquina de Turing, podemos, se nos incomodarmos, especifique uma codificação de entrada que converteria "abcde" para alguma forma codificada que tivesse comprimento no máximo 5 × c para alguma constante c . Essa expansão por uma constante normalmente não faria diferença em nossa análise assintótica, pois descartamos rotineiramente fatores constantes.55×c c

Em um caso diferente, geralmente medimos o tamanho de um gráfico de entrada pelo número de vértices . Claramente, se queremos especificar gráficos arbitrariamente grandes, o tamanho da entrada codificada não é simplesmente n - o que aconteceu com as bordas, por exemplo? O que sabemos é que podemos usar um esquema de codificação razoável que representa o gráfico em N = c n 2 log n bits. Isso é um pouco mais de expansão do que constante, mas em muitos casos interessantes, estamos lidando apenas com granularidade de polinômios, e os polinômios se compõem muito bem de várias maneiras - em particular, por exemplo, se determinamos que nosso tempo de execução é O ( p (nnN=cn2logn onde p é um polinômio, sabemos que existe algum polinômio p tal que O ( p ( n ) ) = O ( p ( N ) ) , portanto, quando voltamos à medida formal da entrada , ainda estamos no tempo polinomial.O(p(n))ppO(p(n))=O(p(N))

Um lugar onde isso pode cair é quando você está trabalhando com números. Como um número com magnitude pode ser codificado em n = O ( log m ) bits, se nosso tempo de execução fosse O ( m ) , seria O ( 2 n ) - exponencial no tamanho real da entrada - o que tornaria a magnitude m uma má escolha para um proxy para o tamanho da entrada, se quisermos falar sobre a participação em P, por exemplo (quando você chega a Fortemente- N- P completo e Fraco- N- Pmn=O(logm)O(m)O(2n)mPNPNP-complete, lembre-se disso). Por outro lado, se tudo o que nos interessava fosse a decidibilidade, seria uma medida de proxy suficientemente boa.

Portanto, embora não exista uma regra declarada para escolher uma medida de proxy para o tamanho da entrada, o requisito é que a expansão ou contração do tamanho do proxy em comparação com o tamanho da entrada seja compatível com o que você está tentando provar. Como regra geral, mudanças constantes de fator quase nunca importam, fatores polinomiais pequenos normalmente são bons e funcionam na maior parte da teoria básica que você vê, grandes fatores polinomiais ainda podem funcionar na teoria, mas podem ser uma surpresa desagradável na prática, e quantidades exponenciais de mudança são normalmente muito extremas.

Luke Mathieson
fonte
Obrigado pela resposta. Realmente interessante a parte em que você fala sobre a seleção do proxy certo para falar sobre a participação em P ou NP para a entrada, pode ser uma nova pergunta completa! Além disso, e voltando à pergunta anterior. Na sua opinião, qual deles seria o melhor proxy para um algoritmo cuja entrada é um conjunto de números inteiros? Eu acho que talvez vai depender do algoritmo? Eu vejo três opções possíveis: N (sendo o comprimento do conjunto) N * Log (L) (L sendo o valor máximo) e Log (Sum (conjunto)).
Jesus Salas
@JesusSalas, definitivamente pode depender do que você faz com eles, mas seria a resposta mais simples "perto o suficiente da codificação TM", mas ainda pode ser interessante observar o tempo de execução em termos de N ou talvez N e a magnitude do maior número - é claro que isso é apenas 2 log L , mas às vezes pode ser mais fácil analisar as coisas com medidas não óbvias. NlogLNN 2logL
Luke Mathieson
Isso cobre as bases, mas existem algumas imprecisões. Representar "abcde" em uma máquina de Turing não ocupa caracteres c : são necessários cinco caracteres se você escolher o alfabeto certo. E você não precisa de c n 2 log n bits para representar um gráfico n- vertex: a matriz de adjacência é exatamente n 2 bits. 5ccn2lognnn2
David Richerby
Talvez quando usar N ou N log L possa depender do custo para o algoritmo operar em cada elemento de entrada. Eu acho que se tivermos uma suposição de que o algoritmo usa tempo constante para fazer seu trabalho em cada elemento de entrada independentemente do seu tamanho em bits (e isso não é abusado), então N é provavelmente o correto, resultando em O (N) . Por outro lado, se o tamanho do elemento de entrada em bits aumentar o custo de operação, então N log L parecerá mais preciso, pois deveríamos expressar no limite superior quais propriedades da entrada estão envolvidas no crescimento
Jesus Salas
5c=1c=log255 O(n2logn)bits, mas é um limite superior bastante robusto que pode lidar com ambas as codificações normais.
Luke Mathieson
8

Depende do seu modelo de computação e também, infelizmente, às vezes do próprio algoritmo.

  • ababcd
  • Se o seu modelo é a RAM , o tamanho da entrada é o número de registros / células de memória em que a entrada fica inicialmente. Isso pode ser mal utilizado, pois você pode gravar tecnicamente toda a entrada em um registro. No entanto, os cálculos serão mais caros se você usar o modelo de custos logarítmicos.
  • ww

No entanto, muitos algoritmos não são medidos em relação ao tamanho de entrada "real". Então você deve examinar atentamente o que a declaração da análise se refere.

  • O(nregistron)nO(1)n
  • n×n

n

A.Schulz
fonte
1
nO(n3)nn