Quais são os algoritmos significativos para a humanidade nas últimas décadas? [fechadas]


40

Quais algoritmos mais importantes do mundo contribuíram mais para a humanidade nas últimas décadas?

Eu pensei que este é um bom conhecimento geral para um desenvolvedor conhecer.

Atualização:
Se possível, mantenha a resposta para um algoritmo de programação específico .
Gostaria de obter uma lista dos mais importantes, apenas um algoritmo por resposta.
Por favor, considere indicar por que o algoritmo é significativo e importante ...


2
Está sendo fechado porque (até agora) quatro pessoas consideram "não uma pergunta real", provavelmente porque não temos nenhuma idéia real do que, isoladamente, é um importante algoritmo de programação.
David Thornley

2
Pode ser fora de tópico, mas é uma pergunta real.
19410 Jeremy

11
+1 boa pergunta. Sugiro perguntar novamente em cstheory.stackexchange.com #
Aleksandr Levchuk

11
Por que você responde suas próprias perguntas? Várias vezes?

2
Nenhuma resposta errada + número ilimitado de respostas + um comentário inequívoco pedindo "uma por resposta" + o autor publica várias de suas próprias respostas = caso do livro didático de uma pergunta não construtiva. Eu sei que é velho, mas vamos fechar isso.
Aaronaught 27/05

Respostas:


59

A criptografia de chave pública / privada é muito importante. O comércio na Internet não seria tão onipresente sem ele.


4
+1 e para adicionar à sua resposta, RSA.
sange

Há todo um grupo de algoritmos e práticas recomendadas envolvidos na transformação de códigos criptográficos (como o RSA) em soluções práticas.
Donal Fellows

37

Algoritmo de Dijkstra

O algoritmo existe em todos os roteadores do mundo, para identificar a melhor rota entre dois nós em uma rede.


Você tem certeza? A maioria dos roteadores sabe que o número IP pertence a ele e o encaminha para a máquina na rede local, ou conhece um roteador que conhece melhor - o roteador padrão - e nesse caso o pacote vai para esse roteador. Os grandes roteadores podem saber que, para o intervalo de endereços IP X1-Y1, o pacote deve ir para o roteador R1, para o intervalo X2-Y2, o pacote deve ir para o roteador R2, etc. Não há algoritmo Dijkstras envolvido nisso.

2
@ Thorbjørn Ravn Andersen: Mas, para o roteador saber essa informação, alguém em algum momento teria que usar o algoritmo de Dijkstra. Sim, não é usado para rotear cada pacote individual, mas é usado para determinar tabelas de roteamento em grandes redes. +1.
quer

@ Billy, onde exatamente você esperaria que o algoritmo Dijkstra seja realmente usado e por quem?

@ Thorbjørn Ravn Andersen: Na minha opinião, ele desempenha um papel no OSPF, que é a base da escolha das rotas corretas para redes pequenas. As conexões entre redes maiores usam o BGP, que é mais baseado em políticas. Não tenho certeza se o BGP usa o algoritmo de Dijkstra ou não.
Billy ONeal

3
@ Billy, mas minha objeção era "existe em TODOS OS roteadores do mundo". Isso é - na minha opinião - claramente errado.

30

Transformada rápida de Fourier (FFT)

O FFT é um método extremamente importante e amplamente utilizado para extrair informações úteis de sinais amostrados .

Uma transformada rápida de Fourier (FFT) é um algoritmo eficiente para calcular a transformada discreta de Fourier (DFT) e sua inversa.


4
Eu já tinha um chefe que, décadas antes, havia escrito uma série de funções da FFT para o PDP-11. Ele vendeu um baralho de cartões perfurados com essas funções com um anúncio na parte de trás da Popular Science e fez um banco bastante sério. Evidentemente, ele tinha pessoas usando seu código para tudo, desde processamento de sinais até previsão do mercado de ações.
Dan Ray

26

Ranking da página

PageRank é um algoritmo de análise de links, nomeado em homenagem a Larry Page, usado pelo mecanismo de busca na Internet do Google que atribui uma ponderação numérica a cada elemento de um conjunto de documentos com hiperlink, como a World Wide Web, com o objetivo de "medir" seus parentes importância dentro do conjunto.


haha, nossas respostas eram apenas 2 segundos de diferença, desculpe :)
Maksee

não há problema algum! :)
Amir Rezaei

36
Eu nunca percebi que ele recebeu o nome de Larry Page. Sempre presumi que o nome tivesse algo a ver com páginas da Web.
JohnFx

11
@JohnFx Whoa, sem brincadeira!
Mark C

+1: mas pode se qualificar se o algoritmo real não for conhecido pela humanidade? (IIRC wikipedia do é uma aproximação)
Steven Evers

22

Algoritmos de compactação de dados

Na ciência da computação e na teoria da informação, a compactação de dados ou a codificação da fonte é o processo de codificar informações usando menos bits (ou outras unidades portadoras de informações) do que uma representação não codificada usaria, através do uso de esquemas de codificação específicos.


2
Exatamente e acho que o algoritmo básico de compressão LZW pode ser considerado um dos algoritmos mais bonitos da engenharia de software.
Mjuba

"se possível, forneça o nome do algoritmo específico"

14

Smith-Waterman (e Needleman-Wunsch)

Isso pode ser muito buscado, por favor, comente.

Smith-Waterman: O Algoritmo de Alinhamento de Sequência

Penso que um desses exemplos são os algoritmos de Smith-Waterman e Needleman-Wunsch e suas aproximações. Todos eles estão essencialmente fazendo a mesma coisa: alinham duas ou mais seqüências de caracteres . Há um significado na biologia. Quando as seqüências de DNA ou proteína são alinhadas - regiões de similaridade estrutural, funcional e evolutiva são reveladas.

BLAST como descendente de Smith-Waterman

Uma heurística que se aproxima de Smith-Waterman é BLAST. Permite pesquisar sequências de grandes bancos de dados quanto à similaridade biológica. A popularidade do BLAST é realmente grande - é muito provavelmente o algoritmo mais usado em Biologia. As áreas mais recentes de Bioinformática e Genômica têm aproximações melhores e mais novas dos algoritmos Smith-Waterman / Needleman-Wunsch, que são mais precisos que o BLAST.

Assembléia do Genoma como descendente de Smith-Waterman

As aproximações de alto rendimento de Smith-Waterman e Needleman-Wunsch, que são mais rápidas que o BLAST, são usadas para montar os genomas a partir do sequenciamento de espingarda - onde o produto da máquina sequenciadora é uma quantidade enorme de leituras de DNA (bilhões) de partes arbitrárias do genoma. muito curto (50 a 100 nucleotídeos). A abordagem foi usada para concluir o Projeto Genoma Humano. Todo o seqüenciamento moderno é feito dessa maneira.

Alinhamento de Seqüências Múltiplas uma extensão de Smith-Waterman

Existem numerosos algoritmos de alinhamento de múltiplas seqüências - eles estão se aproximando de uma versão de várias seqüências do Smith-Waterman / Needleman-Wunsch. Várias sequências são alinhadas como um grupo simultaneamente entre si. É um problema muito mais difícil do que o equivalente aos pares, mas as soluções fornecem muito mais informações sobre a função biológica, a estrutura e a história evolutiva das seqüências relacionadas.


Olá e bem-vindo aos programadores! Convém dividir esta resposta em uma para cada um dos algoritmos que você está apresentando aqui, conforme é habitual para perguntas da lista como essa para facilitar a votação e a classificação.
Yi Jiang

@Yi Jiang: Meu panteão! Eu interpretei seu comentário como "facilitar o vômito". : - /
Dr. Hannibal Lecter

Aqui defendo apenas um algoritmo - Smith-Waterman (e sua variante Needleman-Wunsch) #
Aleksandr Levchuk

13

Siam nomeou os seguintes como os algoritmos mais importantes do século XX:

1946: O algoritmo da metrópole para Monte Carlo . Através do uso de processos aleatórios, esse algoritmo oferece uma maneira eficiente de encontrar respostas para problemas que são muito complicados para resolver exatamente.

1947: Método Simplex para Programação Linear . Uma solução elegante para um problema comum no planejamento e tomada de decisão.

1950: Método de Iteração do Subespaço de Krylov . Uma técnica para resolver rapidamente as equações lineares que abundam na computação científica.

1951: A Abordagem Decompositiva para Computações Matrix . Um conjunto de técnicas para álgebra linear numérica.

1957: O Fortran Optimizing Compiler . Transforma código de alto nível em código legível por computador eficiente.

1959: Algoritmo QR para computação de autovalores . Outra operação crucial da matriz tornada rápida e prática.

1962: Algoritmos de classificação rápida para classificação . Para o manuseio eficiente de grandes bancos de dados.

1965: Transformação rápida de Fourier . Talvez o algoritmo mais onipresente em uso hoje em dia, quebre formas de onda (como som) em componentes periódicos.

1977: Detecção de relação de número inteiro . Um método rápido para identificar equações simples satisfeitas por coleções de números aparentemente não relacionados.

1987: Método Multipolar Rápido . Uma inovação ao lidar com a complexidade dos cálculos de n corpos, aplicada em problemas que vão da mecânica celeste à dobragem de proteínas.

Pessoalmente, eu substituiria a Integer Relation Detection pelo PageRank .


11
A essa lista, acrescentaria 2 livros, embora fossem mais sobre os "teoremas mais importantes" do século XX: Cinco Regras de Ouro amazon.com/Five-Golden-Rules-20th-Century-Mathematics/dp/… , e Mais cinco regras de ouro. amazon.com/Five-More-Golden-Rules-20th-Century/dp/0471395285
Tangurena

As técnicas de Monte Carlo ainda são utilizadas, mais ou menos na forma original. Isso também se aplica à FFT e à Quicksort. A maioria do resto simplesmente não estou familiarizada. O método Simplex para LP não é bem dimensionado, comparado aos métodos mais modernos.
David Thornley

9

PageRank, ame ou odeie, mas afeta as decisões e ações de milhões de pessoas no mundo todo pesquisando diariamente no Google.


9

Se eu tivesse que listar os três principais algoritmos mais importantes em uso hoje em computadores, eu diria:

  1. Pesquisa binária
  2. Ordenação rápida
  3. Algoritmo de Dijkstra

O algoritmo de busca binária é usado constantemente para restringir um item em uma lista classificada, a maioria das pesquisas de índice usará algo nesse sentido em algum momento. Esse algoritmo fornece uma pesquisa de uma lista ordenada em o (log n).

O algoritmo Quicksort finalmente conseguiu classificar para O (n log n) caso médio e O (n ^ 2) caso pior. A classificação é uma das tarefas de dados mais comuns em um computador e uma das mais caras, pois melhorar a classificação média de casos foi um grande avanço em termos de eficiência.

O algoritmo de Dijkstra, como já foi dito, produz um caminho mais curto entre os pontos dentro de um gráfico. Isso é amplamente utilizado para todos os tipos de aplicativos de roteamento, mais amplamente em relação à própria Internet, garantindo que o caminho mais rápido através da rede emaranhada de roteadores interconectados seja usado.


A pesquisa binária teria que ser muito, muito antiga ... Quero dizer, foi formulada 'no passado' e foi em uma 'década', mas já existia há centenas de anos.
Kirk Broadhurst

@Kirk Broadhurst: Ainda assim, é um algoritmo incrivelmente importante para computadores. Independentemente de quando um humano o concebeu pela primeira vez.
Orbling

8

Teorema de Bayes

Provavelmente, contribuiu mais para manter a quantidade de spam que desperdiçou tempo na minha caixa de entrada em um nível gerenciável.

É claro que sou usado em várias outras aplicações que valem a pena, mas matar SPAM é o meu favorito.


Eu desistiria de você, mas esse é um teorema (um dos melhores) e não um algoritmo. No entanto, muitos algoritmos são baseados nesse teorema.
Amir Rezaei

Eu estava apenas tentando agrupar todos eles em uma categoria geral de algoritmos, mas tecnicamente você está correto.
JohnFx

@AmirR Tecnicamente correto, o melhor tipo de correto!
Mark C

7

TimSort

Este é o algoritmo de classificação agora usado em Python , Java 7 e Android

Basicamente:

  • O (N log N) pior caso (não degenera)
  • O (N) para lista quase classificada (de fato N-1exatamente na lista já classificada)

E a beleza disso? É estável ! E, portanto, adequado para a classificação multipass de acordo com vários critérios.

A propósito, se alguém tiver uma implementação C ++ otimizada disponível ...


Não pode ser Θ (NlogN), pois possui esse melhor comportamento em uma lista já classificada. O (NlogN) é a notação correta aqui.
Donal Fellows

Embora este seja legal, eu certamente não o chamaria de "um dos maiores algoritmos inventados nas últimas décadas". O mergesort, no qual o Timsort se baseia, é a conquista real.
Billy ONeal

6

Todos os algoritmos usados ​​para resolver o problema de visibilidade na animação por computador em 3D parecem cruciais para mim.

Algoritmo do pintor

O algoritmo do pintor, também conhecido como preenchimento prioritário, é uma das soluções mais simples para o problema de visibilidade na computação gráfica em 3D. Ao projetar uma cena 3D em um plano 2D, é necessário em algum momento decidir quais polígonos são visíveis e quais estão ocultos.

Z-buffering

Na computação gráfica, o buffer z é o gerenciamento das coordenadas de profundidade da imagem em gráficos tridimensionais (3-D), geralmente feitos em hardware, às vezes em software. É uma solução para o problema de visibilidade, que é o problema de decidir quais elementos de uma cena renderizada são visíveis e quais estão ocultos. O algoritmo do pintor é outra solução comum que, embora menos eficiente, também pode lidar com elementos de cena não opacos. O buffer Z também é conhecido como buffer de profundidade.

Determinação de superfície oculta

Em computação gráfica em 3D, a determinação da superfície oculta (também conhecida como remoção da superfície oculta (HSR), remoção da oclusão (OC) ou determinação da superfície visível (VSD)) é o processo usado para determinar quais superfícies e partes de superfícies não são visíveis de um determinado ponto de vista Um algoritmo de determinação de superfície oculta é uma solução para o problema de visibilidade, que foi um dos primeiros grandes problemas no campo da computação gráfica em 3D. O processo de determinação de superfície oculta é chamado às vezes de oculto e esse algoritmo é chamado de oculto O analógico para a renderização de linhas é a remoção de linhas ocultas. A determinação da superfície oculta é necessária para renderizar uma imagem corretamente, para que não seja possível olhar através das paredes na realidade virtual, por exemplo.


3

Qualquer um que você precise para resolver seu problema atual.


11
Era o que eu ia dizer. Agora eu não tenho que dizer isso.
Robert Harvey

O que não for uma boa resposta. Quaisquer algoritmos não são significativos para a humanidade.
Amir Rezaei

6
Este não é um algoritmo específico e, mesmo que fosse, provavelmente não é importante para a humanidade.
jason

3

Soundex é um algoritmo fonético para indexar nomes por som.


Como a soundex contribuiu para a humanidade?
Barjak

Melhorou a capacidade de usar linguagem natural, corrigindo pequenas diferenças de ortografia e pronúncia regional.
Sal

3

Algoritmo de Viterbi

Originalmente usado para decodificar códigos de correção de erros convolucionais, agora é usado para resolver uma ampla classe de problemas de reconhecimento (variando de reconhecimento de fala a bioinformática). Você pode encontrá-lo em vários dispositivos de comunicação e armazenamento.


O algoritmo +1 de Viterbi é muito importante. @ [Giacomo Verticale] talvez você deva mencionar sua relação com os Modelos de Markov Ocultos (HMMs).
Aleksandr Levchuk 28/11

3

MP3

Embora seja um termo mais geral do que um algoritmo específico, eu mencionaria o MP3 como a agregação dos diferentes algoritmos e técnicas que trabalham em cooperação para gerar esse formato de áudio com perdas.

Certamente foi muito significativo na "era digital".


3

Integração numérica Runge-Kutta . Sem ele, muitas simulações não seriam possíveis. Sem programa espacial, sem energia nuclear, sem balística, sem simulações esportivas, sem coletes à prova de balas, sem simulação de teste de colisão, sem simulação de movimento de fluidos, sem simulações de interação química, sem edifícios resistentes a terremotos ... a lista continua.


+1 @ j172 Eu conheço este, é realmente útil em análises e simulações numéricas.
Amir Rezaei

2

Algoritmo de classificação.


5
embora isso não seja um algoritmo específico ...
Justin L.

Sim, o que Justin L. disse, qual algoritmo de classificação?
dr Hannibal Lecter

O "algoritmo específico" deve ser mesclado, o primeiro dos tipos n lg n.
Billy ONeal

2
@dr Hannibal Lecter: Bolha, é claro. Tudo o resto é otimização prematura.
peterchen

2

11
Que nojo! Eu certamente espero que as pessoas não estejam usando o quicksort no código de produção. Mais importante, o mergesort veio mais cedo e é quase tão rápido. (Esperemos que a maioria do código usa alguma variante introsort)
Billy ONeal

2
@ Billy ONeal, a classificação no .NET é tudo Quicksort. Portanto, qualquer programa que chame List <T> .Sort () usa a classificação rápida na produção.
Steven Evers

@SnOrfus: Você tem provas dessa afirmação? Para minha compreensão, a lista <t> .Sort é baseada no introsort.
precisa


3
@ Thorbjørn: Ainda não é um bom algoritmo de uso geral. Introsort é quicksort, mas muda para a classificação de heap se ultrapassar uma profundidade de recursão especificada. Isso permite que você tenha as boas características do quicksort, mas sempre evita os casos patológicos, mesmo que o algoritmo escolha pivôs ruins.
Billy ONeal

1

Classificação de inserção

Fácil de implementar, muito rápido em pequenas listas e usado nas implementações Merge Sort / Quicksort para agilizá-las. É estável e opera em O (n) em listas classificadas (quando classificadas em ordem crescente).



1

Kalman Filter

Ele é muito usado na navegação e no rastreamento de alvos (para praticamente qualquer sensor: radar, sonar, FLIR, ladar). Um livro mostra um aplicativo em um controlador de unidade de disco. Os sistemas de controle robótico freqüentemente usam filtros Kalman.


0

Linguagem falada e escrita.

Atualmente, eles são um dos algoritmos mais eficientes para transferir conhecimento de uma coisa para outra. Sem linguagem, a sociedade civil não poderia existir e a informação não poderia ser transmitida.


5
-1: os algoritmos podem ser expressos usando a linguagem natural, mas as línguas naturais não são algoritmos.
precisa

2
Você diria que algoritmos de compressão não são algoritmos então? Tudo o que a linguagem faz é comprimir as informações que são transmitidas de uma fonte para um receptor. Ele possui regras específicas que precisam ser seguidas (gramática), como qualquer outro algoritmo, e recebe uma entrada (suas experiências) e produz uma saída diferente (conhecimento). Não vejo como você não considerava a linguagem um algoritmo.
Malfist

Ele falha em todas as definições padrão de algoritmo em várias frentes.
James Reinstate Monica Polk

0

A estrutura de dados do heap e seus algoritmos associados para construção e manutenção de heap.

E mostre algum respeito pelo quicksort. Mesmo que nem sempre seja o tipo de escolha, é um dos algoritmos fundamentais no desenvolvimento histórico da ciência da computação e é um ótimo veículo para entender a recursão e a análise de algoritmos. É lindo, e sim, eu amo isso.


0

Algoritmos de indexação como árvore B, árvore B +, índice de hash, índice de árvore binária etc. Para indexar uma enorme quantidade de dados.


0

MapReduce como uma maneira de dividir, conquistar e paralelizar o processamento de grandes conjuntos de dados.


-1

Algoritmo de força bruta!

Muitas pessoas subestimam esse algoritmo de força bruta. Na verdade, é usado principalmente para resolver problemas sem padrão. Eu amo muito isso!


5
Isso não é um algoritmo. É um tipo de algoritmo.
Adam Lear

É um método para quebrar a criptografia.
Amir Rezaei

Eu acho que também é classificado como um algoritmo. "Comece de x para y faça alguma coisa." <--- algoritmo certo?
xport

Um algoritmo é uma série de etapas para realizar uma tarefa específica . Isso não é específico.
Anto 25/05

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.