2.4.1 — рекурсивное разбиение как самостоятельная техника, а не частный случай сортировки2.4.1 — recursive splitting as a standalone technique, not a special case of sorting
В 2.2.1 разделяй-и-властвуй уже встречался — quicksort и mergesort устроены именно так. Но там рекурсивное разбиение обслуживало одну конкретную задачу — сортировку. Здесь та же идея рассматривается как самостоятельный инструмент проектирования алгоритмов, применённый к задачам, которые вообще не про сортировку: быстрое умножение чисел и матриц, свёртка многочленов и сигналов, задачи вычислительной геометрии. Общая схема одна и та же — разбить вход на части, решить каждую часть рекурсивно, объединить решения, — но именно способ объединения (combine-шаг) решает, будет ли результат быстрее наивного подхода или нет. Здесь: от арифметики над числами — через арифметику над многочленами — к геометрии на плоскости.Divide-and-conquer already showed up in 2.2.1 — quicksort and mergesort are built exactly this way. But there, recursive splitting served one specific job: sorting. Here the same idea is treated as a standalone algorithm-design tool, applied to problems that aren't about sorting at all: fast multiplication of numbers and matrices, convolving polynomials and signals, computational-geometry problems. The general scheme is the same — split the input into parts, solve each part recursively, combine the solutions — but it's specifically the combine step that decides whether the result beats the naive approach or not. Here: from arithmetic on numbers — through arithmetic on polynomials — to geometry in the plane.
Разделяй-и-властвуй — это рекуррентное соотношение T(n) = a·T(n/b) + f(n): разбить вход размера n на a подзадач размера n/b, решить каждую рекурсивно, потратить f(n) на объединение результатов. Master theorem (2.1.2) даёт итоговую асимптотику по трём числам — a, b и f(n). Ключевое наблюдение, вокруг которого построена вся эта тема: САМО разбиение почти никогда не даёт выигрыша — выигрыш даёт то, сколько именно рекурсивных подзадач a требуется и что происходит на шаге объединения. Наивное разбиение задачи умножения чисел или матриц пополам по-прежнему требует a=4 (числа) или a=8 (матрицы) подзадач — и по Master theorem это даёт ровно ту же асимптотику, что и наивный алгоритм без всякой рекурсии. Карацуба (1960) и Штрассен (1969) вошли в историю не потому, что придумали "разбить пополам" — это очевидно, — а потому, что нашли способ объединения, требующий на одну (Карацуба: 3 вместо 4) или на одну (Штрассен: 7 вместо 8) подзадачу меньше ценой более сложной алгебры на шаге combine. БПФ (1965, Кули—Тьюки, хотя идея восходит к Гауссу) идёт другим путём: та же схема "разбить пополам", но объединение работает не через дополнительные умножения, а через явную структуру корней из единицы, что даёт a=2, b=2 и f(n)=O(n) — отсюда O(n log n) вместо O(n²) для свёртки. Последние две статьи переносят ту же идею в геометрию: ближайшая пара точек и выпуклая оболочка — обе имеют вид T(n) = 2T(n/2) + O(n), но весь нетривиальный контент — в том, как за линейное время объединить два решения половин без полного перебора пар между ними.Divide-and-conquer is the recurrence T(n) = a·T(n/b) + f(n): split an input of size n into a subproblems of size n/b, solve each recursively, spend f(n) combining the results. The Master theorem (2.1.2) gives the final asymptotics from three numbers — a, b, and f(n). The key observation this whole topic is built around: the split itself almost never buys you anything — the payoff comes from exactly how many recursive subproblems a are needed and what happens at the combine step. A naive split of number or matrix multiplication in half still needs a=4 (numbers) or a=8 (matrices) subproblems — and by the Master theorem that gives exactly the same asymptotics as the naive algorithm with no recursion at all. Karatsuba (1960) and Strassen (1969) made history not because they thought of "split in half" — that part is obvious — but because they found a way to combine that needs one fewer subproblem (Karatsuba: 3 instead of 4) or one fewer (Strassen: 7 instead of 8), at the cost of trickier algebra in the combine step. The FFT (1965, Cooley–Tukey, though the idea traces back to Gauss) takes a different route: the same "split in half" scheme, but the combine step works not through extra multiplications but through the explicit structure of roots of unity, giving a=2, b=2, and f(n)=O(n) — hence O(n log n) instead of O(n²) for convolution. The last two articles carry the same idea into geometry: closest pair of points and convex hull both have the shape T(n) = 2T(n/2) + O(n), but all the non-trivial content is in how the two half-solutions get combined in linear time without brute-forcing every cross-pair.
Master theorem (2.1.2) переводит эти три случая в асимптотику напрямую — вся работа темы 2.4.1 происходит на шаге combine, не splitthe Master theorem (2.1.2) translates these three cases directly into asymptotics — all the work in this topic happens at the combine step, not the split
Порядок карточек — по смысловой дуге: сначала быстрая арифметика над числами (Карацуба), затем тот же приём над матрицами (Штрассен), затем над многочленами/сигналами (БПФ), и наконец два примера из вычислительной геометрии. Полный разбор — на отдельной странице по ссылке в названии.The card order follows a narrative arc: fast arithmetic on numbers first (Karatsuba), then the same trick on matrices (Strassen), then on polynomials/signals (FFT), and finally two computational-geometry examples. The full writeup is on its own page via the name link.
Первые две карточки — арифметика над числами и матрицами, где вся статья строится вокруг одного факта: сокращение числа рекурсивных подзадач (3 вместо 4, 7 вместо 8) ценой более сложной алгебры combine-шага меняет показатель степени в асимптотике. Третья переносит тот же принцип на многочлены, но объединение там устроено принципиально иначе — не через уменьшение числа умножений, а через переход в другое представление (точечные значения вместо коэффициентов), где умножение вообще становится тривиальным. Четвёртая и пятая карточки — вычислительная геометрия: обе имеют "правильную" асимптотику T(n) = 2T(n/2) + O(n) без всяких трюков с числом подзадач, а вся сложность — в том, как за линейное время объединить два решения половин, не перебирая все пары между ними.The first two cards are arithmetic on numbers and matrices, where the whole article is built around one fact: cutting the number of recursive subproblems (3 instead of 4, 7 instead of 8) at the cost of trickier combine-step algebra changes the exponent in the asymptotics. The third carries the same principle to polynomials, but the combine step works on a fundamentally different mechanism — not by cutting the number of multiplications, but by switching to a different representation (point-values instead of coefficients) where multiplication becomes trivial altogether. The fourth and fifth cards are computational geometry: both have the "well-behaved" T(n) = 2T(n/2) + O(n) asymptotics with no tricks on the subproblem count — all the difficulty is in combining two half-solutions in linear time without checking every cross-pair.
GMP (GNU Multiple Precision), встроенный тип int в Python и BigInteger в Java переключаются между несколькими алгоритмами умножения по размеру операндов: школьный O(n²) для малых чисел (константы побеждают асимптотику), Карацуба для средних размеров, и алгоритмы на основе БПФ (Шёнхаге—Штрассен и его потомки) для очень больших чисел — той же криптографии на ключах в тысячи бит, где даже показатель 1.585 против log n начинает иметь значение.GMP (GNU Multiple Precision), Python's built-in int, and Java's BigInteger switch between several multiplication algorithms based on operand size: schoolbook O(n²) for small numbers (constants win over asymptotics), Karatsuba for medium sizes, and FFT-based algorithms (Schönhage–Strassen and its descendants) for very large numbers — the same cryptography on thousand-bit keys, where even the 1.585 exponent versus log n starts to matter.
Аудиокодеки (MP3, AAC) и обработка изображений опираются на быстрые частотные преобразования — дискретное косинусное преобразование (DCT), использованное в JPEG, является близким родственником БПФ и вычисляется тем же приёмом "разделяй и властвуй" на чётных/нечётных компонентах. Фильтрация сигналов, эквалайзеры, спектральный анализ — везде свёртка через БПФ вместо прямой, O(n log n) вместо O(n²).Audio codecs (MP3, AAC) and image processing rely on fast frequency transforms — the discrete cosine transform (DCT) used in JPEG is a close relative of the FFT and is computed with the same divide-and-conquer trick on even/odd components. Signal filtering, equalizers, spectral analysis — convolution via FFT rather than directly, O(n log n) instead of O(n²), shows up everywhere.
Игровые движки и системы физического моделирования используют выпуклую оболочку набора вершин как ограничивающий объём (bounding volume) для грубой проверки столкновений перед точным тестом; геоинформационные системы применяют её для построения территориальных границ по облаку точек и пространственного индексирования.Game engines and physics-simulation systems use the convex hull of a vertex set as a bounding volume for coarse collision checks before an exact test; geographic information systems use it to build territorial boundaries from a point cloud and for spatial indexing.
Обнаружение потенциальных столкновений или сильных взаимодействий между близко расположенными частицами (молекулярная динамика, симуляция N тел) — по сути та же задача, что и поиск ближайшей пары точек: наивная проверка всех пар O(n²) заменяется пространственным разбиением, дающим сильно меньше сравнений в духе техники "полосы" из 2.4.1.4.Detecting potential collisions or strong interactions between closely spaced particles (molecular dynamics, N-body simulation) is essentially the same problem as finding the closest pair of points: a naive O(n²) all-pairs check gets replaced by spatial partitioning, yielding far fewer comparisons in the spirit of the "strip" technique from 2.4.1.4.
Обучение нейросетей — это в основном умножение больших матриц, и даже небольшое улучшение константы или показателя степени окупается при масштабе. Алгоритмы семейства Штрассена (и более новые, с ещё лучшей асимптотикой, но ещё большими константами) иногда применяются в специализированных численных библиотеках для очень больших матриц, несмотря на практические оговорки о численной устойчивости.Neural network training is mostly large matrix multiplication, and even a small improvement to the constant or the exponent pays off at scale. Strassen-family algorithms (and newer ones with even better asymptotics but even larger constants) are sometimes used in specialized numerical libraries for very large matrices, despite the practical caveats about numerical stability.
Штрассен и Карацуба выигрывают не потому, что разбили вход, а потому что сократили ЧИСЛО рекурсивных подзадач. Наивное разбиение умножения чисел на 4 подзадачи или матриц на 8 подзадач даёт T(n) = 4T(n/2) + O(n) или T(n) = 8T(n/2) + O(n²) — по Master theorem (2.1.2) это ровно та же асимптотика, что и без всякой рекурсии (O(n²) и O(n³) соответственно). Показатель в асимптотике определяется числом подзадач a, и снижение a на единицу — это и есть вся суть обоих алгоритмов, а не факт разбиения как таковой.Strassen and Karatsuba win not because they split the input, but because they cut the NUMBER of recursive subproblems. A naive split of number multiplication into 4 subproblems or matrix multiplication into 8 gives T(n) = 4T(n/2) + O(n) or T(n) = 8T(n/2) + O(n²) — by the Master theorem (2.1.2) that's exactly the same asymptotics as no recursion at all (O(n²) and O(n³) respectively). The exponent in the asymptotics is set by the subproblem count a, and cutting a by one is the entire substance of both algorithms, not the fact of splitting itself.
O(n^2.807) у Штрассена лучше O(n³) асимптотически, но на практике большие константы, худшая локальность кэша и накопление ошибок округления (Штрассен использует вычитания, которых нет в обычном умножении, — источник потери точности) означают, что производственные BLAS-библиотеки почти никогда не применяют его напрямую при типичных размерах матриц. Это тот же паттерн, что и у кучи Фибоначчи (2.3.3.4, куда стоит заглянуть для параллели): доказанно лучшая асимптотика не гарантирует победу без замера на реальных данных.Strassen's O(n^2.807) beats O(n³) asymptotically, but in practice large constants, worse cache locality, and accumulating rounding error (Strassen uses subtractions absent from ordinary multiplication — a source of precision loss) mean production BLAS libraries almost never use it directly at typical matrix sizes. This is the same pattern as the Fibonacci heap (2.3.3.4, worth revisiting for the parallel): provably better asymptotics doesn't guarantee a win without measuring on real data.
Граница в 6–7 соседей для полосы шириной 2d в задаче ближайшей пары (2.4.1.4) — не произвольное число, а следствие геометрической упаковки: в квадрате d×d не может поместиться больше 4 точек на расстоянии ≥d друг от друга, что и ограничивает число кандидатов на сравнение с каждой стороны. Частая ошибка — сравнивать в полосе все точки со всеми (полный перебор внутри полосы), что возвращает merge-шаг обратно к O(n²) и убивает весь выигрыш от O(n log n).The bound of 6–7 neighbors for the width-2d strip in the closest-pair problem (2.4.1.4) isn't an arbitrary number — it follows from a geometric packing argument: a d×d square can't fit more than 4 points that are all ≥d apart from each other, which bounds the number of comparison candidates on each side. A common mistake is comparing every point in the strip against every other point (a full scan inside the strip), which degrades the merge step back to O(n²) and kills the entire O(n log n) payoff.