Реалізація незмінної (стійкої) масивної структури даних з швидкою індексацією, додаванням, додаванням, ітерацією


11

Я шукаю стійку структуру даних, схожу на масив (але незмінний), що дозволяє швидко проводити операції індексації, додавання, додавання та ітерації (хороша локальність).

Clojure забезпечує стійкий вектор, але це лише для швидкого додавання. Вектор Scala має ефективно додавання та додавання в постійному часі, але я не можу зрозуміти, як це реалізовано, оскільки він заснований на тій же структурі даних (бітово-відображене векторне трие), як вектор Clojure, і, наскільки я розумію, біт-відображений вектор трие не може мати швидку наперед без деяких хитрощів.

Мене цікавить не готова до використання реалізація, а опис того, як самостійно реалізувати таку структуру даних.

Відповіді:


13

Очевидним кандидатом є стійке збалансоване бінарне дерево. Усі перераховані вами операції можна виконувати за або за допомогою копіювання контуру . Детальніше про те, як досягти цього часу, дивіться у книзі Кріса Окасакі, на яку посилається нижче, або у моїй відповіді тут .O(1)O(lgn)

Звичайно, як варіант, кожен лист такого дерева міг сам містити незмінний масив (послідовність послідовних значень). Це робить оновлення значення менш ефективним, але воно може спрацювати для вашої ситуації, якщо ви ніколи не збираєтесь змінювати існуюче значення, просто додайте та додайте до нього. Таким чином, ваш вектор представлений у вигляді послідовності незмінних послідовностей, представлених у вигляді збалансованого бінарного дерева з незмінними масивами на листках. Це дозволяє швидко індексувати (логарифмічну кількість листків), швидко додавати та додавати, а також швидку ітерацію. Найгірша асимптотична складність не краща, але ефективність на практиці може бути значно кращою.

Стандартним посиланням є книга Кріса Окасакі 1998 року "Чисто функціональні структури даних".
Дивись також


Дякую. Схоже, RRB-дерева є хорошим кандидатом, і вони вже мають (не повну) реалізацію Clojure.
Тварог

Я думаю, Окасакі розповідає нам, як досягти цих режимів за незмінності та наполегливості?
Рафаель

1
@Raphael, так. Я додав посилання, щоб пояснити, як ви досягаєте часу виконання (до початку моєї відповіді).
DW

4

Я описав одну реалізацію такої структури даних у своїй статті про інкрементальне узгодження регулярних виразів - див. Http://jkff.info/articles/ire/#ropes-strings-with-fast-concatenation та текст нижче та вище цього розділу .

Це різновид дерева постійної висоти (як B-дерева або 2-3 дерева). В основному це (2,3) дерево, листя якого є (N, 2N-1) масивами, щоб уникнути накладних елементів. Масив (A (N, 2N-1) - це масив, довжина якого знаходиться в діапазоні N..2N-1. Такі операції, як індексація, розщеплення та конкатенація дуже схожі з тим, як вони працюють у 2-3 деревах, узагальнюючи до (N, 2N-1) на рівні листя.


Розрив посилань; будь ласка, надайте належну надійну довідку (яка дозволяє людям знаходити ваш папір без посилання).
Рафаель

Я не публікував статті в жодному журналі, лише на особистому веб-сайті. Мабуть, мабуть, покладіть це на Арксив, хороша ідея.
jkff

Я здебільшого думав про авторів (авторів), назву та рік - це полегшує Гуглінг, якщо потрібно. Покласти його на arXiv було б ще краще, правда!
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.