Estrutura de Dados

Links Úteis


Array ➡ pesquisa Lista ligada ➡ inserção/remoção sob demanda

  • Uma estrutura de dados é composta por dados/operações e algoritmos

  • Programa = estrutura de dados + algoritmos

Alocação Estática: Arrays; elementos constantes; aloca espaços de acordo com o número de elementos Alocação Dinâmica: Ponteiros; não há um máximo de dados de elementos; usa espaço suficiente para um dado elemento

Tipo Abstrato de Dados (ADT)

Contém duas partes:

  1. Dados armazenados

  2. Funções que manipulam os dados

  • Encapsulamento de dados e operações

  • Os dados podem ser armazenados em variáveis, arrays ou ponteiros

  • As funções implementam procedimentos através de subprogramas chamados operações, métodos ou serviços

INSERIR | REMOVER | CONSULTAR

Fila

  • Estrutura linear

  • FIFO - primeiro a entrar, primeiro a sair

  • Inserção no final

  • Remoção no início

código

Lista

  • Estrutura linear

  • Pode conter elementos como: tipo primitivo (strings, números); tipo abstrato

  • Inserções e exclusões em qualquer lugar

  • array para dados | tamanho | capacidade

código

ArrayList

Lista Ligada

  • Alocação dinâmica

  • Sequência de elementos chamados nós, onde cada nó está conectado ao próximo nó por meio de um ponteiro

  • dados - informação armazenada | próximo - ponteiro para o próximo nó

  • cabeça - primeiro nó | cauda - último nó (ponta para NULL)

código

LinkedList

Lista (Ligada) Circular

  • Alocação dinâmica

  • Feita por elementos que contêm ponteiros para o próximo elemento

  • Variação da lista ligada na qual o último elemento, em vez de apontar para null, aponta para o primeiro nó (loop)

  • Qualquer nó pode ser um ponto de partida

  • dados | próximo | cabeça | cauda | tamanho | capacidade

código

Pilha

  • LIFO - último a entrar, primeiro a sair

  • Estrutura linear

  • As inserções e exclusões ocorrem no topo da pilha

  • Usada em recursão

  • topo (-1) | array para dados | capacidade

código

Recursão

  • Condição de parada

  • Chama a si mesma

  • Mudança de estado

exemplos

Ordenação

Bubble Sort

  • Mais simples e mais lento algoritmo de ordenação

  • Passa muitas vezes pelo array e compara os elementos em pares

  • Se o primeiro for maior que o próximo número, troca os valores

  • Em cada passagem os números mais baixos "flutuam" para o topo, lembrando bolhas em um tanque de água

  • Melhor caso = O(n)O(n)

  • Pior caso = O(n2)O(n²)

código

Quick Sort

  • Dividir para conquistar ➡ divide um problema maior em um problema recursivo menor

  • A chave é o particionamento

  • Escolhe um pivô e divide o array em torno do pivô escolhido

  • Então, usando dois ponteiros, um para a esquerda e outro p/ a direita, compara os números ao pivô

  • Os números menores que o pivô vão p/ o lado esquerdo e os maiores p/ o lado direito

Merge Sort

  • Também divide para conquistar

  • Divide o array pela metade, então continua dividindo até que fique em grupos menores

  • Compara os elementos de um grupo com outro para organizá-los em ordem, então mescla os elementos em um grupo maior

  • E continua até que o array esteja totalmente unido e em ordem

código

Árvores

  • Estrutura composta por um nó raiz e abaixo dela suas subárvores

  • Cada nó tem um "nó pai"

  • Nós que não têm filhos são chamados de folhas

  • Valores menores que o nó pai vão a sua esquerda e maiores a direita

Grau: Número de filhos de um nó

  • Grau máximo de uma árvore identifica tipo de árvore (binária, ternária etc)

Altura (h): Número máximo de links/arestas no caminho mais longo entre um nó e o último nó folha

  • Altura de uma árvore = altura da raiz

Profundidade/Nível: Número de links/arestas necessários para ,alcançar um nó a partir do nó raiz; no nível k possui no máximo 2k2^k nós

Estrutura da Árvore Binária
Atributos da Árvore Binária

Árvore Binária: Abaixo de cada nó podem ter no máximo dois filhos Árvore Estritamente Binária: Árvore binária em que todo nó que não é folha tem subárvores esquerda e direita Árvore Binária Completa: Se uma árvore binária contém m nós no nível k, ela conterá 2m nós no nível k+1

Ordem de exibição
código

Tabela Hash

  • Tabela de dispersão ou espalhamento

  • Endereçamento direto

  • Visa buscas eficientes, no pior caso O(n)O(n)

  • Por meio de uma função de hash, transforma chaves em endereços de uma tabela

    • n chaves para serem armazenadas em uma tabela T de tamanho m, as posições da tabela estão no intervalo [0, m-1]

    • transforma cada chave x em um endereço-base h(x)

    • se h(x) estiver desocupado, armazena-se a chave x

Hash é uma estrutura de dados do tipo dicionário

não permite elementos repetidos não permite recuperar elementos sequencialmente (ordenado)

Funções de Hash Método da Divisão

  • simples e amplamente utilizado

  • chave x é dividida pela dimensão da tabela m e o resto da divisão é usado como endereço da chave

  • h(x)=xmodmh(x) = x \mod m

  • deve-se escolher bem o valor de m para bons resultados práticos; deixar espaços livres para casos de colisão, porém não a ponto de ser desperdício de memória

    • m deve ser um número primo não próximo a uma potência de 2

    • m não deve possuir divisores primos menores que 20

Colisão: Quando o cálculo da função de hash retorna endereços iguais para chaves distintas, sendo necessário um tratamento de colisão

Tratamento de Colisão - Técnicas Encadeamento: Informação é armazenada em estruturas encadeadas; tabela armazena ponteiros para uma lista ligada de elementos com mesmo endereço Endereçamento Aberto: Informação é armazenada na própria tabela hash, sem utilização de ponteiros; redução no consumo de memória

  • Rehash Linear: função hash para gerar sequências de tentativas

    • rh(k)=(k+i)modMrh(k) = (k+i) \mod M

    • M - quantidade de entradas na tabela

código

Atualizado