Изменения

Перейти к: навигация, поиск

Ортогональный поиск

1531 байт добавлено, 16:35, 19 мая 2012
Сбалансированное дерево поиска
Переходим к двумерному случаю. Пусть дано некоторое множество точек на плоскости. Нам необходимо ответить, какие именно из них лежат в некотором заданном прямоугольнике.
Для этого возьмем любое сбалансированное дерево поиска и слегка модернизируем наполним его для более быстрой работыточками <tex>(x, y)</tex> из множества. В каждом узле качестве ключа будет использоваться <tex>x</tex>-координата точки. Теперь слегка модернизируем дерево: в каждой вершине дерева будем хранить отсортированный по <tex>y</tex>-координате массив точек, которые содержатся в соответствующем поддереве. В такой структуре данных поиск точек в заданном прямоугольнике <tex>(x_{min}, x_{max}) \times (y_{min}, y_{max})</tex> будет выглядеть следующим образом:# Выберем из дерева поиска те точки, которые входят <tex>x</tex>-координата которых лежит в интервале <tex>(x_{min}, x_{max})</tex>. Сделаем это точно так же, как делается [[Реализация запроса в дереве отрезков сверху|запрос сверху в дереве отрезков]]. Из аналогии с деревом отрезков следует, что мы ответ мы получим в виде <tex>O(\log n)</tex> поддеревьев дерева поиска.# Для каждого из полученных поддеревьев обратимся к массиву содержащихся в его поддеревонем точек и запустим от него приведенную выше функцию <tex>range{\_}search(y_{min}, y_{max})</tex>. Все полученные таким образом точки и будут составлять ответ.
Теперь для ответа нам нужно спуститься отрезком по дереву и, если все поддерево лежит в отрезке, сразу выдавать его, если нет - спускаться дальше.
Анонимный участник

Навигация