Treap с неявными ключами

Существует структура данных, называемая treap: это рандомизированное дерево двоичного поиска, которое также является кучей случайного генерирования так называемых "приоритетов".

Существует вариация этой структуры, где ключи неявные, они не хранятся в дереве, но мы рассматриваем упорядоченный индекс node в дереве как этот node. Нам нужно сохранить размер поддерева в каждом node вместо ключа. Этот метод позволяет нам думать о treap как о каком-то массиве, который поддерживает много операций в O (log N): вставка, удаление, реверсия подмассива, изменение интервала и т.д.

Я немного разбираюсь в этой структуре, но не так много. Я попытался это сделать, но я нашел только много статей о treap, но ничего об этом "скрытом treap" / "индексированном списке". Я даже не знаю его имени, потому что мой родной язык не английский и лекция, которую я слушал, использовал родной термин структуры, а не английский оригинальный термин. Этот родной термин может быть непосредственно переведен на английский язык как "Treap на неявных ключах" или "Декартово дерево на неявных ключах".

Может ли кто-нибудь указать мне на статью об этой структуре или сказать мне свое первоначальное имя? Спасибо.

P.S. Извините, если мой английский был недостаточно понятен.

UPD: Некоторое дополнительное объяснение структуры, которую я ищу.

Рассмотрим обычный treap со случайно выбранными приоритетами и ключами, которые являются фактическими пользовательскими данными, хранящимися в дереве. Тогда представьте, что у нас есть какая-то другая информация о пользователе, хранящаяся в каждом node, а ключи - ничего, кроме ключей поиска. Следующий шаг - вычисление и поддержание размера поддерева в каждом node: мы должны обновить этот параметр после каждого Merge/Split/Add/Remove, но он позволяет нам найти, например, элемент Kth дерева в O (log N).

Когда у нас есть размеры поддерева в каждом node, мы можем отбросить ключи и представить, что treap представляет массив пользовательских данных в обходном пути. Индекс массива каждого элемента можно легко вычислить из размеров поддеревьев. Теперь мы можем добавить/удалить элемент в середине массива или разделить этот массив - все в O (log N).

Мы также можем выполнить "множественную" операцию - например, добавить постоянное значение ко всем элементам нашего "массива". Чтобы реализовать это, мы должны сделать эту операцию задерживаемой, добавить параметр в каждый node, который представляет задержанную константу, которая должна быть "позже" добавлена ​​ко всем элементам этого подмашины node и "нажимать" изменения по мере необходимости. Добавление константы для подмассива или рисования (маркировки) может быть отложено таким подзаданием, как изменение субарара (здесь отложенная информация в node в бит "подмассива должна быть отменена" ) и т.д.

UPD2: Здесь фрагмент кода - часть небольшого количества информации, которую я нашел. Не замечайте кириллицу:) Слова "с неявным ключом" означают в прямом переводе "с неявным ключом".

Ответ 1

Вы можете найти эту структуру данных в статье Каплана и Вербина по сортировке подписанных перестановок с помощью обращений (стр. 7, раздел 3.1): http://www.math.jussieu.fr/~fouquet/ENSEIGNEMENT/PROJETS/kaplan.pdf.

Ответ 2

Ключевая идея (без каламбура!) в treaps - использовать ключи, которые рандомизированы. Если вы удалите ключи, я не вижу, как у вас может быть такая возможность: возможно, я неправильно понял ваш вопрос. Или, может быть, вы имеете в виду альтернативу treaps, рандомизированное двоичное дерево поиска. Обе структуры данных используют ту же идею, что вы можете достичь средней сложности, убедившись, что ваше дерево выглядит как среднее дерево (вместо патологического случая).

С помощью treaps вы делаете это с использованием случайных приоритетов и балансировки.

С рандомизированными бинарными деревьями случайность включается только во время построения: то есть, когда вы вставляете node в дерево T, она имеет вероятность 1/(размер (T) + 1) в корне, где size (T) - количество узлов T; и, конечно, если node не вставлен в корневой каталог, вы продолжаете рекурсивно, пока он не будет добавлен. (См. Статьи моего C. Martinez для детального изучения этих деревьев.)

Эта структура данных ведет себя точно как treap, но использует другой механизм, который не требует ключей.

Если это не то, что вы искали, возможно, вы могли бы поделиться некоторой дополнительной информацией. Ваш лектор упомянул кого-нибудь, кто мог бы работать над этой структурой, где вы здесь, этот лектор, и то, что его/ее национальность. Возможно, это не похоже на это, но знание вашего родного языка может быть важным ключом, поскольку вы можете в общих чертах привязать алгоритмы/структуры данных к определенной стране, которая его создала.

Ответ 3

Возможно, вы ищете Rope (сложная форма строки), адаптированная под ваши потребности для отложенных операций. Интересно, что прямо сейчас есть вопрос о канатах .

Ответ 4

Я не думаю, что есть имя для этой структуры данных, так как это просто комбинация двух ортогональных понятий. Вы можете использовать неявные ключи, подобные этому, с любой структурой данных дерева с балансировкой.

Возможно, вы захотите взглянуть на деревья Scapegoat, так как они используют размер поддерева уже для перебалансировки и не требуют каких-либо дополнительных затрат.