Estoy buscando una estructura de datos persistente similar a la matriz (pero inmutable), que permita operaciones rápidas de indexación, anexión, anteposición e iteración (buena localidad).
Clojure proporciona Vector persistente, pero es solo para un apéndice rápido. Scala's Vector tiene efectivamente anexos y antepuestos de tiempo constante, pero no puedo entender cómo se implementa, ya que se basa en la misma estructura de datos (vector de mapa de bits) que el vector Clojure y, según tengo entendido, vector de mapa de bits no puede tener un antecedente rápido sin algunos trucos.
No estoy interesado en la implementación lista para usar, sino en una descripción de cómo implementar esa estructura de datos yo mismo.
Describí una implementación de dicha estructura de datos en mi artículo sobre coincidencia incremental de expresiones regulares: consulte http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation y el texto debajo y arriba de esa sección .
Es una variedad de un árbol de altura constante (como B-trees o 2-3 árboles). Básicamente es un árbol (2,3), cuyas hojas son matrices (N, 2N-1), para evitar la sobrecarga por elemento. (Una matriz (N, 2N-1) es una matriz cuyas longitudes están en el rango N..2N-1.) Una N más grande proporciona una sobrecarga menor pero aumenta linealmente la complejidad de la división y la concatenación. Operaciones como la indexación, división y concatenación son muy similares a la forma en que funcionan en 2-3 árboles, generalizándose a (N, 2N-1) a nivel de la hoja.
fuente