Todos os problemas de programação são problemas de algoritmo? [fechadas]

13

Eu gosto de como "Introdução aos algoritmos", de Cormen et al. transmite conhecimento. Uma razão é que tudo tem a ver com problemas de programação e o livro não é implementado em nenhuma linguagem de programação específica. Essa independência de idioma fornece foco nas idéias em geral.

Então, minha pergunta é, como diz o título. Todo problema de programação solucionável é solucionável pensando desta maneira algorítmica. Não importa qual idioma, campo, etc? Se sim, dê argumentos, caso contrário, dê argumentos!

Não implementei muitos programas complexos com GUI, AI, Gráficos, etc ... Mas esses tipos de problemas também são uma questão de pensar em bons algoritmos?

Wittgenstein
fonte
6
O problema mais comum para um programador, imho, é: "ah, foi isso que você quis dizer? Agora eu entendo. Não é o que eu implementei, desculpe". Isso é um problema de programação?
keppla
1
Esta questão é muito semelhante.
Aug2
Você precisa fazer um relatório com o cliente, descrever seus requisitos e, com base nisso, é necessário projetar, testar, implementar, refatorar, otimizar e manter o software. Você precisa de ambientes para testar, desenvolver, implantar, executar e medir o software. Neste sistema, um algoritmo individual é apenas um detalhe de implementação.
inf3rno
@Keppla (mais um) ope, é um problema de requisitos, a causa raiz de todos os problemas de software
MAWG diz Reintegrar Monica

Respostas:

29

Depende de como você define "Problema de programação".

Em projetos do mundo real, a resposta é definitivamente um NÃO claro. A maioria dos problemas nem sequer são técnicos, mas problemas de comunicação, requisitos pouco claros etc.

Então você tem assuntos inteiros de classes de problemas que requerem quase nenhum algoritmo. Por exemplo, as GUIs geralmente são fáceis de "programar", mas o problema real envolvido é ter um bom design (do ponto de vista da usabilidade, não apenas da aparência gráfica).

Existem alguns campos em que os problemas tendem a ser muito mais algorítmicos pela natureza desse campo. Por exemplo, a IA é um assunto primordial, onde os algoritmos estão no centro. Os gráficos podem ser intensivos em algoritmos, mas dependem do que exatamente se entende por "Programação de gráficos".

Em geral, se o problema que você está resolvendo programaticamente é adequado para uma representação matemática, você está inserindo a área algorítmica. Obviamente, este é apenas um indicador aproximado, pois você pode criar modelos matemáticos para praticamente tudo. Mas para a maioria das coisas você normalmente não consideraria fazê-lo.

Exemplo final: se o problema for criar uma GUI que permita a inserção de dados para objetos de negócios, você não pensaria muito em formulações matemáticas. Se, no entanto, o problema for criar uma GUI que esteja mudando dinamicamente e realoque elementos com base em algum valor de importância, é muito mais provável que você acabe com um modelo matemático e uma implementação algorítmica.

Frank
fonte
2
Aparentemente, isso também depende de como você define "Algoritmo". Eu diria que pouquíssimos problemas exigem novos algoritmos, mas como um programa de computador tem apenas duas partes - algoritmos e estruturas de dados - todos os problemas exigem alguns algoritmos, mesmo que esses algoritmos sejam triviais. Um algoritmo não é um modelo matemático, é uma sequência de instruções.
philosodad
Isso é verdade em seu sentido mais estrito, mas eu, por exemplo, não aceito i++como nosso novo overlord .. erm .. algoritmo.
Frank
Mas e se não soubéssemos de adição. Então a introdução da adição seria uma grande inovação em nossos estudos de algoritmos! E assim por diante até encontrarmos algoritmos cada vez mais complexos.
CMCDragonkai
8

O que você quer dizer com problema de programação?

De acordo com a Wikipedia:

A programação de computadores (geralmente abreviada para programação ou codificação) é o processo de projetar, escrever, testar, depurar e manter o código fonte dos programas de computador.

o que significa que a programação em geral é inerentemente maior do que traduzir algoritmos por meio de código.

Para dar um exemplo, um problema de programação que tenho agora é que tenho que lidar com um código-fonte de espaguete herdado adicionando testes de unidade e refatorando-o . Também envolve adicionar comentários nos lugares certos, normalizar a capitalização de nomes, etc. Não tem nada ou pouco a ver com algoritmos.

Da mesma forma, muitas tarefas do desenvolvedor não estão relacionadas a algoritmos. Exemplo: internacionalização. Da mesma maneira, muitos aplicativos (CRUD, por exemplo) não usam muito algoritmos em seu código-fonte (sem falar no código subjacente da estrutura).

Agora, se você estiver assumindo que em "problema de programação", "programação" é sinônimo de tradução de algoritmos por meio de código, sim, logicamente qualquer problema seria um problema de algoritmo: A × n = B × nse A = B.

Arseni Mourzenko
fonte
Há uma diferença entre uma tarefa e um problema . Seu problema não é adicionar testes de unidade ou manter o código herdado, é a solução para o problema que reside na base de código, não o comportamento do programa em si que o código representa por algoritmos.
Zxcdw 22/08/12
Sua tarefa, conforme descrito, não altera o comportamento do programa. Presumivelmente, é um trabalho preparatório para algumas outras alterações, que podem ou não envolver algoritmos. Eu não acho que alguém em qualquer lugar seja pago apenas para refatorar o código ativo o dia inteiro.
MarkJ
6

Eu acho que a resposta é enfaticamente não . Algoritmos são apenas blocos de construção em um conjunto de habilidades muito maior.

Eu me formei em CS, especializado em AI

Lá, o problema fundamental, pelo menos na minha opinião, era encontrar boas representações para obter informações. Essas representações devem tentar corresponder às estruturas de conhecimento que estão na cabeça das pessoas e facilitar os tipos de manipulações e alterações que são feitas sobre elas.

Em termos de programação diária, isso significa que o problema básico é identificar a linguagem específica de domínio (DSL) correta para a situação em questão. Existem muitas maneiras de criar DSLs. A programação comum, na qual classes, variáveis ​​e métodos são definidos, de fato, cria uma DSL, pois permite que você diga coisas (mapeie suas estruturas mentais para codificar) que você não poderia dizer sem elas.

Os algoritmos também são importantes, mas são apenas parte da história.

Mike Dunlavey
fonte
5

Suponho que você possa dizer que todos os programas de computador são algoritmos, porque você está prescrevendo uma sequência de instruções para alcançar o resultado desejado. No entanto, alguns dos problemas mais difíceis não estão na comunicação de um programa para um computador, mas na comunicação de um programa para humanos que estarão testando e modificando o software.

Em outras palavras, os computadores não se importam se o seu código é completamente incompreensível para os seres humanos. Eles vão funcionar muito bem de qualquer maneira. O desafio é tornar o código claro o suficiente para que todos os bugs se destacem como um dedo dolorido.

Curiosamente, as coisas técnicas que aprendi na faculdade sobre algoritmos há muito são ofuscadas pelo que aprendi sozinho desde então. Neste ponto, se eu quisesse obter um terceiro diploma universitário para me ajudar no meu trabalho, seria na composição em inglês.

Karl Bielefeldt
fonte
2

A maioria dos problemas de programação são na verdade problemas de administração do sistema.

Essa é uma resposta irreverente, mas descobri que isso é verdade com mais frequência do que se poderia esperar. Não sei quantas vezes encontrei falhas porque o DNS foi configurado incorretamente na máquina de teste, ainda está sendo executado um processo obsoleto que está sobrecarregando a CPU / memória / portas, o programa está sendo executado com o ID do usuário errado e, portanto, está errado. permissões, o disco foi particionado incorretamente e, assim, o espaço acabou, a versão errada do arquivo de configuração foi instalada etc.

Acertar os algoritmos geralmente é apenas uma pequena parte do problema. O resto do problema é colocar o programa para trabalhar, resolvendo problemas reais no mundo real.

Stuart Marks
fonte
"Ajustar os algoritmos normalmente é apenas uma pequena parte do problema" Os problemas do kaggle.com NÃO se encaixam nessa descrição.
Gandalf
Concordo, apenas os coloquei na categoria "encanamento". Trabalhar com serviços de outros programadores, API e, às vezes, estruturas é apenas conectar as coisas como alguém pensou que elas deveriam funcionar.
JeffO
2

Eu pensaria que sim, todos os problemas de programação são solucionáveis ​​pensando de maneira algorítmica. Afinal, um algoritmo é apenas um conjunto de instruções que informa ao computador o que fazer.

Tomando alguns dos exemplos acima

Por exemplo, as GUIs geralmente são fáceis de "programar", mas o problema real envolvido é ter um bom design (do ponto de vista da usabilidade, não apenas da aparência gráfica).

Em termos de programação e até design, conhecerá padrões / regras que levam a designs de GUI eficazes, fáceis de usar e eficientes. Essas regras devem ser reduzidas a um algoritmo que, se seguido, deve ajudar a produzir uma GUI amigável. De fato, as etapas reais de colocar os controles na GUI também podem ser reduzidas a um algoritmo

Para dar um exemplo, um problema de programação que tenho agora é que tenho que lidar com um código-fonte de espaguete herdado adicionando testes de unidade e refatorando-o. Também envolve adicionar comentários nos lugares certos, normalizar a capitalização de nomes, etc. Não tem nada ou pouco a ver com algoritmos.

Mas a maneira pela qual você aborda a adição de testes de unidade pode ser descrita por um algoritmo como

  1. Identifique o novo teste de unidade
  2. Teste de unidade de gravação
  3. Aplicar algoritmo de normalização de maiúsculas
  4. Algoritmo Apply Comments

Exemplo: internacionalização Este é um exemplo perfeito de uma solução de algoritmo. Como simples, você está pesquisando uma palavra conhecida em um dicionário e substituindo-a pelo formulário de idioma diferente. (É claro que a vida real envolve frases e contexto e o algoritmo pode envolver etapas para verificar com falantes nativos, mas o básico é verdadeiro)

O problema com a maioria das respostas Sim é que as pessoas estão pensando em algoritmos em termos de classificação QuickSort, Bubble, em vez de um conjunto de instruções que reduz uma descrição vaga e detalhada de um problema a um conjunto de regras / lógicas claramente definidas.

armitage
fonte