Ортогональный поиск — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
== Простейший случай ==
 
== Простейший случай ==
  
Пусть дана прямая с точками на ней и отрезок. Необходимо указать, какие из изначальных точек лежат на этом отрезке.
+
Пусть дана прямая с точками на ней и отрезок. Точки даны в отсортированном порядке. Необходимо указать, какие из изначальных точек лежат на этом отрезке.
  
Данная задача решается с помощью функций из STL - upper_bound и lower_bound
+
[[Файл:Line_with_dots_and_segment.png‎]]
 +
 
 +
Данная задача решается с помощью функций из STL - upper_bound и lower_bound.
 +
 
 +
upper_bound возвращает наименьшее значение больше данного, lower_bound - наибольшее значение меньше данного.
 +
 
 +
Рассмотрим на примере:
 +
 
 +
[[Файл:Upper_bound_and_lower_bound.png]]
  
 
Код реализации:
 
Код реализации:
Строка 13: Строка 21:
  
 
== Сбалансированное дерево поиска ==
 
== Сбалансированное дерево поиска ==
 +
 +
Переходим к двумерному случаю. Пусть дано некоторое множество точек на плоскости. Нам необходимо ответить, какие именно из них лежат в некотором заданном прямоугольнике.
 +
 +
Для этого возьмем любое сбалансированное дерево поиска и слегка модернизируем его для более быстрой работы.
 +
 +
В каждом узле будем хранить точки, которые входят в его поддерево.
 +
 +
Теперь для ответа нам нужно спуститься отрезком по дереву и, если все поддерево лежит в отрезке, сразу выдавать его, если нет - спускаться дальше.
  
 
== Квадро дерево ==
 
== Квадро дерево ==
  
 
== Инкрементальное квадро дерево ==
 
== Инкрементальное квадро дерево ==

Версия 10:13, 25 апреля 2012

Простейший случай

Пусть дана прямая с точками на ней и отрезок. Точки даны в отсортированном порядке. Необходимо указать, какие из изначальных точек лежат на этом отрезке.

Line with dots and segment.png

Данная задача решается с помощью функций из STL - upper_bound и lower_bound.

upper_bound возвращает наименьшее значение больше данного, lower_bound - наибольшее значение меньше данного.

Рассмотрим на примере:

Upper bound and lower bound.png

Код реализации:

template<class RauIter, class OutIter, class Scalar> OutIter range_search(RauIter p, RauIter q, OutIter out)
{
   return std::copy(lower_bound(p, q, l), upper_bound(p, q, r), out);
}

Сбалансированное дерево поиска

Переходим к двумерному случаю. Пусть дано некоторое множество точек на плоскости. Нам необходимо ответить, какие именно из них лежат в некотором заданном прямоугольнике.

Для этого возьмем любое сбалансированное дерево поиска и слегка модернизируем его для более быстрой работы.

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

Теперь для ответа нам нужно спуститься отрезком по дереву и, если все поддерево лежит в отрезке, сразу выдавать его, если нет - спускаться дальше.

Квадро дерево

Инкрементальное квадро дерево