Quando dois algoritmos são considerados "semelhantes"?


16

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 "UMAXBX

Reivindicação 2. "Nosso algoritmo é semelhante ao algoritmo "C

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:

  1. Eles devem estar resolvendo o mesmo problema.
  2. 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

  1. eles têm desempenho assintótico diferente?
  2. para uma classe especial de gráficos, um algoritmo requer o tempo enquanto o outro requer tempo?Ω(n)O(n1 1/3)
  3. eles têm diferentes condições de terminação? (lembre-se, eles estão resolvendo o mesmo problema)
  4. a etapa de pré-processamento é diferente nos dois algoritmos?
  5. 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!


11
realmente depende do contexto. Por exemplo, para certos algoritmos seqüenciais, DFS e BFS são muito diferentes e talvez nem funcione. Em configurações paralelas, o DFS (ou pelo menos uma variante) é P-completo, enquanto o BFS é "fácil em paralelo".
Suresh Venkat

@SureshVenkat - Concordo que a questão depende muito do contexto. No interesse de não iniciar um debate, eu absteve-se de tomar nomes de "os dois algoritmos" correndo o risco de soar vago :-)
Rachit

4
O problema é que há perto e há perto. Existe uma maneira de pensar no método de atualização multiplicativa de peso como "essencialmente uma pesquisa binária", mas no contexto errado isso pareceria insano. FWIW, em todos os seus casos acima, posso imaginar declarar os dois algoritmos diferentes.
Suresh Venkat

11
Esta pergunta parece muito subjetiva para mim. Você está basicamente pedindo uma definição de "semelhante", quando não existe uma definição canônica.
31512 Joe

Respostas:


23

É 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. .UMA2B1 1UMAB

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


17

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 ".


7

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 MUMAMsem:UMAMsem(P)PMMMno 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.sem(P)sem(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,)xyxyMsem(P)sem(Q)Pé um traço de . Podemos interpretar isso como dizendo que P é mais determinista do que Q .QPQ

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.


5

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".


3

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:

  1. Ryan já apontou que os dois algoritmos devem resolver o mesmo problema . Pode-se ir ainda mais longe e generalizar essa noção dizendo que geralmente é suficiente provar que há uma transformação polinomial da mesma instância que é compreensível pelo algoritmo A, para que o algoritmo B possa lidar com isso. No entanto, isso seria realmente muito fraco. Prefiro pensar na semelhança em um sentido mais forte.
  2. No entanto, eu nunca esperaria que dois algoritmos equivalentes tivessem a mesma idéia intuitiva - embora, novamente, essa seja uma definição que não seja fácil de capturar. Mais do que isso, geralmente acontece que algoritmos considerados semelhantes não seguem a lógica principal. Considere, por exemplo, alguns algoritmos de classificação que, no entanto, se originaram de maneiras diferentes, seguindo idéias diferentes. Como exemplo extremo, considere os algoritmos genéticos que geralmente são considerados pela comunidade matemática como processos estocásticos (e, portanto, são equivalentes em sua visão) que são modelados e analisados ​​de uma maneira bem diferente.
  3. N(N2-1 1)os bancos de dados de padrões aditivos realmente expandiriam o mesmo número de nós na mesma ordem, e isso faz com que ambos os algoritmos (e suas heurísticas) sejam estritamente equivalentes em um sentido muito forte, enquanto a primeira abordagem não tem pré-processamento e a segunda possui uma sobrecarga significativa antes de começar a resolver uma instância específica. No entanto, assim que seus bancos de dados de padrões considerarem interações mais simulatensas, haverá uma enorme lacuna no desempenho entre eles, de forma que elas sejam definitivamente idéias / algoritmos diferentes.
  4. De fato, acho que a maioria das pessoas julgaria os algoritmos por seu objetivo e desempenho . Portanto, o desempenho assintótico é uma boa métrica para raciocinar sobre a semelhança entre os programas. No entanto, lembre-se de que esse desempenho não é necessariamente o caso típico, de modo que, se dois algoritmos tiverem o mesmo desempenho assintótico, mas se comportarem de maneira diferente na prática, você provavelmente concluirá que eles são diferentes. A forte evidência nesse sentido seria que ambos os algoritmos têm o mesmo desempenho no tempo e na memória (e isso, como disse Suresh, faz o DFS e o BFS parecerem diferentes). Caso essa afirmação não pareça convincente para você, consulte o excelente (e livro muito recomendado): Programming the Universede Seth Lloyd. Na página 189, ele se refere a uma lista com mais de 30 medidas de complexidade que podem ser usadas para considerar algoritmos diferentes.

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,


11
Na verdade, Ryan sugeriu que é não necessário para ambos os algoritmos para resolver o mesmo problema.
10134 Jeffε

Verdade! Eu estava apenas coletando minhas opiniões a esse respeito, mas você está definitivamente certo!
Carlos Linares López

2

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:

  1. Tipos de entrada / saída
  2. Complexidade algorítmica / de memória
  3. Suposições sobre tipos de entradas (por exemplo, apenas números positivos ou estabilidade de ponto flutuante)
  4. Relações aninhadas (por exemplo, alguns algoritmos são casos especiais de outros)

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.