Скачиваний:
21
Добавлен:
01.05.2014
Размер:
160.26 Кб
Скачать

Министерство образования РФ

Санкт-Петербургский государственный

электротехнический университет

Отчет по лабораторной работе

По дисциплине «Комбинаторные алгоритмы».

Проверил: Ивановский С.А.

Выполнили ст. гр. 7382: Губаренко М.Н.

Коптилин В.А.

Санкт-Петербург

2002

  1. Региональный поиск (Метод 2D – дерева)

Общие замечания к задачам регионального поиска.

Файлом – будем называть набор S состоящий из записей типа (x1, x2, … ,xn), которые можно считать точками n-мерного декартова пространства.

Региональным запросом – будем считать область (регион) в n-мерном пространстве, задаваемый пользователем.

Региональный поиск – задача, состоящая в извлечении (задача отчета) или подсчете числа (задача подсчета) всех точек внутри запросного региона (области).

Следует отметить, что запросы уникального типа не представляют интереса, ибо их обработка непременно сведется к какому-нибудь виду исчерпывающего перебора в пространстве. Поэтому имеет смысл рассматривать массовые запросы, и тогда потребуются изначальные затраты на предобработку и запоминание, чтобы в долгосрочном плане получать выигрыш во времени поиска.

Метод двумерного двоичного дерева (2D-дерева)

Ф ормальная постановка задачи: даны N точек на плоскости. Какие из них лежат внутри заданного прямоугольника, стороны которого параллельны координатным осям. То есть, какие точки (x,y) удовлетворяют неравенствам

для заданных a, b, c, d.

Двухмерное двоичное дерево поиска, или 2D-дерево, является двоичным деревом, в котором выполняется рекурсивное деление плоскости вертикальными и горизонтальными отсекающими линиями. Направление отсекающих линий попеременно меняется по мере продвижения вниз по дереву: четный уровень (начиная с корня) содержит вертикальные линии, нечетный уровень – горизонтальные линии деления. Для целей поиска по области в наборе точек S каждый узел соответствует точке в наборе S и отсекающей линии, проходящей через эту точку.

Пример разбиения плоскости и соответствующее 2D-дерево.

Вертикальная отсекающая прямая линия, проходящая через точку 6, и соответствует корню дерева, разделяет набор точек S на два поднабора Sl и Sr, располагающиеся слева и справа от отсекающей линии соответственно. Горизонтальная прямая линия, проходящая через точку 7, левого потомка 6, делит Sl на два набора, располагающиеся сверху и снизу. Горизонтальная прямая линия, проходящая через точку 5, аналогичным образом делит набор Sr. Остальные отсекающие прямые линии выполняют дальнейшее более мелкое деление. Деление происходит на два набора примерно равного размера.

Рассмотрим области, ассоциированные с каждым узлом. В 2D-дереве корень охватывает весь домен, а каждый некорневой узел накрывает часть области своего предка, лежащего с той или иной стороны отсекающей прямой линии, относящейся к предку. На рисунке узел 6 относится ко всему домену, а узел 7 накрывает полу домен, расположенный слева от вертикальной отсекающей прямой линии, проходящей через точку 6, тогда как узел 2 накрывает ту часть области 2, которая лежит над горизонтальной прямой линией, проходящей через точку 7.

Алгоритмической схемой использующей структуру данных типа 2D-дерева будет метод “разделяй и властвуй”. Рассмотрим, как осуществляется запрос с областью R, начинающийся с некоторого узла 2D-дерева. Сначала проверим, будет ли точка, связанная с узлом, лежать в области R – и, если да, то эта точка выводится. Затем, если часть области R лежит слева (или снизу) от вертикальной (горизонтальной) отсекающей прямой линии узла, то будем рекурсивно выполнять запрос из левого потомка узла. И симметрично, если часть области R расположена справа (выше) от вертикальной (горизонтальной прямой) линии узла, то будем рекурсивно выполнять запрос из левого потомка узла. Цель заключается в ограничении обращения запроса к одной из сторон от отсекающей прямой линии узла, пока это можно сделать, т.е. пока область R не перестанет пересекать отсекающую прямую линию. На самом верхнем уровне запрос с областью R применяется к корню дерева.

Анализ времени построения 2D-дерева и времени запроса

В описываемом методе фактически производится сортировка x- и y-координат путем рекурсивного поиска медианы, а значит можно прибегнуть к предварительной сортировке для формирования упорядоченных массивов абсцисс и ординат точек из S. Это займет O(N log N) времени.

Анализ времени запроса для худшего случая.

Очевидно, что время запроса пропорционально общему числу узлов в Т, посещаемых поисковым алгоритмом, поскольку в каждом узле этот алгоритм затрачивает константное время. Очевидно, что время потрачено в узле v не зря, если точка P(v) выбирается (продуктивный узел); иначе, этот узел считается непродуктивным. Анализ направлен на построение ситуации худшего случая,

R(v)

D

Тип 2

D

D

Тип 0

Тип 1

Тип 4

Тип 3

D

R(v)

R(v)

R(v)

R(v)

Рис.2

т.е. он соответствует максимальному поддереву посещенных узлов, из которых все они непродуктивны. Каждый узел v из Т соответствует некоему обобщенному прямоугольнику R(v). Пересечения запросного региона D и подобного обобщенного прямоугольника R(v) могут быть отнесены к разным «типам» в зависимости от числа сторон R(v), имеющих непустые пересечения с D. В частности, если обозначить это число через i, то говорят, что пересечение имеет тип i для i = 0, 1, 2, 3, 4.(Рис.2). Единственный продуктивный тип пересечений, который всегда продуктивен – это тип 4; все остальные могут оказаться непродуктивными. Ограничимся частными случаями пересечений типа 2 и 3. (Заметим, что пересечения типов 2 и 3 могут начать появляться только на узлах, удаленных от корня на два и три уровня соответственно).

Тип 3 на высоте m

Тип 3 на высоте m-1

Тип 2 на высоте m

Тип 2 на высоте m-1

Тип 3 на высоте m-1

(а) (б)

Рис.3

Рассматривая рис. 3.а, можно легко построить ситуацию, когда пересечение 2 на высоте m непродуктивно и порждает одно пересечение типа 2 и одно пересечение типа 3 на высоте (m-1) (оба они могут быть сделаны непродуктивными). Аналогично как показано на рис.3.б, при том же самом ограничении на типы непродуктивных узлов можно построить ситуацию, когда одно пересечение типа 3 на высоте m в Т порождает пару пересечений типа 3 на высоте (m-2). Итак, обозначая через Ui(m) число пройденных непродуктивных узлов в поддереве высотой m, чей корень имеет тип i (i = 2, 3), получаем рекурентные соотношения:

Результат же таков: для U2(m) и U3(m) оценка одинакова – O(N).

Заключаем, что для файла мощности N в худшем случае время запроса составит O(N), даже если выбранное множество окажется пустым.

, а 2m=n, т.е. .

Пример работы программы.

Пример работы программы

Предобработка Шаг 1:

Шаг 2:

Шаг 12 (предобработка завершена):

Запрос

Шаг 1:

Шаг 2:

Шаг 7 (обработка запроса завершена):