O germe dessa pergunta surgiu de uma discussão que eu estava tendo com alguns colegas desenvolvedores da indústria.
Acontece que em muitos lugares os gerentes de projeto são cautelosos com estruturas de dados complexas e geralmente insistem no que quer que exista imediatamente da biblioteca / pacotes padrão. A idéia geral parece ser como usar uma combinação do que já está disponível, a menos que o desempenho seja seriamente prejudicado. Isso ajuda a manter a base de código simples, o que para os não diplomáticos significaria "temos alto desgaste, e os mais novos que contratamos podem não ser tão bons".
Portanto, nenhum filtro de flores, listas de ignorados ou árvores de espalhamento para os viciados em CS. Então, aqui está a pergunta (novamente): Qual a estrutura de dados mais complicada que você criou ou usou no escritório?
Ajuda a ter uma noção de quão bom / sofisticado é o software do mundo real.
fonte
Respostas:
Utilizaram as listas de ignorados para pesquisa. Onde trabalho, há uma implementação padrão e todos são incentivados a usá-la. Utilizou patricia tenta armazenar e recuperar endereços IP de maneira eficiente. Mais uma vez a implementação já estava presente.
fonte
Eu sou desenvolvedor Java. O Java Collection Framework pode resolver meus problemas de estrutura de dados de 90%, outros 10% precisam de esforço. Eu acho que se você realmente entende a sofisticada lib padrão escrita por especialistas, verá que eles ajudam na maioria dos casos.
Estruturas de dados complexas são difíceis de manter no mundo real. Para evitar bagunçar o código, dividirei um problema em outros menores. Cada pequeno problema pode ser resolvido pelo Java Collection Framework . Talvez a solução não seja a mais inteligente (ela precisa de mais memória e mais lenta), mas funciona e é fácil de manter. É uma troca.
Se eu precisar escrever uma estrutura de dados complexa, pegarei o livro :)
fonte
A estrutura de dados mais complicada que usei no trabalho foi uma tentativa. No entanto, isso foi há vinte anos.
O problema com o desenvolvimento de software industrial é que a maioria dos programadores industriais não é formada em ciências da computação (CompSci); portanto, as técnicas que o graduado médio do CompSci considera óbvias são consideradas muito difíceis de serem mantidas pelos programadores de pão com manteiga.
A falta de conhecimento geral do CompSci no setor é um problema sério. Por exemplo, perdi a conta do número de desenvolvedores de software que conheci que não entendem expressões como! (A! = 5 && b! = 3) e a == 5 || b == 3 são logicamente equivalentes. Qualquer pessoa que saiba aplicar o Teorema de DeMorgan pode reconhecer que essas expressões são logicamente equivalentes. A maioria dos graduados não-CompSci nunca ouviu falar do Teorema de DeMorgan. Se alguém pesquisar qualquer base de código substancial, encontrará muitas ocorrências de expressões que negam subexpressões lógicas negativas. A legibilidade do código que contém subexpressões lógicas negativas negadas quase sempre é aprimorada, transformando essas expressões em sua forma não negada.
fonte
Certa vez, escrevi uma fila de calendário (fila de prioridade O (1)) para uma simulação baseada em evento na qual a criação de perfil mostrava que o heap existente era um gargalo.
Também liberei um produto que continha uma máquina de estados finitos com cerca de 80000 estados - o código para gerá-lo era um pouco complicado, para dizer o mínimo.
fonte
Há muito, muito tempo atrás, em uma galáxia ... Trabalhou em uma equipe que usava os "buffers de amigos" de Knuth em um RTOS em assembler.
Além disso, o Jogo da Vida de Conway, com 256 gerações, para um mundo de 1024 x 1024.
fonte
Na verdade, não usei nada muito especial, do zero seria uma lista duplamente vinculada .
Não é muito emocionante, usei outras estruturas. Mas sua pergunta foi feita do zero.
fonte
std::list
, e realmente não há nada complicado: / acho a árvore vermelho-preta / a árvore AVL muito mais complicada, com todas essas condições de reequilíbrio!Uma árvore de hashtables contendo listas genéricas de dados financeiros - nem pergunte. Às vezes eu queria ser um cowboy. Ah, a vida simples sob as estrelas ...
fonte
Eu tive que escrever uma estrutura circular de lista dupla com links do zero para o algoritmo Dancing Links para um solucionador de Sudoku. Parecia projetar um cubo de Rubik. Toda a estrutura era basicamente uma lista de listas - com cada nó apontando para quatro outros.
fonte
Uma vez eu usei uma árvore de comprimento de caminho ponderado para um cache especializado. Foi divertido. Também escrevi minhas próprias rotinas de gerenciamento de heap para uma
malloc()
substituição, mas muitas pessoas fizeram isso.fonte
Pensando bem, a estrutura de dados mais "complicada" que fiz do zero é modelar uma rede de elementos que se baseava em listas duplamente vinculadas. Mas isso foi anos atrás, quando eu fazia programação no nível do sistema.
Atualmente, dificilmente crio estruturas de dados sofisticadas. A maior parte disso acontece no banco de dados em que você decide o que colocar em uma tabela, talvez algum valor pré-calculado, talvez o ID de algum registro relacionado para recuperação rápida, para evitar consultas desnecessárias.
Pessoalmente, acho que a tarefa em questão define os meios. Por que se esforçar para usar alguma estrutura de dados exótica, se não houver utilidade para isso? E, se posso dizer, na maior parte da programação aplicada prática, provavelmente não há necessidade de reinventar a roda.
fonte
Uma fila de prioridade conta? Isso aparece em quase todos os aplicativos em tempo real que eu escrevi. Tornou-se parte da biblioteca Java padrão apenas recentemente (Java 1.5).
Fora isso, não consigo pensar em nada complicado que realmente queria que não fosse capaz de sair de uma biblioteca. Eu não deixaria isso me parar, mas questionaria por que eu precisava de uma estrutura de dados muito exótica para as bibliotecas incluírem. Definitivamente, procuraria uma implementação de código aberto existente de um filtro trie ou bloom ou uma lista de pulos antes de tentar escrever um.
Em geral, concordo com seu gerente de que o custo de criar e manter uma estrutura de dados personalizada muito esotérica para que não exista uma versão de biblioteca provavelmente superará qualquer benefício de desempenho derivado dela. Quero que você mostre, por meio de criação de perfil, que as estruturas simples da biblioteca estão causando uma penalidade de desempenho significativa antes que eu permita que você vá em frente e as otimize com algo sofisticado. Como regra geral, é mais barato comprar ciclos de processador do que ciclos de engenharia.
fonte