ft-290008buchok / regional-search-binary-tree

Optimization of regional search using a binary tree

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Бинарное дерево поиска

В данном репозитории представлено решение на C++ задачи регионального поиска точек на плоскости, оптимизированная с помощью бинарного дерева поиска

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

Графический вывод

Консольный вывод

Постановка задачи

На плоскости 10 х 10 случайно сгенерировано n точек (равномерное распределение), пользователь задаёт прямоугольник, лежащий в этой плоскости, в формате (x, y координаты левого верхнего угла, x, y координаты правого нижнего угла). Требуется найти сколько точекпопадает в заданный прямоугольник за время log(n).

Решение

Для ускорения поиска производится предобработка массива точек - они представляются в виде бинарного дерева поиска по следующему алгоритму:

Все точки сортируются по X координате
Средняя точка в отсортированном массиве кладётся в корневой узел дерева
Отсортированный массив делится на 2 подмассива по средней точке
Оба подмассива сортируются по Y координате
Средняя точка левого подмассива кладётся в узел левого потомка
Средняя точка правого подмассива кладётся в узел правого потомка
Потом левый подмассив делится на 2 подмассива по своей средней точке и каждый из них сортируется по X
Аналогичная процедура проделывается и с правым подмассивом
Средние точки подмассивов левого подмассива кладутся в узлы потомков левого потомка
Средние точки подмассивов правого подмассива кладутся в узлы потомков правого потомка
И так далее, пока не закончатся точки

После предобработки можно приступать к поиску, для этого выполняется рекурсивный обход бинарного дерева, и при каждом спуске по дереву на один уровень вниз происходит выбор, пойти по левой ветке, по правой или рассмотреть обе в зависимости от координат прямоугольника, заданного пользователем.
Таким образом, при поиске обходятся не все точки, и задача поиска решается за O(log(n)), что оптимальнее, чем прямой перебор, который занимает O(n^2).

Реализация

В realization.cpp представлена реализация данного алгоритма на C++ с подробными комментариями на русском языке.

About

Optimization of regional search using a binary tree


Languages

Language:C++ 100.0%