Paul Erdos falou sobre o "Livro", onde Deus guarda a prova mais elegante de cada teorema matemático. Isso até inspirou um livro (que eu acredito que está agora em sua 4ª edição): Provas do livro .
Se Deus tivesse um livro semelhante para algoritmos, quais algoritmos você acha que seriam candidatos?
Se possível, forneça também uma referência clicável e os principais insights que o fazem funcionar.
Apenas um algoritmo por resposta, por favor.
Respostas:
A localização de união é um problema bonito, cujo melhor algoritmo / estrutura de dados (Disjoint Set Forest ) é baseado em uma pilha de espaguete. Embora muito simples e intuitivo o suficiente para explicar a uma criança inteligente, demorou vários anos para garantir um estreito vínculo com o tempo de execução. Por fim, descobriu-se que seu comportamento estava relacionado à função inversa de Ackermann, uma função cuja descoberta marcou uma mudança de perspectiva sobre a computação (e foi de fato incluída em On the Infinite, de Hilbert ).
A Wikipedia fornece uma boa introdução para Disjoint Set Forests .
fonte
Correspondência de string de Knuth-Morris-Pratt . As oito linhas de código mais lisas que você já viu.
fonte
O algoritmo de Blum, Floyd, Pratt, Rivest, e Tarjan para encontrar o k -ésimo elemento de uma lista não ordenada no tempo linear é uma bela algoritmo, e só funciona porque os números são apenas para a direita para caber no Teorema Mestre. É o seguinte:
fonte
Binary Pesquisa é o algoritmo mais simples, bonito e útil que eu já correr em.
fonte
Estou surpreso por não ver o algoritmo de Floyd-Warshall para os caminhos mais curtos de todos os pares aqui:
fonte
Algoritmo euclidiano para calcular o maior divisor comum (MDC)
fonte
Pode parecer um tanto trivial (especialmente em comparação com as outras respostas), mas acho que o Quicksort é realmente elegante. Lembro que, quando o vi pela primeira vez, pensei que era realmente complicado, mas agora parece muito simples.
fonte
Codificação de Huffman para compactação de dados.
fonte
O teste de primalidade de Miller-Rabin (e testes similares) deve estar no livro. A idéia é tirar proveito das propriedades dos números primos (isto é, usando o pequeno teorema de Fermat) para procurar probabilisticamente uma testemunha de que o número não é primo. Se nenhuma testemunha for encontrada após testes aleatórios suficientes, o número será classificado como primo.
Nessa nota, o teste de primalidade da AKS que mostrou PRIMES está em P certamente deveria estar em The Book!
fonte
Teste de identidade polinomial com o lema de Schwartz-Zippel :
Se alguém o acordasse no meio da noite e lhe pedisse para testar duas expressões polinomiais univariadas para identificar a identidade, você provavelmente as reduziria à forma normal da soma dos produtos e compararia à identidade estrutural. Infelizmente, a redução pode levar um tempo exponencial; é análogo a reduzir expressões booleanas para a forma normal disjuntiva.
Supondo que você seja do tipo que gosta de algoritmos aleatórios, sua próxima tentativa provavelmente seria avaliar os polinômios em pontos escolhidos aleatoriamente em busca de contra-exemplos, declarando que os polinômios são muito provavelmente idênticos se forem aprovados em testes suficientes. O lema de Schwartz-Zippel mostra que, à medida que o número de pontos aumenta, a chance de um falso positivo diminui muito rapidamente.
Nenhum algoritmo determinístico para o problema é conhecido que é executado no tempo polinomial.
fonte
Primeira pesquisa de profundidade . É a base de muitos outros algoritmos. Também é enganosamente simples: por exemplo, se você substituir a fila em uma implementação de BFS por uma pilha, você recebe o DFS?
fonte
Algoritmo de Dijkstra : o problema de caminho mais curto de fonte única para um gráfico com custos de caminho de borda não negativos. É usado em todos os lugares e é um dos algoritmos mais bonitos do mercado. A Internet não poderia ser roteada sem ela - é uma parte essencial dos protocolos de roteamento IS-IS e OSPF (Open Shortest Path First).
fonte
A peneira de Eratóstenes , simples e intuitiva.
Eu também gosto da beleza do algoritmo de Horner .
fonte
O esquema de criptografia totalmente homomórfica de Gentry (sobre treliças ideais ou sobre números inteiros) é incrivelmente bonito. Ele permite que terceiros executem cálculos arbitrários em dados criptografados sem acesso a uma chave privada.
O esquema de criptografia é devido a várias observações aguçadas.
Em sua tese, Craig Gentry resolveu um problema aberto de longa data (e deslumbrante) em criptografia. O fato de existir um esquema totalmente homomórfico exige que reconheçamos que existe alguma estrutura inerente à computabilidade que, de outra forma, poderíamos ter ignorado.
http://crypto.stanford.edu/craig/craig-thesis.pdf
http://eprint.iacr.org/2009/616.pdf
http://portal.acm.org/citation.cfm?id=1666420.1666445
fonte
O algoritmo Cooley-Tukey FFT .
fonte
Algoritmo de Strassen para multiplicação de matrizes.
fonte
O algoritmo de casamento estável de Gale-Shapley . Esse algoritmo é ganancioso e muito simples, não é óbvio a princípio por que funcionaria, mas a prova de correção é novamente fácil de entender.
fonte
O algoritmo de tempo linear para a construção de matrizes de sufixos é realmente bonito, embora não tenha realmente recebido o reconhecimento que merecia http://www.cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf
fonte
Eliminação gaussiana. Ele completa a sequência de generalização do algoritmo Euclidean GCD para Knuth-Bendix.
fonte
Fiquei impressionado quando vi pela primeira vez o algoritmo para amostragem de reservatórios e sua prova. É o típico quebra-cabeça do tipo "quebra-cabeças" com uma solução extremamente simples. Eu acho que definitivamente pertence ao livro, tanto para algoritmos quanto para teoremas matemáticos.
Quanto ao livro, a história conta que, quando Erdös morreu e foi para o céu, ele pediu para se encontrar com Deus. O pedido foi atendido e, para a reunião, Erdös tinha apenas uma pergunta. "Posso procurar no livro?" Deus disse que sim e levou Erdös a ele. Naturalmente muito empolgado, Erdös abre o livro apenas para ver o seguinte.
Teorema 1: ...
Prova: Óbvio.
Teorema 2: ...
Prova: Óbvio.
Teorema 3: ...
Prova: Óbvio.
fonte
O algoritmo da tartaruga e da lebre . Gosto disso porque tenho certeza de que, mesmo que desperdicei minha vida inteira tentando encontrá-la, não há como surgir essa idéia.
fonte
Um exemplo tão fundamental e "trivial" quanto a prova de Euclides de infinitos primos:
Aproximação 2 para MAX-CUT - Independentemente de cada vértice, atribua-o a uma das duas partições com igual probabilidade.
fonte
Eu sempre fui parcial ao algoritmo de Christofides, que fornece uma aproximação (3/2) para o TSP métrico. Na verdade, me chame de fácil agradar, mas eu até gostei do algoritmo de 2 aproximações que veio antes dele . O truque de Christofides de fazer uma euleriana de árvore de abrangência de peso mínimo adicionando uma correspondência de seus vértices de grau ímpar (em vez de duplicar todas as arestas) é simples e elegante, e é preciso pouco para convencer a pessoa de que essa correspondência não tem mais da metade do peso de um passeio ideal.
fonte
Mesclar Classificação . Simples, elegante, eficiente.
fonte
fonte
Algoritmos para programação linear : métodos simplex, elipsóide e de ponto interior.
http://en.wikipedia.org/wiki/Linear_programming#Algorithms
fonte
Algoritmo Robin Moser para resolver uma determinada classe de instâncias SAT. Tais instâncias são solucionáveis pelo Lovasz Local Lemma. O algoritmo de Moser é de fato uma des randomização da declaração do lema.
Penso que há alguns anos seu algoritmo (e a técnica para sua prova de correção) será bem digerido e refinado a ponto de ser um candidato viável para um algoritmo do livro .
Esta versão é uma extensão de seu artigo original, escrito com Gábor Tardos.
fonte
O algoritmo mais rápido e mais curto de Marcus Hutter para todos os problemas bem definidos .
Isso meio que contraria o espírito das outras ofertas desta lista, uma vez que é apenas de interesse teórico e não prático, mas, novamente, o título diz tudo. Talvez deva ser incluído como um relato de advertência para aqueles que observariam apenas o comportamento assintótico de um algoritmo.
fonte
O algoritmo X de Knuth encontra todas as soluções para o problema exato de cobertura . O que há de mais mágico nisso é a técnica que ele propôs para implementá-lo com eficiência: Dancing Links .
fonte
Penso que devemos incluir os de Schieber-Vishkin , que respondem às consultas mais baixas de ancestrais comuns em tempo constante, pré-processando a floresta em tempo linear.
Gosto da exposição de Knuth no volume 4, fascículo 1, e de sua reflexão . Ele disse que levou dois dias inteiros para entender completamente, e eu lembro de suas palavras:
fonte