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:
Dados armazenados
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
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
ArrayList
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> cars = new ArrayList<String>();
cars.add("Volvo");
cars.add("BMW");
cars.add("Ford");
System.out.println(cars);
}
}
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)

LinkedList
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList<String> cars = new LinkedList<String>();
cars.add("Volvo");
cars.add("BMW");
cars.add("Ford");
System.out.println(cars);
}
}
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

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
Recursão
Condição de parada
Chama a si mesma
Mudança de estado
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 =
Pior caso =
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
Á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 nós


Á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

Tabela Hash
Tabela de dispersão ou espalhamento
Endereçamento direto
Visa buscas eficientes, no pior caso
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
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
M - quantidade de entradas na tabela
Atualizado