Divide and ConquerMaster TheoremГеометрияАлгоритмы
3 мин чтение
Метод декомпозиции, Master Theorem и Задача о паре ближайших точек
Парадигма «Разделяй и властвуй», формулировка и 3 случая Основной теоремы о рекуррентных соотношениях (Master Theorem), алгоритм поиска пары ближайших точек на плоскости за O(N log N).
Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.
Метод «Разделяй и властвуй» (Divide and Conquer)
Парадигма состоит из 3 фундаментальных шагов:
Основная теорема о рекуррентных соотношениях (Master Theorem)
Пусть рекуррентное соотношение имеет вид:
где — число подзадач, — фактор уменьшения размера задачи, — стоимость разделения и объединения.
Определим критическую функцию :
Случай 1: Доминирует рекурсия ( полиномиально меньше )
Если для некоторого , то:Случай 2: Баланс стоимости ( и одного порядка)
Если для , то:Пример (MergeSort): .
Случай 3: Доминирует работа на текущем уровне ( полиномиально больше )
Если и выполняется условие регулярности при , то:Задача о паре ближайших точек на плоскости за
Дано множество из точек на плоскости. Найти две точки с минимальным евклидовым расстоянием .
cpp
struct Point { double x, y; };
double closestPairRec(vector<Point>& Px, vector<Point>& Py) {
int n = Px.size();
if (n <= 3) return bruteForce(Px);
int mid = n / 2;
Point midPoint = Px[mid];
vector<Point> PxL(Px.begin(), Px.begin() + mid);
vector<Point> PxR(Px.begin() + mid, Px.end());
double dl = closestPairRec(PxL, Py);
double dr = closestPairRec(PxR, Py);
double d = min(dl, dr);
// Полоса шириной 2*d вокруг разделяющей прямой x = midPoint.x
vector<Point> strip;
for (const auto& p : Py) {
if (abs(p.x - midPoint.x) < d) strip.push_back(p);
}
// В полосе достаточно проверить не более 7-8 точек для каждой вершины!
for (size_t i = 0; i < strip.size(); ++i) {
for (size_t j = i + 1; j < strip.size() && (strip[j].y - strip[i].y) < d; ++j) {
d = min(d, dist(strip[i], strip[j]));
}
}
return d;
}
Что дальше?
Вернитесь к обучению и выберите следующий материал.
Изучено — к обучению →Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».