Não trabalho em teoria, mas meu trabalho exige a leitura (e a compreensão) de trabalhos de teoria de vez em quando. Depois de entender um (conjunto de) resultados, discuto esses resultados com pessoas com quem trabalho, a maioria das quais também não trabalha em teoria. Durante uma dessas discussões, surgiu a seguinte pergunta:
Quando alguém diz que dois algoritmos dados são "semelhantes"?
O que quero dizer com "semelhante"? Digamos que dois algoritmos sejam semelhantes se você puder fazer uma das seguintes reivindicações em um artigo sem confundir / incomodar qualquer revisor (boas definições bem-vindas):
Reivindicação 1. "O algoritmo , que é semelhante ao algoritmo , também resolve o problema "X
Reivindicação 2. "Nosso algoritmo é semelhante ao algoritmo "
Deixe-me torná-lo um pouco mais específico. Suponha que estamos trabalhando com algoritmos de gráfico. Primeiro, algumas condições necessárias para que os dois algoritmos sejam semelhantes:
- Eles devem estar resolvendo o mesmo problema.
- Eles devem ter a mesma ideia intuitiva de alto nível.
Por exemplo, falando sobre travessia de gráfico, travessia de largura primeiro e profundidade primeiro satisfazem as duas condições acima; para cálculos de caminho mais curto, a amplitude em primeiro lugar e o algoritmo de Dijkstra atendem às duas condições acima (em gráficos não ponderados, é claro); etc.
Essas também são condições suficientes? Mais especificamente, suponha que dois algoritmos satisfaçam as condições necessárias para serem semelhantes. Você realmente os chamaria de semelhantes, se
- eles têm desempenho assintótico diferente?
- para uma classe especial de gráficos, um algoritmo requer o tempo enquanto o outro requer tempo?
- eles têm diferentes condições de terminação? (lembre-se, eles estão resolvendo o mesmo problema)
- a etapa de pré-processamento é diferente nos dois algoritmos?
- a complexidade da memória é diferente nos dois algoritmos?
Edit: A questão é claramente muito dependente do contexto e é subjetiva. Eu esperava que as cinco condições acima permitissem obter algumas sugestões. É um prazer modificar a pergunta e fornecer mais detalhes, se necessário, para obter uma resposta. Obrigado!
fonte
Respostas:
É um problema difícil fornecer uma definição coerente de "O algoritmo A é semelhante ao algoritmo B". Por um lado, não acho que "eles devam resolver o mesmo problema" seja uma condição necessária. Freqüentemente, quando se diz em um artigo que "o algoritmo do Teorema 2 é semelhante ao algoritmo B no Teorema 1 ", o algoritmo A está realmente resolvendo um problema diferente do do B , mas tem algumas pequenas modificações para lidar com o novo problema. .UMA 2 B 1 1 UMA B
Mesmo tentando determinar o que significa dois algoritmos iguais, é um problema interessante e difícil. Veja o artigo "Quando dois algoritmos são iguais?" http://research.microsoft.com/~gurevich/Opera/192.pdf
fonte
Na maioria das vezes, significa "Não quero escrever o algoritmo B em detalhes, porque todos os detalhes interessantes são quase idênticos aos do algoritmo A e não quero ultrapassar o limite de 10 páginas, e, de qualquer forma, o prazo para envio é de três horas ".
fonte
Se você quer dizer "semelhante" no sentido coloquial, acho que a resposta de JeffE captura o que algumas pessoas querem dizer.
No sentido técnico, porém, isso depende do que você gosta. Se você gosta de complexidade de tempo assintótica, a diferença entre recursão e iteração pode não ter importância. Se você gosta de computabilidade, a diferença entre uma variável de contador e uma pilha de um símbolo não importa.
Para comparar algoritmos, um primeiro passo seria tornar precisa a noção de equivalência. Intuitivamente, deixe ser o espaço de algoritmos e M ser um espaço de objectos matemáticos e s e m : Um → H ser uma codificação função que s e m ( P ) é o significado de algoritmo P . O espaço M pode conter qualquer coisa que varia do número de variáveis em seu algoritmo, ao gráfico de estados ou à complexidade do tempo. Não acredito que exista uma noção absoluta do que M possa ser. Dado MUMA M s e m :A→M s e m (P) P M M M no entanto, podemos dizer que dois algoritmos são equivalentes se igual a s e m ( Q ) . Deixe-me acrescentar que acho que cada um dos cinco critérios mencionados pode ser formalizado matematicamente dessa maneira.s e m (P) s e m (Q)
Se quisermos falar sobre um algoritmo ser mais geral que outro (ou um algoritmo que refina outro), eu daria a mais estrutura. Imagine que ( M , ⊑ ) é um conjunto parcialmente ordenado e a ordem x ⊑ y codifica que x é um objeto mais definido que y . Por exemplo, se M contém conjuntos de vestígios de um algoritmo e ⊑ é inclusão conjunto, s e m ( P ) ⊑ s e m ( Q ) significa que todos os vestígios de PM ( M, ⊑ ) x ⊑ y x y M ⊑ s e m (P) E s e m ( Q ) P é um traço de . Podemos interpretar isso como dizendo que P é mais determinista do que Q .Q P Q
Em seguida, poderíamos perguntar se é possível quantificar a proximidade de dois algoritmos. Nesse caso, eu imaginaria que deve ser dotado de uma métrica. Então, podemos medir a distância entre os objetos matemáticos que dois algoritmos representam. Outras possibilidades são mapear algoritmos para medir espaços ou espaços de probabilidade e compará-los usando outros critérios.M
De maneira mais geral, eu perguntaria: com o que você se importa (em termos intuitivos), quais são os objetos matemáticos que representam essas propriedades intuitivas, como posso mapear dos algoritmos para esses objetos e qual é a estrutura desse espaço? Eu também perguntaria se o espaço dos objetos possui estrutura suficiente para admitir uma noção de similaridade. Essa é a abordagem que eu adotaria vindo de uma perspectiva semântica da linguagem de programação. Não tenho certeza se você acha essa abordagem atraente, dadas as vastas culturas de pensamento da ciência da computação.
fonte
Na linha da resposta de Jeff, dois algoritmos são semelhantes se o autor de um deles espera que o autor do outro possa estar revisando seu artigo.
Mas, brincando à parte, na comunidade teórica, eu diria que o problema que o algoritmo A está resolvendo é bastante tangencial para ser "semelhante" ao algoritmo B, que pode estar resolvendo um problema completamente diferente. A é semelhante a B se "funciona" por causa da mesma idéia teórica principal. Por exemplo, em ambos os algoritmos, a idéia principal é que você pode projetar os dados em um espaço dimensional muito mais baixo, preservar as normas com o lema Johnson-Lindenstrauss e fazer uma pesquisa por força bruta? Então, seu algoritmo é semelhante a outros algoritmos que fazem isso, independentemente do problema que você está resolvendo. Há um pequeno número de técnicas algorítmicas pesadas que podem ser usadas para resolver uma grande variedade de problemas, e eu pensaria que essas técnicas formam os centróides de muitos conjuntos de algoritmos "semelhantes".
fonte
Pergunta muito interessante, e muito bom papel Ryan!
Definitivamente, concordo com a ideia de que fazer uma avaliação da similaridade geral entre algoritmos é principalmente um julgamento subjetivo do valor. Embora, do ponto de vista técnico, existam vários recursos que são observados de perto para decidir sobre a semelhança de algoritmos, no final, também é uma questão de gosto pessoal. Tentarei fornecer uma descrição da importância de ambos os lados da mesma moeda, referindo-me aos pontos específicos da sua pergunta:
Do ponto de vista técnico:
Então, o que torna os algoritmos semelhantes / diferentes? Na minha opinião (e isso é puramente especulativo), a principal diferença está no que eles sugerem para você. Muitos, muitos (muitos!) Algoritmos diferem apenas em alguns aspectos técnicos quando atendem ao mesmo objetivo, de modo que o caso típico é diferente para diferentes intervalos de entrada. No entanto, a maior de todas as diferenças é (para mim) o que elas sugerem para você. Os algoritmos têm capacidades diferentes e, portanto, seus próprios pontos fortes e fracos. Se dois algoritmos parecem iguais, mas podem ser estendidos de maneiras diferentes para lidar com casos diferentes, concluo que eles são diferentes. Muitas vezes, no entanto, dois algoritmos têm a mesma aparência, de modo que você os considera iguais ... até que alguém chegue fazendo uma distinção importante e, de repente, eles são completamente diferentes!
Desculpe, minha resposta foi no final por tanto tempo ...
Felicidades,
fonte
Qualquer menção de similaridade sem definir uma métrica de similaridade não está bem definida. Existem várias maneiras pelas quais dois algoritmos podem ser semelhantes:
Quicksort e Mergesort resolvem problemas muito semelhantes, mas eles usam algoritmos diferentes para fazer isso. Eles têm complexidade algorítmica semelhante (embora o desempenho do pior caso e o uso de memória possam variar). Quicksort e Mergesort são semelhantes ao Bubblesort, no entanto, o Bubblesort possui métricas de desempenho muito diferentes. Se você ignorar as estatísticas de complexidade, Quicksort, Mergesort e Bubblesort estão todos na mesma classe de equivalência. No entanto, se você se preocupa com a complexidade algorítmica, o Quicksort e o Mergesort são muito mais semelhantes entre si do que o Bubblesort.
A programação dinâmica de Smith-Waterman e a comparação de sequências HMM tentam resolver o problema de alinhar duas sequências. No entanto, eles recebem entradas diferentes. Smith-Waterman usa duas seqüências como entrada, e as comparações entre seqüências HMM usam HMM e uma sequência como entrada. Ambos os alinhamentos da sequência de saída. Em termos de idéias motivadoras, ambas são semelhantes à distância de edição de Levenshtein , mas apenas em um nível muito alto.
Aqui estão alguns critérios pelos quais dois algoritmos podem ser chamados de semelhantes:
A decisão crítica sobre o significado de similaridade permanece. Às vezes você se preocupa com a complexidade de um algoritmo, às vezes não. Como a definição de similaridade depende do contexto da discussão, o termo "algoritmo similar" não está bem definido.
fonte