Все статьи и конспекты
Divide and ConquerMaster TheoremГеометрияАлгоритмы
3 мин чтение

Метод декомпозиции, Master Theorem и Задача о паре ближайших точек

Парадигма «Разделяй и властвуй», формулировка и 3 случая Основной теоремы о рекуррентных соотношениях (Master Theorem), алгоритм поиска пары ближайших точек на плоскости за O(N log N).

Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.

Метод «Разделяй и властвуй» (Divide and Conquer)

Парадигма состоит из 3 фундаментальных шагов:

  • Divide (Разделение): Разбиение задачи на несколько меньших подзадач того же типа;

  • Conquer (Властвование): Рекурсивное решение подзадач. Если размер подзадачи достаточно мал — прямое решение;

  • Combine (Объединение): Комбинирование решений подзадач в общее решение исходной задачи.

  • Основная теорема о рекуррентных соотношениях (Master Theorem)

    Пусть рекуррентное соотношение имеет вид:

    T(n)=a⋅T(nb)+f(n)T(n) = a \cdot T\left(\frac{n}{b}\right) + f(n)

    где a≥1a \ge 1 — число подзадач, b>1b > 1 — фактор уменьшения размера задачи, f(n)f(n) — стоимость разделения и объединения.

    Определим критическую функцию nlog⁡ban^{\log_b a}:

    Случай 1: Доминирует рекурсия (f(n)f(n) полиномиально меньше nlog⁡ban^{\log_b a})

    Если f(n)=O(nlog⁡ba−ε)f(n) = O(n^{\log_b a - \varepsilon}) для некоторого ε>0\varepsilon > 0, то:
    T(n)=Θ(nlog⁡ba)T(n) = \Theta(n^{\log_b a})

    Случай 2: Баланс стоимости (f(n)f(n) и nlog⁡ban^{\log_b a} одного порядка)

    Если f(n)=Θ(nlog⁡ba⋅log⁡kn)f(n) = \Theta(n^{\log_b a} \cdot \log^k n) для k≥0k \ge 0, то:
    T(n)=Θ(nlog⁡ba⋅log⁡k+1n)T(n) = \Theta(n^{\log_b a} \cdot \log^{k+1} n)

    Пример (MergeSort): T(n)=2T(n/2)+O(n)  ⟹  a=2,b=2,nlog⁡22=n1  ⟹  T(n)=Θ(nlog⁡n)T(n) = 2T(n/2) + O(n) \implies a=2, b=2, n^{\log_2 2} = n^1 \implies T(n) = \Theta(n \log n).

    Случай 3: Доминирует работа на текущем уровне (f(n)f(n) полиномиально больше nlog⁡ban^{\log_b a})

    Если f(n)=Ω(nlog⁡ba+ε)f(n) = \Omega(n^{\log_b a + \varepsilon}) и выполняется условие регулярности af(n/b)≤cf(n)a f(n/b) \le c f(n) при c<1c < 1, то:
    T(n)=Θ(f(n))T(n) = \Theta(f(n))

    Задача о паре ближайших точек на плоскости за O(Nlog⁡N)O(N \log N)

    Дано множество PP из NN точек на плоскости. Найти две точки с минимальным евклидовым расстоянием d(pi,pj)d(p_i, p_j).

    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;
    }

    Что дальше?

    Вернитесь к обучению и выберите следующий материал.

    Изучено — к обучению →

    Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».