Lição
A teoria — Trie: a árvore de prefixos, passo a passo
Uma trie, ou árvore de prefixos, guarda um conjunto de palavras numa árvore com um nó por prefixo distinto. A raiz representa o prefixo vazio. Cada aresta corresponde a uma letra, pelo que o percurso da raiz até um nó forma o prefixo desse nó. Um nó fica assinalado quando o seu prefixo é uma palavra completa guardada na árvore. Palavras com o mesmo início partilham essa parte do percurso. Uma pesquisa segue as letras da palavra a partir da raiz; uma pesquisa por prefixo chega ao nó do prefixo e lista todos os nós assinalados abaixo dele. Edward Fredkin deu o nome à estrutura em 1960, a partir de retrieval, e pretendia que se pronunciasse como a palavra inglesa tree.
O que significa cada símbolo
W- o número de palavras na lista
L- o número total de letras dessas palavras
N- o número de nós, um por prefixo distinto, sem contar a raiz
- Pressupõe
- Usam-se letras minúsculas de a a z, 1 byte por letra e ponteiros de 64 bits. Nenhuma das estruturas inclui bytes de alinhamento nem espaço adicional usado pelo gestor de memória. A pesquisa binária conta cada par de letras que compara e para no primeiro par diferente; chegar ao fim de uma palavra não tem custo. A tabela de dispersão não tem colisões, o melhor caso possível. O nó de 18 bytes mantém os filhos por ordem alfabética, permitindo que a pesquisa pare assim que ultrapassa a letra procurada.
Problema resolvido na íntegra
-
Quanta partilha é necessária para a trie ocupar menos espaço? 4 passos
Clique em Palavras longas: 85 letras em 21 nós, com três quartos das letras partilhadas. Mesmo assim, a trie com nós de 18 bytes ocupa 396 bytes, contra os 157 da lista. Entre as listas cujas palavras têm todas k letras, a situação mais favorável à trie é aquela em que a lista contém todas as palavras possíveis. Com os custos em bytes usados nesta página, qual é o menor k para o qual essa trie ocupa menos espaço do que a lista simples?
Abrir este problema na ferramenta
-
Na página, temos 21 nós mais a raiz: 22 × 18 = 396 bytes. A lista guarda 85 letras e, por cada uma das 8 palavras, um byte de fim de palavra e um ponteiro de 8 bytes: 85 + 9 × 8 = 157.
-
Há 26k sequências possíveis de k letras. A lista que contém todas essas palavras ocupa, portanto, (k + 9) × 26k bytes.
-
A trie precisa de um nó por cada sequência de 1 a k letras: 26 + 26² + … + 26k, um pouco menos de 26/25 × 26k. Acrescentando a raiz e multiplicando por 18, a trie ocupa pouco menos de 18,72 × 26k bytes.
-
A lista passa a ocupar mais espaço quando k + 9 ultrapassa 18,72, o que acontece pela primeira vez com k = 10. Para k = 9, a trie ocupa mais 4,0% do que a lista; para k = 10, ocupa menos 1,5%.
Resposta
10 letras, com todas as 2610 palavras na lista, cerca de 1,4 × 1014 palavras. Com nós de 209 bytes, a mesma soma exige que k + 9 ultrapasse aproximadamente 217: palavras de 209 letras.
-
Percurso de aprendizagem
O que custa pouco numa estrutura de dados
Referências (3)
- The name, its origin in "retrieval", and Fredkin's intended pronunciation, quoted in the definition: Paul E. Black, "trie", in Dictionary of Algorithms and Data Structures [online], Paul E. Black, ed., NIST, entry modified 12 February 2019.
- The paper that named the structure: Edward Fredkin, "Trie memory," Communications of the ACM 3(9), September 1960, pp. 490–499.
- The earlier description of searching on letter-by-letter keys: René de la Briandais, "File searching using variable length keys," Papers presented at the Western Joint Computer Conference, San Francisco, 3–5 March 1959, pp. 295–298.