Gostaria de saber, existe um método para análise automática de tempo de execução que funciona pelo menos em um subconjunto relevante de algoritmos (algoritmos que podem ser analisados)?
Eu pesquisei "Análise automática de algoritmo", o que me deu isso, mas é muito matemático. Eu só quero um exemplo simples no psuedocode que eu possa entender. Pode ser muito específico, mas achei que valia a pena tentar.
Respostas:
A ferramenta COSTA faz exatamente isso, embora falhe em muitos casos, como você pode imaginar, devido a problemas de computabilidade . Existem muitos artigos sobre isso; Análise de custos do bytecode Java por E. Albert, P. Arenas, S. Genaim, G. Puebla, D. Zanardini é um bom ponto de partida.
A abordagem adotada é inferir uma recorrência em tempo de execução do código Javabyte, convertendo-o em um formulário fechado. A ferramenta também calcula os limites de uso de espaço.
fonte
Nenhum algoritmo pode decidir se um determinado algoritmo é interrompido ou não, portanto, em particular, nenhum algoritmo pode analisar rigidamente a complexidade de um determinado algoritmo.
fonte
Conheço uma abordagem para a análise de caso médio (semi) automatizada, a saber, MaLiJAn ¹. É muito parecido com o tipo de análise que Knuth usa no TAoCP. A idéia central é
Observe que apenas medidas de custo aditivo (por exemplo, comparações, "tempo") funcionam e apenas o valor esperado é preciso (assumindo funções perfeitas de probabilidade), momentos mais altos não podem ser derivados.
Todas as etapas, exceto a extrapolação, são rigorosas [2] e foi demonstrado que o método reproduz resultados bem conhecidos com alta precisão - dados dados de amostra aleatória adequados, é claro. Embora não haja prova ou mesmo garantia de aproximação nos resultados (a etapa de extrapolação é, até o momento, puramente heurística), os resultados obtidos com a ferramenta servem bem para experimentar algoritmos difíceis de analisar e formular hipóteses [3,4].
fonte
Obviamente, como observado por Yuval Filmus, não se deve esperar uma solução geral para esses problemas. Mas, como geralmente é o caso, podem ser encontradas soluções para subconjuntos interessantes do caso geral.
Eu não sou especialista em nada, nem tenho um conhecimento significativo nessa área, pois conheço algum trabalho desse tipo. Trata-se de análise automática de complexidade média, e o trabalho foi realizado por Philippe Flajolet e seus colegas.
Pelo que entendi quando me foi explicado, os autores projetaram uma linguagem pequena (nada de Turing completo como você poderia esperar, mas significativo o suficiente) para que qualquer algoritmo escrito dentro da restrição dessa linguagem pudesse ter sua complexidade média analisada automaticamente. O sistema foi chamado na época Lambda-Upsilon-Omega, ou seja, (eu desamarro).λυ´ω
Um artigo que encontrei na web é o artigo de 1990: análise automática de casos médios de algoritmos por Philippe Flajolet, Paul Zimmermann e Bruno Salvy .
Eu esperaria que trabalhos posteriores estendessem esse trabalho, mas eu realmente não sei. O trabalho foi bastante citado e a pesquisa na Web deve render trabalhos mais recentes sobre o mesmo tópico.
Agora, receio que o trabalho de Flajolet e seus colegas tenha sido muito matemático, e eu não esperaria uma leitura muito fácil.
fonte