Muitas vezes, se o tempo de execução de um algoritmo for uma expressão complicada, o próprio algoritmo também será complicado e impraticável. Cada uma das raízes do cubo e fatores no tempo de execução assintótico tende a adicionar complexidade ao algoritmo e também ocultar fatores constantes no tempo de execução.
Temos exemplos impressionantes em que essa regra geral falha?
É claro que é fácil encontrar exemplos de algoritmos que são muito difíceis de implementar, apesar de terem um tempo de execução no pior dos casos muito simples. Mas e o inverso?
Temos exemplos de algoritmos determinísticos muito simples e práticos, fáceis de implementar, mas que apresentam uma expressão muito complicada como seu pior caso de tempo de execução assintótico?
Observe as palavras-chave "determinística" e "pior caso"; a análise de algoritmos aleatórios simples leva facilmente a expressões complicadas.
Claro que o que é "complicado" é uma questão de gosto. De qualquer forma, eu preferiria ver uma expressão que é feia demais para colocar no título do seu trabalho. E eu preferiria uma função complicada de um parâmetro natural (tamanho da entrada, número de nós etc.).
PS. Eu pensei que não faria disso uma "questão da grande lista", e não da CW. Eu gostaria de encontrar um único exemplo excelente (se existir). Portanto, publique outra resposta apenas se você achar que é "melhor" do que qualquer uma das respostas até agora.
fonte
Respostas:
O melhor exemplo em que posso pensar é em um algoritmo (descrito abaixo) para calcular o nível em um arranjo de n linhas no plano, ou seja, a linha poligonal formada pelos pontos que possuem exatamente k linhas verticalmente acima dele. Este não é o algoritmo mais eficiente conhecido para o problema. Existem algoritmos mais eficientes com complexidades mais simples, mas acredito que este seja mais prático do que a maioria (se não todos). A análise provavelmente não é rígida, porque usa a complexidade do nível k , que é um famoso problema aberto (acho que todos os outros termos da análise são rígidos). Mesmo assim, duvido que limites aprimorados para o nível k tornem o tempo de execução muito mais simples. Eu vou assumir k =k n k k k para escrever a complexidade em função de n sozinho.k = n / 2 n
O algoritmo é baseado no paradigma de varredura de linha e usa dois torneios cinéticos -ary como filas de prioridade cinética. Inserções e exclusões são realizadas quando uma linha fica acima ou abaixo do nível k , movendo uma linha de um torneio cinético para outro. Portanto, existem S ( n 4 / 3 ) inserções e deleções (usando ligado para o de Dey k complexidade -level). Cada evento é processado em O ( log n ) de tempo e existem S ( n 4 / 3 α ( n( logn ) k O(n4/3) k O(logn) eventos (o α ( n ) vem da complexidade do envelope superior dos arranjos dos segmentos de linha, enquanto o log n / log log n vem da altura de umaárvore ( log n ) -ary ) O tempo total de execução éO(n4/3α(n)logn/loglogn) α(n) logn/loglogn (logn)
Consulte o manuscrito de Timothy Chan http://www.cs.uwaterloo.ca/~tmchan/lev2d_7_7_99.ps.gz para obter mais detalhes e referências. O fator pode ser removido usando um torneio cinético binário (em vez de ( log n ) -ary), mas na verdade acelera a fila de prioridade cinética nos testes que eu executei. A complexidade deve ficar um pouco mais feia e pior (embora o algoritmo ainda seja prático) se um heap cinético for usado em vez de um torneio cinético (um log dentro de uma raiz quadrada deve aparecer).1/loglogn (logn) log
fonte
As operações da estrutura de dados de localização da união parecem atender aos seus critérios:
http://en.wikipedia.org/wiki/Disjoint-set_data_structure
fonte
Algoritmo simplex. Fácil de implementar e funciona maravilhosamente na prática, mas é uma bagunça para analisar teoricamente.
fonte
Não tenho certeza se você considera isso "prático", mas é um famoso problema aberto. Paul Erdos disse sobre a conjectura de Collatz: "A matemática ainda não está pronta para esses problemas"
fonte
Este exemplo, embora não atenda à letra da sua solicitação, pode ser interessante porque possui alguma afinidade espiritual. Especificamente, a questão de classificar pilhas de panquecas e panquecas queimadas por reversões.
http://en.wikipedia.org/wiki/Pancake_sorting
Uma área de aplicação é a biologia computacional (genética), onde perguntas sobre rearranjos genômicos podem ser apresentadas em termos da distância entre permutações, usando reversões de partes das permutações sujeitas a várias regras.
fonte