vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2024-03-30 12:07 am

Rope, Gap buffer, Piece table

Набрёл на полезные структуры данных, которые не встретишь в учебниках.
  • Строп - хранит длинную строку в виде дерева, состоящего из небольших подстрок.
  • Буферное окно - динамический массив, позволяющий эффективную вставку и удаление элемента в некоторой области.
  • Таблица фрагментов - представление текстового документа, редактируемого в текстовом редакторе.

Редактор Руднева, а точнее RAND Editor, лежащий в его основе, построен как раз на таблице фрагментов. Был бы интересный челлендж: вытащить из тех исходников реализацию таблицы фрагментов и переписать на современный Си++ или Rust.

[personal profile] ex0_planet 2024-03-30 08:32 am (UTC)(link)
Еще докину

* Timer wheel :: раз два
* Skip list
* Interval map
lxe: (Default)

[personal profile] lxe 2024-03-30 08:44 am (UTC)(link)
Skip list популяризовал (канонизировав в Java CC) Doug Lea.

Интервальное отображение, кажется, идиоматический велосипед.

[personal profile] ex0_planet 2024-03-30 08:46 am (UTC)(link)
Велосипед, да, причём эталонный. Я про него узнал из каких-то дискуссий про тестовые задачи на собеседованиях -- его любят давать чтобы кандидаты пообламывались.
Edited 2024-03-30 08:47 (UTC)
kondybas: (Default)

[personal profile] kondybas 2024-03-30 02:13 pm (UTC)(link)
Скиплист прикольная штука, я в конце девяностіх делал реализацию для двунаправленного обхода с неуникальніми єлементами. В памяти он оч.ок, но на диске его реализовівать... так себе удовольствие.
lxe: (Default)

[personal profile] lxe 2024-03-30 09:40 pm (UTC)(link)
А память все равно свопится на диск.)
Для локальности доступа, да, есть другие структуры.
lxe: (Default)

[personal profile] lxe 2024-03-30 08:46 am (UTC)(link)
И тогда уж, к списку с пропусками, — его генерализация вектором предикатов:
https://github.com/Microsoft/Adaptable
lxe: (Default)

[personal profile] lxe 2024-03-30 08:54 am (UTC)(link)
Vantage point tree — сбалансированное бинарное дерево для поиска по близости в многомерном метрическом пространстве.

http://pnylab.com/pny/papers/vptree/main.html
http://pnylab.com/pny/papers/vptree/vptree.pdf

(Есть еще вариант с делением плоскими медианными сечениями, но я забыл аббревиатуру.)
spamsink: (Default)

[personal profile] spamsink 2024-03-30 01:11 pm (UTC)(link)
std::rope была в ранних вариантах STL, но в стандарт не вошла, к сожалению. Я ею однажды для чего-то пользовался много лет назад.