Я ищу постоянную структуру данных, похожую на массив (но неизменяемую), позволяющую выполнять быстрые операции индексации, добавления, добавления и итерации (хорошая локальность).
Clojure обеспечивает постоянный вектор, но это только для быстрого добавления. Вектор Scala эффективно добавляет и добавляет в постоянное время, но я не могу понять, как он реализован, поскольку он основан на той же структуре данных (векторное преобразование с растровым отображением), что и вектор Clojure, и, как я понимаю, на основе векторного преобразования с побитовым отображением не может быстро подготовиться без некоторых уловок.
Меня интересует не готовая к использованию реализация, а описание того, как реализовать такую структуру данных самостоятельно.
Я описал одну реализацию такой структуры данных в моей статье о добавочном сопоставлении регулярных выражений - см. Http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation и текст ниже и выше этого раздела. ,
Это разновидность дерева постоянной высоты (например, B-деревья или 2-3 дерева). По сути, это (2,3) дерево, листья которого являются (N, 2N-1) массивами, чтобы избежать накладных расходов на элемент. (Массив (N, 2N-1) - это массив, длина которого находится в диапазоне N..2N-1.) Чем больше N, тем меньше накладные расходы, но линейно увеличивается сложность разбиения и объединения. Такие операции, как индексация, разбиение и конкатенация, очень похожи на то, как они работают в 2-3 деревьях, обобщая (N, 2N-1) на уровне листьев.
источник