Estou procurando uma estrutura de dados persistente semelhante à matriz (mas imutável), permitindo operações rápidas de indexação, acréscimo, pré-acréscimo e iteração (boa localidade).
O Clojure fornece Vector persistente, mas é apenas para anexação rápida. O vetor de Scala efetivamente anexa e pré-anexa em tempo constante, mas não consigo entender como ela é implementada, pois é baseada na mesma estrutura de dados (vetor trie com mapeamento de bits) que o vetor Clojure e, como eu entendo, vetor trie com mapeamento em bit não pode ter um prefixo rápido sem alguns truques.
Não estou interessado em estar pronto para usar a implementação, mas em uma descrição de como implementar essa estrutura de dados.
Descrevi uma implementação dessa estrutura de dados em meu artigo sobre correspondência incremental de expressões regulares - consulte http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation e o texto abaixo e acima dessa seção .
É uma variedade de árvores de altura constante (como árvores B ou 2-3 árvores). Basicamente, é uma (2,3) árvore, cujas folhas são (N, 2N-1) matrizes, para evitar sobrecarga por elemento. (Uma matriz (N, 2N-1) é uma matriz cujos comprimentos estão no intervalo N..2N-1.) N maior fornece uma sobrecarga menor, mas aumenta linearmente a complexidade da divisão e concatenação. Operações como indexação, divisão e concatenação são muito semelhantes à maneira como trabalham em 2-3 árvores, generalizando para (N, 2N-1) no nível da folha.
fonte