Понятие матроида нужно, чтобы придумывать и доказывать некоторые жадные алгоритмы в задачах, где нужно набрать какое-то множество объектов максимального веса. Например, минимальный остов, максимальное вершинно-взвешенное паросочетание или выполнение заказов с ограничениями по времени.
Если вы не специалист по абстрактной алгебре, рекомендуется подсматривать примеры матроидов в конце статьи.
Матроидом называется пара
-
Пустое множество является независимым:
$\varnothing \in I$ -
Любое подмножество независимого множества тоже независимо:
$$ A \subset B, B \in I \implies A \in I $$
-
Если в независимом множестве
$A$ меньше элементов, чем в независимом множестве$B$ , то будет существовать элемент из$B$ , дополняющий$A$ до независимого множества размера$|A|+1$ :$$ A, B \in I, |A| < |B| \implies \exists x \in B \setminus A: A \cup {x} \in I $$
Матроид называется взвешенным, если на нем есть аддитивная весовая функция:
Пусть нам нужно найти независимое множество, которое будет включать как можно больше элементов и при этом иметь как можно меньший вес. Утверждается, что можно просто отсортировать элементы по возрастанию весов и пытаться в таком порядке добавлять их в ответ:
X.sort()
s = []
for x in X:
if good(s + [x]):
s += [x]
Здесь под good
имеется в виду
Корректность этого алгоритма для произвольного матроида следует из следующего утверждения:
Теорема Радо-Эдмондса. Пусть
Доказательство:
Рассмотрим
Из свойств матроида:
Тогда верны два неравенства:
Величина
Получаем, что если объединить множество
Иными словами, если у нас есть оптимальное
Для доказательства жадников нужно просто (а иногда не просто) показать, что рассматриваемое множество является матроидом. Первые два критерия доказывать тривиально, третий сложнее.
Рассмотрим неориентированный граф
- Граф без ребер является лесом.
- Если удалить из леса ребра, он останется лесом.
- Пусть есть два леса
$|A| \leq |B|$ . В$A$ будет$|V| - |A|$ компонент связности, в$B$ будет$|V|-|B|$ компонент связности. Так как в$B$ компонент связности меньше, то будет существовать какое-то ребро$x$ , связывающее две компоненты связности из$A$ . Его и возьмем:$A \cup {x}$ тоже будет лесом, так как$x$ только соединило две разные компоненты связности.
Применив к этому матроиду теорему Радо-Эдмондса, мы получаем обоснование алгоритма Крускала для нахождения минимального остова.
Пусть у нас есть
Назовём правильными те наборы заданий, для которых существует порядок, при котором можно их всех успеть сделать до их дедлайнов. Проверять фиксированный набор можно так: отсортировать по дедлайнам (
Тогда
- Пустой набор заданий всегда можно сделать.
- Если у нас стало меньше заданий, то их сделать мы тоже успеем.
- Пусть есть два правильных набора
$|A| \leq |B|$ . Тогда в$B$ будет существовать задание$x$ с дедлайном позже$|A|$ . Все задания$A$ можно сделать не позже$|A|$ -го часа, а в$(|A|+1)$ -й час будем делать$x$ . Значит,$A \cup x$ — тоже правильный набор.
Значит, можно отсортировать задания по убыванию их стоимости и пытаться в таком порядке добавлять в ответ, проверяя правильность какой-нибудь структурой данных.
Рассмотрим двудольный граф
- Любое паросочетание покрывает пустое множество вершин.
- Исходное паросочетание покрывает также и любое подмножество исходных вершин.
- Пусть есть два множества вершин
$|A| \leq |B|$ . Раскрасим ребра из паросочетания, соответствующего$A$ в красный цвет,$B$ — в синий, а ребра из обоих паросочетаний — в пурпурный. Рассмотрим граф из красных и синих ребер. Любая компонента связности в нём представляет собой либо путь, либо цикл, состоящий из чередующихся красных и синих ребер. В любом цикле будет равное число красных и синих ребер, а так как всего синих ребер больше, то должен существовать путь, начинающийся и оканчивающийся синим ребром. Поменяем в этом пути красный и синий цвета и сделаем пурпурные ребра обратно красными. Теперь в графе из красных ребер на одно ребро больше, а значит к множеству$A$ добавилась какая-то вершина из левой доли, принадлежавшая ранее$B$ .
Пусть у вершин левой доли есть веса, и нам нужно найти максимальное паросочетание минимального веса. Согласно теореме, мы можем отсортировать вершины левой доли по их весам, а затем пытаться добавлять их в паросочетание. Сделать это можно стандартным алгоритмом Куна.
Множество
Рассмотрим какое-то множество векторов
- В пустом множестве нельзя получить какой-либо вектор.
- Подмножество линейно независимого множество тоже линейно независимо: способов набрать вектора стало ещё меньше.
- Пусть есть два линейно независимых множества
$A$ и$B$ , и$B$ больше. Пусть в нём нельзя выбрать вектор, совместимый с$A$ . Тогда получается, что все вектора$B$ можно выразить из$A$ . Значит, размерность$B$ уж точно не больше — противоречие.
Пример задачи: набрать базис максимального веса, если каждый вектор сколько-то стоит.
Примечание: