Модуль III·Статья II·~4 мин чтения

Жадные алгоритмы и матроиды

Аппроксимационные алгоритмы

Превратить статью в подкаст

Выберите голоса, формат и длину — AI запишет аудио

Жадные алгоритмы и матроиды

Когда жадность оптимальна?

Жадный алгоритм принимает локально наилучшее решение на каждом шаге, не пересматривая прошлых решений. Просто и быстро — но не всегда оптимально. Жадный алгоритм для задачи о рюкзаке даёт не оптимум. Жадный алгоритм Крускала для MST — даёт оптимум. Почему? Ответ — матроидная структура задачи. Матроиды — это абстрактная алгебраическая структура, и для них жадность всегда оптимальна. Это один из самых глубоких и красивых результатов комбинаторной оптимизации.

Жадный алгоритм для MST: доказательство

Алгоритм Крускала: сортируем рёбра по весу. Жадно добавляем минимальное ребро, не создающее цикл.

Лемма об отсечении (Cut Lemma): для любого разреза (S, V∖S) минимальное ребро через разрез входит в MST.

Доказательство: пусть e* — минимальное ребро через разрез, и T — MST, не включающее e*. Добавим e* в T → образуется цикл, который пересекает разрез как минимум в одном другом ребре e'. Так как e* минимально в разрезе: w(e*) ≤ w(e'). Заменим e' на e* в T → новое дерево T' с весом w(T') ≤ w(T). Но T — MST → w(T') = w(T), и e* входит в MST. ✓

Матроид: определение

Матроид M = (E, I): E — «элементы», I ⊆ 2^E — «независимые» множества. Аксиомы:

I1 (не пустой): ∅ ∈ I.

I2 (наследование): если Y ∈ I и X ⊆ Y, то X ∈ I (подмножество независимого — независимо).

I3 (обмен): если X, Y ∈ I и |X| < |Y|, то существует e ∈ Y∖X: X ∪ {e} ∈ I.

Аксиома I3 — ключевая! Она означает «можно всегда вырасти»: меньшее независимое можно дополнить элементом из большего.

Базис матроида: максимальное независимое множество. По I3 все базисы имеют одинаковый размер (ранг матроида).

Примеры матроидов

Графовый матроид (цикловой матроид): E = рёбра графа G, I = ациклические подграфы (леса). Базис = остовное дерево (MST!).

Проверка аксиом: ∅ — лес ✓. Подграф леса — лес ✓. Обмен: если |F₁| < |F₂| для лесов, то F₂ имеет больше компонент связности → существует ребро из F₂, соединяющее разные компоненты F₁ → добавим его к F₁ без цикла ✓.

Линейный матроид: E = столбцы матрицы A над полем F, I = линейно независимые подмножества столбцов. Ранг матроида = ранг матрицы.

Матроид разбиения: E разбит на группы E₁,...,Eₖ. I = множества с не более 1 элементом из каждой Eᵢ. Используется для представления расписаний.

Однородный матроид Uₖₙ: I = все подмножества E размером ≤ k. Это «k-разреженный» матроид.

Теорема Радо-Эдмондса

Теорема: жадный алгоритм оптимален для задачи максимального взвешенного независимого множества тогда и только тогда, когда (E, I) — матроид.

Жадный алгоритм: сортировать элементы по убыванию веса. Добавлять следующий элемент, если после добавления множество остаётся независимым.

Доказательство «⇐» (матроид → жадность оптимальна): индукция по размеру множества. На каждом шаге максимальный элемент должен входить в какой-то оптимум (иначе можно заменить через аксиому обмена).

Доказательство «⇒» (жадность оптимальна → матроид): если I₃ нарушена, строим веса, на которых жадность даёт неоптимальное решение.

Следствия

MST: графовый матроид → алгоритм Крускала оптимален ✓.

Задача назначения: двудольный граф G, нужно выбрать k рёбер, не инцидентных одной вершине (= паросочетание размера k). Это пересечение двух матроидов разбиения! → полиномиально решаемо (алгоритм Эдмондса).

Задача Хаффмана: оптимальный префиксный код для сжатия. Жадный алгоритм Хаффмана оптимален — структура матроидная.

Пересечение матроидов

Задача: найти максимальное независимое множество I ∈ I₁ ∩ I₂ (пересечение двух матроидов).

Алгоритм: O(r² · T_oracle), где r — ранг, T_oracle — время проверки независимости. Полиномиально!

Пересечение 3 матроидов: NP-трудно. Это граница полиномиальной разрешимости.

Примеры:

  • Максимальное паросочетание в двудольном графе = пересечение двух матроидов разбиения
  • Раскраска двудольного графа = пересечение двух матроидов (назначение цветов)

Полный разбор: жадный алгоритм для взвешенного матроида

Задача: граф G с 5 вершинами и 7 рёбрами с весами. Найти MST.

Рёбра по убыванию веса: (1-2, 8), (2-5, 7), (3-4, 6), (1-3, 5), (2-4, 4), (1-4, 3), (4-5, 2).

Жадный алгоритм (Крускал, начинаем с максимального веса — для MST обычно с минимального, но здесь иллюстрируем):

Берём минимальные: (4-5, 2): лес = {4-5} ✓. (1-4, 3): {4-5, 1-4} ✓. (2-4, 4): {4-5, 1-4, 2-4} ✓. (1-3, 5): {4-5, 1-4, 2-4, 1-3} ✓ — 4 ребра для 5 вершин = дерево.

MST = {4-5, 1-4, 2-4, 1-3}, вес = 2+3+4+5 = 14.

§ Акт · что дальше