Qual é a estrutura de dados mais complicada que você usou em uma situação prática? [fechadas]

17

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.

Fanatic23
fonte
Escrito por outros, ou por nós mesmos?
Minha intenção original era o que se desenvolvia, mas acho que acrescenta uma dimensão interessante à pergunta. Pergunta original editada.
Fanatic23
Tornar complexo não significa que é sofisticado. Mais simples = melhor sempre.
tp1 23/05
Os mais complexos estavam sempre disponíveis na STL. A complexidade geralmente vem de estruturas de dados aninhadas, não de seu tipo. Estrutura simples = boa, a menos que o criador de perfil se queixe.
Codes
-1 para avaliação de valor desnecessária. Eu poderia dizer o mesmo: hoje em dia, se você implementar as estruturas de dados, estará sendo burro e teimoso. Não seja o próximo garoto esperto que pensa que pode implementar uma estrutura de dados da maneira errada.
Pieter B

Respostas:

7

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.

aufather
fonte
7

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 :)

卢 声 远 Shengyuan Lu
fonte
4

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.

bit-twiddler
fonte
5
Meu conselho para quem faz um voto "baixo" é que se deve adicionar um comentário declarando por que alguém votou "baixo". Eu posso lidar com alguém que tem uma opinião diferente. No entanto, o que não consigo lidar é covardia.
bits twiddler
2
@ bit-twiddler Eu aprendi o Teorema de De Morgan no meu curso de Filosofia. Agora estou fazendo CS, isso não foi mencionado. Honestamente, porém, vejo esse tipo de coisa como uma abreviação que melhor vem com a experiência. Você realmente precisa se lembrar das regras (e pelo nome!) Que você emprega ao fatorar uma equação? Eu não sei sobre você, mas resolvo isso com base no que está na minha frente e não de maneira mecânica. O mesmo vale para modificar expressões lógicas.
Rupert Madden-Abbott
2
@Rupert: O Teorema de De Morgan é geralmente abordado em matemática discreta e organização de computadores (os quais são necessários cursos de graduação nos EUA). Concentrei-me em arquitetura de computadores / software de sistemas na graduação. O teorema de De Morgan é muito usado no design da lógica digital. Existem áreas no desenvolvimento de software de baixo nível em que o conhecimento do Teorema de De Morgan se torna crítico. Por exemplo, existem computadores com conjunto mínimo de instruções que não contêm um conjunto completo de instruções booleanas; portanto, é preciso conseguir derivar uma operação booleana de outra.
precisa saber é o seguinte
1
(cont.) Aqui está um teste que a maioria dos graduados em ciência da computação / engenharia da computação / engenharia elétrica (concentração em engenharia da computação) falha completamente ou leva muito tempo para responder. Dada apenas a operação NAND (negativa), derive as seguintes operações booleanas: NOT, AND, OR, NOR, XOR e XNOR. Conhecer o Teorema de De Morgan facilita a derivação dessas seis operações booleanas. O Teorema de De Morgan é facilmente o teorema mais importante no design da lógica digital.
precisa saber é o seguinte
1
..... embora seja justo, em um setor em que MUITO trabalho envolve a criação de aplicativos RoR para empresas de pequeno porte, provavelmente há cerca de uma vez em 1000000000 em que você precisaria OUVIR conceito de portas lógicas e álgebra booleana, em vez de apenas conhecer o significado das palavras em inglês "ou" e "e" e ". não dizer que essas coisas não são relevantes para saber se você está fazendo um trabalho de CS ou algoritmos complexos ou otimizações ou programação de baixo nível, mas para a maioria das pessoas que trabalha como programador, é uma espécie de trivialidade inútil.
Sara
2

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.

Peter Taylor
fonte
2

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.

dbasnett
fonte
1

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
em C ++, é isso 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!
Matthieu M.
@Mathieu std :: map e você provavelmente obterá uma árvore rb.
aufather
1

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

Roger escasso
fonte
remove os óculos "Querido Deus".
Len Joseph
1

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.

ProdigySim
fonte
1
Isso soa como um exagero para um solucionador de Sudoku, pois um algoritmo de retrocesso de força bruta resolve o quebra-cabeça mais rápido do que você pode inserir os dados.
kevin cline
3
@ Kevin, links de dança é um algoritmo de retrocesso de força bruta - mas com uma heurística plausível.
Peter Taylor
Você precisa de uma heurística para fazer coisas como enumerar o número total de soluções e afirmar que um Sudoku tem apenas uma solução única.
ProdigySim 27/02
1

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.

TMN
fonte
0

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
Minha intenção não era forçar uma estrutura de dados exótica. Mas é uma situação triste quando você precisa de algo pronto e precisa lidar com o que já está disponível, apenas porque a política corporativa exige.
Fanatic23
0

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.

Old Pro
fonte