Skip quadtree: определение, время работы — различия между версиями
Gromak (обсуждение | вклад) м |
Gromak (обсуждение | вклад) м |
||
Строка 2: | Строка 2: | ||
== Описание == | == Описание == | ||
[[Файл:Skip_quadtree.png | 500px | thumb | По картинке должно быть понятно]] | [[Файл:Skip_quadtree.png | 500px | thumb | По картинке должно быть понятно]] | ||
− | Skip quadtree {{---}} как skip list, только вместо list'а quadtree. Поэтому желательно знать, что такое [[Список с пропусками | skip list]], и необходимо знать, что такое [[Квадродеревья | + | Skip quadtree {{---}} как skip list, только вместо list'а quadtree. Поэтому желательно знать, что такое [[Список с пропусками | skip list]], и необходимо знать, что такое [[Квадродеревья#Сжатое квадродерево | сжатое квадродерево]]. В данной статье будет рассматриваться только рандомизированая версия этой структуры, потому что больше и не нужно, кажется. |
The randomized skip quadtree {{---}} последовательность сжатых квадродеревьев над последовательностью подмножеств некоторого исходного множества <tex>S</tex>. <tex>S_0 = S</tex>, в <tex>S_1</tex> каждый элемент из <tex>S_0</tex> входит с вероятностью <tex>p \in (0, 1)</tex> и так далее. The randomized skip quadtree состоит из последовательности <tex>\{Q_i\}</tex>, где <tex>Q_i</tex> {{---}} сжатое квадродерево над множеством <tex>S_i</tex>. Будем называть эти квадродеревья уровнями, при этом нулевой уровень содержит в точности точки из <tex>S</tex>. | The randomized skip quadtree {{---}} последовательность сжатых квадродеревьев над последовательностью подмножеств некоторого исходного множества <tex>S</tex>. <tex>S_0 = S</tex>, в <tex>S_1</tex> каждый элемент из <tex>S_0</tex> входит с вероятностью <tex>p \in (0, 1)</tex> и так далее. The randomized skip quadtree состоит из последовательности <tex>\{Q_i\}</tex>, где <tex>Q_i</tex> {{---}} сжатое квадродерево над множеством <tex>S_i</tex>. Будем называть эти квадродеревья уровнями, при этом нулевой уровень содержит в точности точки из <tex>S</tex>. |
Версия 12:14, 20 января 2014
Конспект готов к прочтению. |
Содержание
Описание
Skip quadtree — как skip list, только вместо list'а quadtree. Поэтому желательно знать, что такое skip list, и необходимо знать, что такое сжатое квадродерево. В данной статье будет рассматриваться только рандомизированая версия этой структуры, потому что больше и не нужно, кажется.
The randomized skip quadtree — последовательность сжатых квадродеревьев над последовательностью подмножеств некоторого исходного множества интересный в , то он интересный и в .
. , в каждый элемент из входит с вероятностью и так далее. The randomized skip quadtree состоит из последовательности , где — сжатое квадродерево над множеством . Будем называть эти квадродеревья уровнями, при этом нулевой уровень содержит в точности точки из . Заметим, что если какой-то квадратОперации над skip quadtree
Будем для каждого интересного квадрата на каждом уровне хранить указатели на тот же квадрат уровнем ниже и уровнем выше (если есть).
Локализация выполняется аналогично сжатому квадродереву. Под локализацией подразумевается, что мы хотим найти минимальный интересный квадрат, содержащий данную точку (содержит геометрически, в самом дереве её может не быть, тут, возможно, правильнее сказать «пересекает»). Сначала локализуемся в квадродереве наибольшего уровня, начиная с его корня. Затем локализуемся в квадродереве уровня ниже, начиная уже не с корня, а с того квадрата, который нашли на прошлом уровне. И так далее, пока не дойдём до дна.
Для добавления сначала надо локализоваться. При этом мы локализуемся сразу на всех уровнях (так уж устроен процесс). Дальше добавляемся в нулевой уровень, затем с вероятностью
добавляемся на уровень выше и так далее до первого недобавления. При этом количество уровней должно увеличиться максимум на 1, то есть, если появился новый уровень, то процесс точно заканчивается. Хотя не, давайте без последнего условия, вроде с ним только лучше, но без него проще доказывать.Удаление совсем просто: локализуемся, удаляем со всех уровней, на которых есть. При этом какой-то уровень мог стать пустым, в таком случае выкинем его.
Время работы и память
Лемма (О количестве шагов на одном уровне): |
На каждом уровне в среднем совершается шагов поиска для любой точки . |
Доказательство: |
Пусть в (то есть на -ом уровне) поиск точки , начинающийся с корня, проходит по квадратам . Пусть случайная величина — количество шагов поиска в , тогда — последний квадрат из , являющийся интересным в .Оценим вероятность того, что делается шагов. Забьём на случай , так как он не важен при расчёте мат. ожидания. На пути будет хотя бы непустых четвертинок. У первого квадрата на этом пути есть хотя бы 2 непустые четвертинки, одна из них — следующий квадрат на пути, в котором тоже хотя бы 2 непустые четвертинки, и так далее. В последнем квадрате просто хотя бы 2 непустые четвертинки. Чтобы был последним из интересным квадратом в небходимо, чтобы среди этих как минимум непустых четвертинок только одна (вероятность этого назовём ) или ноль (вероятность этого назовём ) были непустыми в . Иначе, если будет хотя бы пара непустых четвертинок, то их наименьший общий предок в дереве будет интересным квадратом и будет находиться глубже . Таким образом, искомая вероятность не превосходит .Лично мне утверждение из предыдущего абзаца далось с трудом, если у вас тоже всё очень плохо, попробуйте напрячь мозг и залипнуть в картинку, вдруг поможет. Хотя я постарался расписать поподробней, чем в статье.
, потому что это в сущности вероятность того, что ни одна точка из как минимум непустых четвертинок не попала на уровень выше. , потому что это в сущности вероятность того, что ровно одна точка из как минимум непустых четвертинок попала на уровень выше. В общем, если чуть подумать, оценки на и довольно ясны.Это почти геометрическая прогрессия, только на полином домножили, определяется всё экспоненциальным множителем, так что это . Можно совсем строго оценить, но и так понятно, что ряд сходится, а сойтись он может только к константе. |
Лемма (О количестве уровней): |
Математическое ожидание количества уровней составляет |
Доказательство: |
Для оценки мат. ожидания посчитаем вероятность того, что количество уровней равно . ., потому что вероятность того, что точка дойдёт до уровня , равна . , потому что вероятность того, что точка не дойдёт до уровня , равна . А вот нифига не так, я тут понял. Там зависимые события, поэтому перемножать вероятности так нельзя, но всё не сильно портится. , и дальше этой оценки достаточно.
Оценим первую сумму: , поскольку сумма этих вероятностей не превосходит единицу. Оценим вторую сумму:
Рассмотрим эту сумму:
Суммируя всё вышесказанное, получаем, что Для лучшего понимания можно представлять, что . . |
Теорема (О времени работы): |
Поиск, добавление и удаление точки работают за в среднем. |
Доказательство: |
Достаточно очевидно из предыдущих лемм. |
Теорема (О занимаемой памяти): |
Математическое ожидание занимаемой памяти — . |
Доказательство: |
Сжатое квадродерево для | точек занимает памяти. На нулевом уровне точек. На следующем уровне точек, дальше и так далее. Получим геометрическую прогрессию, в итоге памяти.
В чём профит?
Как и range tree, данная структура умеет выдавать точки, принадлежащие какому-то прямоугольнику, алгоритм очень похож на тот, который применяется в range tree. Только ответ на запрос происходит за (вроде бы независимо от размерности, хотя квадродерево подразумевает двумерное пространство, но для обобщения на больше размерности асимптотика будет та же, кажется). И памяти нужно . Этим skip quadtree круче.
Как отвечать на запрос
Сначала локализуем все четыре точки прямоугольника
Я тут понял, что пока не знаю, как это делать, сейчас буду думать.
Всё очень плохо, я тупой, меня можно побить.
Боря тоже не знает, так что я не тупой, меня не надо бить. А ещё выяснилось, что от нас это не требуется, так что особо любознательные могут сами подумать, а остальные могут просто забить.