Szukam trwałej struktury danych podobnej do tablicy (ale niezmiennej), umożliwiającej szybkie indeksowanie, dołączanie, dodawanie i iterację (dobra lokalizacja).
Clojure zapewnia trwały Vector, ale służy tylko do szybkiego dołączania. Vector Scali ma efektywnie dołączanie i dodawanie w czasie stałym, ale nie mogę zrozumieć, jak jest zaimplementowany, ponieważ jest oparty na tej samej strukturze danych (trie wektorów mapowanych bitowo) co wektor Clojure i, jak rozumiem, trie wektorów mapowanych bitów nie mogę mieć szybkiego przygotowania bez niektórych sztuczek.
Nie jestem zainteresowany gotową implementacją, ale opisem, w jaki sposób samodzielnie wdrożyć taką strukturę danych.
Opisałem jedną implementację takiej struktury danych w moim artykule na temat przyrostowego dopasowywania wyrażeń regularnych - patrz http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation oraz tekst poniżej i powyżej tej sekcji .
Jest to odmiana drzewa o stałej wysokości (jak B-drzewa lub 2-3 drzewa). Zasadniczo jest to drzewo (2,3), którego liście to tablice (N, 2N-1), aby uniknąć narzutu na element. (Macierz A (N, 2N-1) to macierz, której długości mieszczą się w zakresie N..2N-1.) Większy N daje mniejsze obciążenie, ale liniowo zwiększa złożoność podziału i konkatenacji. Operacje takie jak indeksowanie, dzielenie i konkatenacja są bardzo podobne do sposobu, w jaki działają na 2-3 drzewach, generalizując do (N, 2N-1) na poziomie liścia.
źródło