Понятие матроида нужно, чтобы придумывать и доказывать некоторые жадные алгоритмы в задачах, где нужно набрать какое-то множество объектов максимального веса. Например, минимальный остов, максимальное вершинно-взвешенное паросочетание или выполнение заказов с ограничениями по времени.
Если вы не специалист по абстрактной алгебре, рекомендуется подсматривать примеры матроидов в конце статьи.
#Определение
Матроидом называется пара , где — множество элементов, называемое носителем матроида, а — некоторое множество подмножеств , называемое семейством независимых множеств. В матроиде должны выполняться следующие свойства:
Пустое множество является независимым:
Любое подмножество независимого множества тоже независимо:
- Если в независимом множестве меньше элементов, чем в независимом множестве , то будет существовать элемент из , дополняющий до независимого множества размера :
Матроид называется взвешенным, если на нем есть аддитивная весовая функция: .
#Алгоритм Радо-Эдмондса
Пусть нам нужно найти независимое множество, которое будет включать как можно больше элементов и при этом иметь как можно меньший вес. Утверждается, что можно просто отсортировать элементы по возрастанию весов и пытаться в таком порядке добавлять их в ответ:
X.sort()
s = []
for x in X:
if good(s + [x]):
s += [x]
Здесь под good
имеется в виду .
Корректность этого алгоритма для произвольного матроида следует из следующего утверждения:
Теорема Радо-Эдмондса. Пусть — множество минимального веса среди всех независимых подмножеств мощности . Возьмем — минимальна. Тогда — множество минимального веса среди независимых подмножеств мощности .
Доказательство:
Рассмотрим — множество минимального веса среди независимых подмножеств мощности .
Из свойств матроида: .
Тогда верны два неравенства:
Величина с двух сторон ограничивает величину . Значит, они равны. Следовательно, .
Получаем, что если объединить множество с — минимальным из таких, что , — то получим множество минимального веса среди независимых подмножеств мощности .
Иными словами, если у нас есть оптимальное -элементарное независимое множество, то мы можем индуктивно построить оптимальное -элементарное множество, добавив к нему минимальный элемент, оставляющий построенное множество независимым.
#Примеры
Для доказательства жадников нужно просто (а иногда не просто) показать, что рассматриваемое множество является матроидом. Первые два критерия доказывать тривиально, третий сложнее.
#Минимальный остов
Рассмотрим неориентированный граф . Пусть — множество лесов графа (ациклических подмножеств ). Тогда является матроидом:
- Граф без ребер является лесом.
- Если удалить из леса ребра, он останется лесом.
- Пусть есть два леса . В будет компонент связности, в будет компонент связности. Так как в компонент связности меньше, то будет существовать какое-то ребро , связывающее две компоненты связности из . Его и возьмем: тоже будет лесом, так как только соединило две разные компоненты связности.
Применив к этому матроиду теорему Радо-Эдмондса, мы получаем обоснование алгоритма Крускала для нахождения минимального остова.
#Расписания
Пусть у нас есть заданий, на выполнение каждого требуется час. Награда за выполнение -го задания не позже -того часа равна . В один час разрешено сделать только одно задание. Цель — максимизировать сумму наград.
Назовём правильными те наборы заданий, для которых существует порядок, при котором можно их всех успеть сделать до их дедлайнов. Проверять фиксированный набор можно так: отсортировать по дедлайнам () и проверить, что для всех .
Тогда (множество всех заданий, множество правильных наборов заданий) является матроидом:
- Пустой набор заданий всегда можно сделать.
- Если у нас стало меньше заданий, то их сделать мы тоже успеем.
- Пусть есть два правильных набора . Тогда в будет существовать задание с дедлайном позже . Все задания можно сделать не позже -го часа, а в -й час будем делать . Значит, — тоже правильный набор.
Значит, можно отсортировать задания по убыванию их стоимости и пытаться в таком порядке добавлять в ответ, проверяя правильность какой-нибудь структурой данных.
#Паросочетания
Рассмотрим двудольный граф . Пусть — множество наборов вершин левой доли, которых можно покрыть каким-нибудь паросочетанием. Тогда является матроидом:
- Любое паросочетание покрывает пустое множество вершин.
- Исходное паросочетание покрывает также и любое подмножество исходных вершин.
- Пусть есть два множества вершин . Раскрасим ребра из паросочетания, соответствующего в красный цвет, — в синий, а ребра из обоих паросочетаний — в пурпурный. Рассмотрим граф из красных и синих ребер. Любая компонента связности в нём представляет собой либо путь, либо цикл, состоящий из чередующихся красных и синих ребер. В любом цикле будет равное число красных и синих ребер, а так как всего синих ребер больше, то должен существовать путь, начинающийся и оканчивающийся синим ребром. Поменяем в этом пути красный и синий цвета и сделаем пурпурные ребра обратно красными. Теперь в графе из красных ребер на одно ребро больше, а значит к множеству добавилась какая-то вершина из левой доли, принадлежавшая ранее .
Пусть у вершин левой доли есть веса, и нам нужно найти максимальное паросочетание минимального веса. Согласно теореме, мы можем отсортировать вершины левой доли по их весам, а затем пытаться добавлять их в паросочетание. Сделать это можно стандартным алгоритмом Куна.
#Линейно независимые вектора
Множество -мерных векторов называется линейно независимым, если никакой его вектор нельзя получить линейной комбинацией (взвешенной суммой) других.
Рассмотрим какое-то множество векторов . Пусть — множество всех его линейно независимых подмножеств. Тогда является матроидом:
- В пустом множестве нельзя получить какой-либо вектор.
- Подмножество линейно независимого множество тоже линейно независимо: способов набрать вектора стало ещё меньше.
- Пусть есть два линейно независимых множества и , и больше. Пусть в нём нельзя выбрать вектор, совместимый с . Тогда получается, что все вектора можно выразить из . Значит, размерность уж точно не больше — противоречие.
Пример задачи: набрать базис максимального веса, если каждый вектор сколько-то стоит.
Примечание: — это тоже пространство, и там тоже можно ввести линейную независимость. Это значит, что то же самое распространяется на задачи в духе «набрать максимальное множество чисел, из которых ксором нельзя получить ноль».