On this page
Árvore Trie
๏ Tempo de busca proporcional ao tamanho das chaves ๏ Chaves com sufixos comuns compartilham caminho até a raiz ๏ Propícias para compactação no caso de letras do alfabeto ๏ boa opção para manter chaves grandes e de tamanho variável
Árvores de busca digitais (tries)
- posição de um nó depende da comparação entre os bits da chave.
- vantagem:
- impl mais simples pois não tem rotação
- desvantagem:
- se o conjunto é grande demais, precisamos de muitos bits para representá-la
uma arvore de busca de na qual o fator de sub-divisão, ou número máximo de filhos por nó, é igual ao número de símbolos do alfabeto
- tries são utilizados para acesso rápido aos buckets do hashing
- tempo de busca = tamanho das chaves
- ex: arvore com 26 subdivisões, por exemplo, sendo o numero de letras do alfabeto. Neste caso, só poderíamos inserir palavras que comecem com ASCII. As inserções, buscas e remoções se baseiam nos valores da chave inserida. A comparação é feita bit a bit da chave.
struct trie_node {
char key;
trie_node* child[2];
trie_node* father;
};Algoritmo de busca
Toda chave de uma árvore trie está em algum ponto do caminho dos bits
bool search(node *T, node *x) {
u = T.pai;
for (i=0; i < w - 1; i++){
c = (x.key >> (w - 1) - i) & 1; // compara o bit >> posição com 1
if (x.filho2 == NULL)
return false;
if (x.filho1 != x.key) {
x = x.child[c];
continue;
}
return true;
}
return false;
}Inserção
o nó deve ser inserido na primeira posição livre do caminho, na primeira folha onde c vale
bool insert(trie_node T, trie_node x) {
trie_node *u = T.pai;
for (i=0; i < w - 1; i++){
c = (x.key >> (w - 1) - i) & 1; // compara o bit >> posição com 1
if (x.filho2 == NULL)
break;
if (x.filho1 == x.key) {
return false;
}
u = x.child[c];
}
u.child[c] = x
x.p = u;
return true;
}Remoção
- quando removido em uma folha -> show de bola.
- se é removido com 1+ filhos.
- devemos trocar o nó em questão por uma folha.
- menor a esquerda ou maior a direita. ![[Drawing 2024-08-20 11.29.11.excalidraw]]

