Um domínio de aplicativo em que as árvores binárias são melhores ou mais facilmente ajustáveis do que certas alternativas são as estruturas de dados persistentes (geralmente usadas em programação (puramente) funcional).
Uma estrutura de dados persistente é uma estrutura de dados que preserva a versão anterior de si mesma quando é modificada. (As estruturas de dados que não possuem essa propriedade são chamadas efêmeras .) Um benefício desse tipo de estrutura de dados é que ele permite o compartilhamento de partes da estrutura de dados - já que é garantido que a estrutura em si não muda, é seguro compartilhá-la. livremente entre outras estruturas de dados e até threads, sem se preocupar com a alteração. Outro benefício subjetivo é que essas estruturas de dados são mais fáceis de raciocinar.
Conceitualmente, você pode ter um tipo de dados imutável que é uma lista de números, por exemplo, . Em seguida, você pode introduzir um novo valor que adicione dois números à frente desta lista: . O que aconteceu com ? Nada - , ainda. Será que copiar esses três elementos e colocá-lo em sua própria lista, então? Idealmente, não - os valores na lista pertencem a , também:L1={3,4,5}L2=cons(1,cons(2,L1))={1,2,3,4,5}L1L1={3,4,5}L2L1L2
1,2,3,4,5L1L2
Existem estruturas de dados que são mais adequadas para implementar listas persistentes como a acima. Na mesma linha, as árvores binárias são mais adequadas para implementar estruturas de dados persistentes com certas propriedades do que outras estruturas ou estratégias de dados. E o compartilhamento estrutural mostrado no exemplo com as duas listas é transferido para árvores binárias - você pode imaginar que várias versões de uma árvore podem compartilhar subárvores que elas têm em comum.
Como eu disse, algumas estruturas de dados são mais fáceis de alterar para serem persistentes. Você menciona a tabela de hash, que geralmente é (se não necessariamente) uma estrutura de dados efêmera. Parece menos óbvio como é possível ajustar uma estratégia de implementação comum para que uma tabela de hash seja persistente. Considere que uma tabela de hash geralmente é implementada com uma matriz (especificamente, matrizes que são implementadas como uma parte contínua da memória). As matrizes são boas, pois fornecem acesso aleatório aos elementos, o que é uma propriedade importante, pois você deseja idealmente terO(1)acesso médio aos elementos na tabela de hash. Mas as matrizes não são tão boas quando se trata de criar estruturas de dados persistentes. O essencial é que, embora você possa criar um tipo de dados imutável de matriz, pela natureza das matrizes, corre o risco de fazer muitas cópias - se o tipo de lista acima mencionado tiver sido implementado com matrizes, você arriscará criar matriz totalmente nova com cinco elementos, em vez de compartilhar parte dela. E se você quiser modificar algo no meio da matriz? A resposta mais óbvia - e aparentemente inevitável - é copiar novamente .
Estruturas de dados persistentes não evitam a cópia, em geral. Mas certas estruturas de dados tornam a cópia menos frequente. Essa é uma propriedade desejável quando você exige que uma estrutura de dados seja imutável.