Usos práticos de diferentes estruturas de dados [fechado]


102

Fala-se muito sobre estruturas de dados, mas não consigo encontrar uma lista simples de estruturas de dados e seu uso prático por aí. Estou tentando estudar para uma entrevista e acho que isso me ajudaria, junto com muitos outros. Estou procurando algo assim:

Estrutura de dados - Exemplo / usado para

Tabela de hash - pesquisa rápida de dados ... então dê um exemplo

Array - ...

Árvore binária - ...

Se houver um recurso como este em algum lugar, por favor me avise.

Obrigado!

EDIT: Quero dizer que a Wikipedia é boa e tudo, mas na maioria das páginas eles não listam usos práticos. Estou procurando algo mais do que isso.

Respostas:


96

Encontrou a lista em uma pergunta semelhante, anteriormente no StackOverflow:

Tabela de hash - usada para pesquisa rápida de dados - tabela de símbolos para compiladores, indexação de banco de dados, caches, representação de dados exclusiva.

Trie - dicionário, como o encontrado em um telefone móvel, para preenchimento automático e verificação ortográfica.

Árvore de sufixo - pesquisas rápidas de texto completo usadas na maioria dos processadores de texto.

Pilha - operação desfazer \ refazer em processadores de texto, avaliação de expressão e análise sintática, muitas máquinas virtuais como JVM são orientadas a pilha.

Filas - Pesquisa de transporte e operações onde várias entidades são armazenadas e mantidas para serem processadas posteriormente, ou seja, a fila desempenha a função de um buffer.

Filas prioritárias - agendamento de processos no kernel

Árvores - analisadores, sistema de arquivos

Árvore Radix - tabela de roteamento IP

Árvore BSP - computação gráfica 3D

Gráficos - Conexões / relações em sites de redes sociais, Roteamento, redes de comunicação, organização de dados etc.

Heap - Alocação de memória dinâmica em lisp

Esta é a resposta postada originalmente por RV Pradeep

Alguns outros links menos úteis:

Os aplicativos são listados apenas para algumas estruturas de dados

Não focado na aplicação, por bom resumo e relevante


1
seu primeiro link está quebrado
Dan Beaulieu

Obrigado, @DanBeaulieu. Eu removi o link morto.
MXMLLN

1
Resumo muito bom. Provavelmente, a lista de usos nunca termina, mas entendemos.
Nick L.

1
Desfazer / refazer seria realmente uma pilha? Se desfazer saísse do topo da pilha, você não seria capaz de refazer.
Tony L.

5
@TonyL. Eu sei que esta é uma pergunta mais antiga, mas acredito que 2 pilhas são usadas ou Desfazer / Refazer. Quando você desfaz uma ação, ela é retirada da pilha de ações e colocada na Pilha de Refazer. Se você refazer, você o retira da Pilha de Refazer e o coloca na pilha de ação. Posso ter a terminologia errada, mas deve haver exemplos por aí.
Rick Henderson

14

Estou no mesmo barco que você. Preciso estudar para entrevistas de tecnologia, mas memorizar uma lista não ajuda muito. Se você tiver 3-4 horas de sobra e quiser fazer um mergulho mais profundo, recomendo verificar

mycodeschool
Já procurei no Coursera e em outros recursos, como blogs e livros didáticos, mas acho que não são abrangentes o suficiente ou estão no outro extremo do espectro, muito densos com terminologias de ciência da computação de pré-requisito.

O cara no vídeo tem um monte de palestras sobre estruturas de dados. Não se importe com os desenhos bobos ou com o leve sotaque. Você precisa entender não apenas qual estrutura de dados selecionar, mas alguns outros pontos a serem considerados quando as pessoas pensam sobre estruturas de dados:

  • prós e contras das estruturas de dados comuns
  • porque cada estrutura de dados existe
  • como realmente funciona na memória
  • perguntas / exercícios específicos e decidir qual estrutura usar para obter a máxima eficiência
  • explicação lúcida do Big 0

Eu também postei notas no github se você estiver interessado.


7

De acordo com o meu entendimento, estrutura de dados são quaisquer dados residindo na memória de qualquer sistema eletrônico que podem ser gerenciados de forma eficiente. Muitas vezes é um jogo de memória ou acessibilidade mais rápida de dados. Em termos de memória, novamente, há compensações feitas com o gerenciamento de dados com base no custo para a empresa daquele produto final. Gerenciado com eficiência nos diz qual a melhor forma de acessar os dados com base no requisito principal do produto final. Esta é uma explicação de alto nível, mas as estruturas de dados são um assunto vasto. A maioria dos entrevistadores mergulha nas estruturas de dados que podem discutir nas entrevistas, dependendo do tempo de que dispõem, que são listas vinculadas e assuntos relacionados.

Agora, esses tipos de dados podem ser divididos em primitivos, abstratos e compostos, com base na maneira como são construídos e acessados ​​logicamente.

  • estruturas de dados primitivas são blocos de construção básicos para todas as estruturas de dados, elas têm uma memória contínua para elas: boolean, char, int, float, double, string.
  • estruturas de dados compostas são estruturas de dados compostas por mais de um tipo de dados primitivo. classe, estrutura, união, matriz / registro.
  • Tipos de dados abstratos são tipos de dados compostos que têm uma maneira de acessá-los de forma eficiente, o que é chamado de algoritmo. Dependendo da forma como os dados são acessados, as estruturas de dados são divididas em tipos de dados lineares e não lineares. Listas vinculadas, pilhas, filas, etc. são tipos de dados lineares. heaps, árvores binárias e tabelas hash etc são tipos de dados não lineares.

Espero que isso ajude você a mergulhar.


6

O excelente livro " Algorithm Design Manual" de Skienna contém um enorme repositório de algoritmos e estrutura de dados.

Para toneladas de problemas, estruturas de dados e algoritmo são descritos, comparados e discutem o uso prático. O autor também fornece referências para implementações e os artigos de pesquisa originais.

É ótimo tê-lo em mãos se você pesquisar a melhor estrutura de dados para o seu problema resolver. Também é muito útil para a preparação da entrevista.

Outro grande recurso é o Dicionário NIST de estruturas e algoritmos de dados .


4

Poucos mais Aplicação prática de estruturas de dados

Árvores Red-Black (Usado quando há Inserção / Exclusão frequente e poucas pesquisas) - K-mean Clustering usando árvore vermelha preta, Bancos de dados, Banco de dados simplista, pesquisando palavras em dicionários, pesquisando na web

Árvores AVL (mais pesquisa e menos inserção / exclusão) - Análise de dados e mineração de dados e as aplicações que envolvem mais pesquisas

Min Heap - Algoritmos de clustering


3

Qualquer classificação de várias estruturas de dados será pelo menos parcialmente ligada ao contexto do problema. Isso ajudaria a aprender como analisar o desempenho de algoritmos no tempo e no espaço. Normalmente, "notação grande O" é usada, por exemplo, a pesquisa binária é no tempo O (log n), o que significa que o tempo para pesquisar um elemento é o log (na base 2, implicitamente) do número de elementos. Intuitivamente, uma vez que cada etapa descarta metade dos dados restantes como irrelevantes, dobrar o número de elementos aumentará o tempo em 1 etapa. (A pesquisa binária tem uma escala bastante boa.) O desempenho do espaço diz respeito a como a quantidade de memória aumenta para conjuntos de dados maiores. Além disso, observe que a notação big-O ignora fatores constantes - para conjuntos de dados menores, um algoritmo O (n ^ 2) pode ainda ser mais rápido do que um algoritmo O (n * log n) que tem um fator constante mais alto.

Além de tempo e espaço, outras características incluem se uma estrutura de dados é classificada (árvores e skiplists são classificados, tabelas hash não), persistência (árvores binárias podem reutilizar ponteiros de versões mais antigas, enquanto as tabelas hash são modificadas no local), etc.

Embora você precise aprender o comportamento de várias estruturas de dados para poder compará-las, uma maneira de desenvolver uma noção de por que elas diferem em desempenho é estudar de perto algumas. Eu sugiro comparar listas unidas individualmente, árvores binárias de pesquisa e listas de omissão , todas relativamente simples, mas com características muito diferentes. Pense em quanto trabalho é necessário para encontrar um valor, adicionar um novo valor, encontrar todos os valores em ordem, etc.

Existem vários textos sobre análise de desempenho de algoritmos / estrutura de dados que as pessoas recomendam, mas o que realmente os fez fazer sentido para mim foi aprender OCaml. Lidar com estruturas de dados complexas é o ponto forte do ML, e seu comportamento é muito mais claro quando você pode evitar ponteiros e gerenciamento de memória como em C. (Aprender OCaml apenas para entender estruturas de dados é quase com certeza o caminho mais longo. :))

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.