Существует структура данных, называемая treap: это рандомизированное дерево двоичного поиска, которое также является кучей случайно генерируемых так называемых «приоритетов».
Существует вариант этой структуры, где ключи неявные, они не хранятся в дереве, но мы рассматриваем упорядоченный индекс узла в дереве как ключ этого узла. Нам нужно хранить размер поддерева в каждом узле вместо ключа. Этот метод позволяет нам думать о treap как о некоем массиве, который поддерживает множество операций за O (log N): вставка, удаление, возврат подмассива, изменение интервала и т. Д.
Я немного знаю об этой структуре, но не так много. Я пытался найти его в Google, но я нашел только много статей о самом Treap, но ничего об этом «неявном Treap» / «Индексированном списке». Я даже не знаю его названия, потому что мой родной язык не является английским, и лекция, которую я слушал, использовала родной термин структуры, а не английский первоначальный термин. Этот родной термин может быть непосредственно переведен на английский как «Treap на неявных ключах» или «Декартово дерево на неявных ключах».
Кто-нибудь может указать мне на статью об этой структуре или сказать мне ее первоначальное название? Спасибо.
P.S. Извините, если мой английский не был достаточно понятен.
UPD: Некоторое дополнительное объяснение о структуре, которую я ищу.
Рассмотрим обычный треп со случайно выбранными приоритетами и ключами, которые являются фактическими пользовательскими данными, хранящимися в дереве. Тогда давайте представим, что в каждом узле хранится некоторая другая пользовательская информация, а ключи - это не что иное, как ключи поиска. Следующим шагом является вычисление и поддержание размера поддерева в каждом узле: мы должны обновлять этот параметр после каждого слияния / разделения / добавления / удаления, но это позволяет нам найти, например, K-й элемент дерева в O (log N) время.
Когда у нас есть размеры поддеревьев в каждом узле, мы можем выбросить ключи и представить, что treap представляет массив пользовательских данных при прохождении по порядку. Индекс массива каждого элемента может быть легко рассчитан из размеров поддерева. Теперь мы можем добавить / удалить элемент в середине массива или разбить этот массив - все за O (log N).
Мы также можем выполнить «множественную» операцию - например, добавить постоянное значение для всех элементов нашего «массива». Чтобы реализовать это, мы должны сделать эту операцию отложенной, добавить параметр в каждом узле, который представляет задержанную константу, которую необходимо «позже» добавить ко всем элементам подмассива этого узла, и «протолкнуть» изменения вверх вниз вниз как необходимо. Добавление константы к подмассиву или окраске (маркировке) можно сделать таким образом, чтобы подрешетка была задержана, например, чтобы поменять местами подрешетку (здесь задержанная информация в узле в бите «подрешетка должна быть обращена») и т. *
UPD2: Вот фрагмент кода - часть небольшого количества информации, которую я нашел. Не замечайте кириллицу :) Слова "с неявным ключом" в прямом переводе означают "с неявным ключом".