Devo continuar investindo em estruturas de dados e algoritmos? [fechadas]


28

Atualmente, estou investindo pesadamente em estruturas de dados e algoritmos e tentando resolver alguns quebra-cabeças de programação.
Estou tentando codificar e resolver com Java e Clojure.

Estou perdendo meu tempo? devo investir mais em tecnologias e estruturas que já conheço para obter um conhecimento mais profundo (os detalhes) e poder codificá-los mais rapidamente?

Ao estudar estruturas de dados e algoritmos, vou me tornar um programador melhor ou esses assuntos são importantes apenas durante os anos de faculdade?


5
Com quais estruturas de dados e algoritmos você está trabalhando? Em quais quebra-cabeças de programação você os está usando?
Oosterwal

Estou trabalhando / ainda para trabalhar em tabelas de hash, mapas, pilhas, gráficos, árvores e os algoritmos que o acompanham (atravessar, hash, pesquisar, inserir, excluir e excluir alguns algoritmos). Os quebra-cabeças são das competições TopCoder e Google Code Jam.
Quíron

Respostas:


24

É inteiramente possível gastar a maior parte / toda a sua carreira fazendo um trabalho significativo e útil, com apenas um conhecimento mínimo de algoritmos e estruturas de dados.

O nível mínimo de conhecimento para algoritmos e estruturas de dados, para ter sucesso, exigirá que você:

  • esteja ciente da maioria deles (incluindo a leitura ocasional de novos quando eles forem publicados)
  • saber onde encontrar implementações boas, testadas e funcionais
  • ser capaz de comparar algoritmos e sua utilidade
  • ser capaz de copiar corretamente um de um exemplo de código aberto para o seu ambiente específico, com um pouco de ajustes

Não há * máximo * . Se você quiser, pode levar o seu estudo ao nível de doutorado e além. Sua utilidade está diretamente relacionada ao tipo de trabalho que você está interessado em ter e a qual tipo de trabalho você acha mais interessante e gratificante.

Dito isto, como uma diretriz aproximada (mas não absoluta), quanto mais baixo nível, mais uso de recursos e menos automatizado o idioma, a estrutura e o aplicativo em que você estiver trabalhando, maior será o nível de habilidade exigido. algoritmos e estruturas de dados. Por exemplo, implementar o algoritmo de Ukkonen em montagem provavelmente, mas não necessariamente, significará que você desejará uma compreensão em nível de mestrado do algoritmo e das estruturas de dados envolvidas.

Na sua situação específica, passando de um background de desenvolvimento Java para trabalhar no iOs, todas as outras coisas iguais, espere uma demanda um pouco maior no seu entendimento geral de algoritmos e estruturas de dados. Você poderá executar com eficiência em um dispositivo com menos recursos disponíveis. Além disso, espere adicionar duas novas categorias ao seu arsenal - principalmente, você precisará saber mais sobre gerenciamento de memória.


2
Concordo plenamente. Quase nunca preciso lidar com algoritmos diretamente, pois a grande maioria dos necessários já está incluída nas bibliotecas básicas. Mas eu estaria com problemas se não entendesse as características de desempenho o suficiente para escolher o algoritmo ou a estrutura apropriada para um caso de uso específico. OP, a menos que você queira trabalhar em algoritmos, poderá obter um retorno muito, muito , muito melhor do investimento pelo tempo gasto aprendendo outras bibliotecas, ferramentas e técnicas.
Quentin-starin

1
Ugh, escrever o algoritmo de Ukkonen em Python já é bastante difícil, posso até começar a imaginar fazê-lo em assembly.
rjzii

2
Isso se enquadra no ponto "comparar algoritmos", mas eu só queria elaborar que você deveria conhecer a relação entre complexidade de espaço e tempo. Muitos algoritmos que são comumente usados ​​em desktops devido à sua velocidade podem não ser viáveis ​​no iOS porque exigem grandes estruturas de dados.
Karl Bielefeldt

3
Discordo. O motivo simples é quando alguém gasta tempo aprendendo Algoritmos, Design ou Arquitetura, e não se trata apenas de quando / onde ele irá usá-lo. Isso apenas torna a pessoa mais inteligente e ele pode usar o aprendizado enquanto resolve outros problemas. Também incentiva a sensação de fazer as coisas de maneira ideal. Por exemplo. pode não haver um algoritmo feito à mão para tudo, mas como você conhece muitas coisas, pode vir com algo excepcional por conta própria.
23411 Geek

14

Nah. Se você está apenas começando, tente entender coisas importantes como a programação da interface do usuário e isso apenas o impede. Eventualmente, você precisa ir lá e aprender estruturas maiores ... como usar as estruturas de dados e algoritmos que OUTRAS pessoas escreveram. Quando você está começando, é bom manter os problemas de escopo limitado.

Algoritmos e estruturas de dados são basicamente a base de tudo, mesmo que você provavelmente nunca escreva um dos seus depois de passar do estágio iniciante. Conhecê-los, ou pelo menos conhecê-los, fará de você um desenvolvedor melhor no final. Você saberá quando e por que usar cada um, porque saberá como eles funcionam. Além disso, tornar seus algoritmos e estruturas de dados genéricos para que eles possam trabalhar com qualquer tipo ou tipo com a interface X é realmente algo que você usará para o resto de sua carreira.

Eu vejo muitas pessoas pulando para coisas como o Qt que acabam fazendo perguntas que mostram zero conhecimento de C ++ (por exemplo). Eles estão tentando pular muitas etapas e, no final, levam mais tempo para aprender. Eu diria que você está no caminho certo.


Faço programação Java profissionalmente (sendo empregada, quero dizer) desde 2007. Agora vou (pelo menos espero) fazer algum desenvolvimento para iOS.
Quíron

9

Você não está perdendo seu tempo.

Se, no decorrer do seu trabalho, você precisar usar uma ferramenta ou estrutura que não usou anteriormente, aprenderá e usará.

No entanto, se você precisar usar uma estrutura de dados ou algoritmo que você não usou anteriormente, é provável que você nem saiba que ele existe e resolverá seu problema usando alguma técnica horrivelmente subótima que exige muito mais esforço e escala terrivelmente.

O que estou tentando dizer é que esse é o tipo de coisa que você não aprenderá apenas fazendo, você precisa aprender aprendendo , seja em uma situação acadêmica ou através de investimento pessoal, como você fazendo agora.


6

Na prática, esteja ciente de quais são as estruturas de dados disponíveis, quais são suas características de complexidade, onde obter boas implementações delas e onde você mantém sua cópia da Introdução aos Algoritmos para consultar os detalhes posteriormente.


1

Se é isso que faz você feliz, então você definitivamente deve ficar com ela. Se você está preocupado por não estar aplicando teoria suficiente, considere um projeto muito teórico. Crie uma pequena linguagem de programação, como Potion , do zero. Uma implementação completa usará tabelas Hash, gráficos, árvores e uma enorme variedade de algoritmos. Se parecer interessante, você pode se aprofundar na otimização, geração de código nativo ou extensibilidade do usuário.

Você se tornará um programador melhor quando permanecer interessado e focado, não quando trabalhar em projetos que parecem práticos, mas um pouco chatos.

Abaixo da toca do coelho, Dorothy!


1

Passei muito tempo pesquisando em C / C ++ com o OpenGL. Conheço bem as linguagens e a API ... e me tornei um desenvolvedor e programador razoável por causa dessa experiência. Dito isto, o conhecimento algorítmico real necessário para resolver vários problemas encontrados, que eu apenas consegui entender.

Falando da experiência pessoal, focar na criação de aplicativos será um desperdício de tempo, se você não conhecer a teoria por trás dos domínios problemáticos que pertencem ao que você está tentando construir.

Para muitos tipos diferentes de software, esses domínios se originam dos fundamentos que você aprende ao estudar algoritmos, além de sua própria teoria específica de nicho (por exemplo, álgebra linear em computação gráfica, teoria dos números / informações em criptografia, etc.).

Você não precisa necessariamente se tornar um bruxo computacional por trás de tudo, mas fazer o que estava fazendo no momento deste post é um caminho muito, muito necessário para seguir pelo menos uma vez na jornada de programação - independentemente de não são autodidatas.


0

Acho que se você não os conhece bem, não encontrará motivos para usá-los. Parece que encontro usos para eles o tempo todo. Mas tenho que admitir que, com as melhorias nos genéricos nas últimas meia dúzia de anos, a necessidade de criar a sua própria ocorre com cada vez menos frequência. Isso ainda não remove os benefícios de saber como e quando usá-los e eles podem simplificar bastante o código complicado.

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.