View on GitHub

estruturas-de-dados

Trabalho feito durante a disciplina Algoritmos e Estruturas de Dados (mestrado UFJF)

AED

Esta aplicação – desenvolvida na disciplina Algoritmos e Estruturas de Dados do Mestrado (PPGCC - UFJF) – conta com uma estrutura de dados do tipo árvore Patricia (Patricia tree ou Radix tree) para realizar operações no banco de dados USDA (United States Department of Agriculture).

Tech Stack

Desenvolvimento

Tries, também conhecidas como árvores digitais ou árvores de prefixos, são tipos de árvores de busca utilizadas para implementar tabelas de símbolos cujas chaves são strings[1].

Em uma trie, por ser uma árvore n-ária, uma chave é recursivamente comparada a um nó da árvore até chegar ao nó procurado ou não o encontrar.

Árvore Patricia

A árvore Patricia (Practical Algorithm to Retrieve Information Coded in Alphanumeric) deriva da estrutura trie, porém diferencia-se desta no aspecto de que os nós que possuem apenas um filho são agrupados – o que reduz o gasto de memória.

Faz-se a separação entre nós pais e nós folhas, onde os nós pais são representados por instâncias da classe Node (figura abaixo) cujos atributos data e key são nulos, enquanto que nas folhas, os atributos nulos são o index e o character.

Image of node
Representação da classe Node

Inserção

É feita comparando-se alfanumericamente as Strings correspondentes às chaves primárias, que são armazenadas sempre como nós folhas.

O processo de inserção começa pela raiz e segue-se segundo descrito abaixo:

1. Caso a raiz seja um registro, compara-se a chave correspondente a este registro com a chave do registro que se queira inserir.
 
2. Cria-se um novo nó com a primeira posição na qual as Strings divergem e com o caractere presente nesta posição no nó raiz. Este novo nó passa a ser a raiz da árvore
  
3. Dentre os dois registros (o que se quer inserir e a raiz), o que possuir o caractere especificado pelo nó raiz, na posição especificada por este, passa a ser o filho esquerdo, enquanto que o outro passa a ser o filho direito.
  
4. Repete-se recursivamente, resultando em uma árvore binária onde todos os nós têm dois filhos.

A figura a seguir traz uma representação da árvore Patrícia.

Image of patricia
Representação da árvore Patricia com as chaves 0800, 0900, 1000 e 1100 armazenadas
Complexidade

Pela literatura, sabe-se que o número médio de comparações a serem feitas nessa árvore é log(N), onde N é o número de registros.

Porém como os registros se apresentam (no arquivo de dump) ordenados alfabeticamente, espera-se que as operações realizadas na árvore tendam ao pior caso, que seria da ordem N (como se pode ver expressado no gráfico abaixo).

Image of insercao
Inserção de todos os registros na tabela nut_data

Busca

Baseia-se na comparação da chave que se quer buscar com a raiz da árvore.

1. Considerando que a árvore possua mais que um registro, e, portanto, a raiz não é um registro, compara-se o caractere presente na raiz com com o caractere presente na chave na posição indicada pela raiz.
  
2. Caso a comparação seja positiva, segue-se para a esquerda e repete-se o procedimento.
  
3. Caso contrário, segue-se para a direita recursivamente.

4. A recursão pára ao se atingir o nó folha correspondete à chave procurada.
  
5. Caso não a ache, o retorno é nulo.

Remoção

A remoção de qualquer registro na árvore segue os seguintes passos:

1. Remove-se o registro
2. Remove-se o pai do registro
3. O irmão do registro passa a ser o pai

Os passos acima descritos valem para se remover qualquer nó folha, não importando se este é filho esquerdo ou direito ou a altura em que este se encontra na árvore.

Contadores

Joins

A cláusula JOIN combina campos de tabelas diferentes e os transforma em um novo conjunto.

Inner Join

Considere duas tabelas (assinaladas por 1 e 2), onde 1 é a tabela da esquerda e a 2 da direita.

Left Outer Join
Right Outer Join
Full Outer Join

Tabela Hash de Árvores Patrícia

Representação Gráfica

Image of insercao
Primeiro passo da inserção
Image of insercao
Segundo passo da inserção
Image of insercao
Terceiro passo da inserção
Image of insercao
Quarto passo da inserção

Busca

A figura abaixo apresenta uma comparação entre o tempo acumulado de busca por quantidade de registro considerando-se as duas estruturas.

Image of busca
Busca de todos os registros da tabela nut_data

Percebe-se que a curva referente à estrutura modificada (tabela hash de árvores) cresce mais lentamente que a apresentada pela árvore Patricia. Logo, há um decréscimo no tempo de busca.

Demais operações

As demais operações apresentaram comportamento semelhante à busca.

Referências

  1. https://www.ime.usp.br/pf/estruturas-de-dados/aulas/tries.html