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.