Теорема Радо-Эдмондса (жадный алгоритм) — различия между версиями
(→Графовый матроид) |
|||
(не показано 19 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
+ | == Теорема Радо-Эдмондса == | ||
{{Теорема | {{Теорема | ||
|about= | |about= | ||
Радо-Эдмондса | Радо-Эдмондса | ||
|statement= | |statement= | ||
− | На носителе матроида <tex>M = \langle X, I \rangle</tex> задана весовая функция <tex>\omega: X \to \mathbb R</tex>. Пусть <tex>A \in I</tex> - множество минимального веса среди независимых подмножеств <tex>X</tex> мощности <tex>k</tex>. Возьмем <tex>x: A \cup x \in I</tex>, <tex>x \notin A</tex>, <tex>\omega (x)</tex> - минимальна. | + | На носителе [[Определение матроида| матроида]] <tex>M = \langle X, I \rangle</tex> задана весовая функция <tex>\omega: X \to \mathbb R</tex>. Пусть <tex>A \in I</tex> {{---}} множество минимального веса среди [[Определение матроида| независимых подмножеств]] <tex>X</tex> мощности <tex>k</tex>. Возьмем <tex>x: A \cup x \in I</tex>, <tex>x \notin A</tex>, <tex>\omega (x)</tex> {{---}} минимальна. |
− | <br> Тогда <tex>A \cup x</tex> - множество минимального веса среди независимых подмножеств <tex>X</tex> мощности <tex>k + 1</tex>. | + | <br> Тогда <tex>A \cup x</tex> {{---}} множество минимального веса среди независимых подмножеств <tex>X</tex> мощности <tex>k + 1</tex>. |
|proof= | |proof= | ||
− | Рассмотрим <tex>B \in I</tex> - множество минимального веса среди независимых подмножеств <tex>X</tex> мощности <tex>k + 1</tex>. | + | Рассмотрим <tex>B \in I</tex> {{---}} множество минимального веса среди независимых подмножеств <tex>X</tex> мощности <tex>k + 1</tex>. |
− | + | ||
− | + | Из определения матроида: <tex>\exists y \in B\setminus A : A \cup y \in I</tex>. | |
− | <br><tex>\omega (A \cup y) = \omega (A) + \omega (y) \ | + | |
− | <br><tex>\omega (B \setminus y) = \omega (B) - \omega (y) \ | + | Тогда верны два неравенства: |
− | + | <br><tex>\omega (A \cup y) = \omega (A) + \omega (y) \geqslant \omega (B) \Rightarrow \omega (A) \geqslant \omega (B) - \omega (y)</tex>, | |
− | + | <br><tex>\omega (B \setminus y) = \omega (B) - \omega (y) \geqslant \omega (A)</tex>. | |
− | + | ||
− | + | Заметим, что величина <tex>\omega (A)</tex> с двух сторон ограничивает величину <tex>\omega (B) - \omega (y)</tex>. Значит, эти величины равны: | |
− | + | <tex>\omega (A) = \omega (B) - \omega (y) \Rightarrow \omega (A) + \omega (y) = \omega (B)</tex>. | |
− | + | ||
+ | Следовательно, | ||
+ | <tex>\omega (A \cup y) = \omega (A) + \omega (y) = \omega (B)</tex>. | ||
+ | |||
+ | Таким образом получаем, что если объединить множество <tex>A</tex> с <tex>x</tex> — минимальным из таких, что <tex>A \cup x \in I</tex>, — то получим множество минимального веса среди независимых подмножеств <tex>X</tex> мощности <tex>k + 1</tex>. | ||
}} | }} | ||
+ | |||
+ | == Жадный алгоритм поиска базы минимального веса == | ||
+ | {{Теорема | ||
+ | |about= | ||
+ | жадный алгоритм поиска базы минимального веса | ||
+ | |statement= | ||
+ | Пусть на носителе матроида <tex>M = \langle X, I \rangle</tex> задана весовая функция <tex>\omega: X \to \mathbb R</tex>. Для любого <tex>A \subset X</tex> выполнено: <tex>\omega(A) = \sum\limits _{x \in A} \omega(x)</tex>. Тогда [[Определение матроида| база]] минимального веса матроида <tex>M</tex> ищется жадно. | ||
+ | |proof= | ||
+ | Пусть <tex>n = |X|</tex>¸ а <tex>m</tex> — время, за которое выполняется проверка множества на независимость. | ||
+ | |||
+ | Псевдокод алгоритма: | ||
+ | sort(X) <span style="color:green">// сортируем элементы по возрастанию веса</span> | ||
+ | <tex>B \leftarrow \varnothing</tex> | ||
+ | '''for''' <tex>i \leftarrow 0</tex> '''to''' <tex>n-1</tex> | ||
+ | '''if''' <tex>B \cup X[i] \in I</tex> | ||
+ | <tex>B \leftarrow B \cup X[i]</tex> | ||
+ | Рассмотрим шаг алгоритма, на котором мы пытаемся добавить элемент <tex>X[i]</tex>. Заметим, что если при его добавлении сохраняется независимость множества <tex>B</tex>, то это элемент минимального веса не из <tex>B</tex>. В самом деле, пусть <tex>X[j]</tex> — элемент минимального веса не из <tex>B</tex>, который можно добавить к <tex>B</tex> с сохранением его независимости, тогда <tex>j<i</tex>. Но тогда он уже был бы добавлен на <tex>j</tex>-ом шаге алгоритма. | ||
+ | |||
+ | Понятно, что все базы имеют одинаковую мощность (иначе в меньшую можно было бы добавить элемент из большей по аксиоме матроидов, что противоречит определению базы). По [[Теорема Радо-Эдмондса (жадный алгоритм)|теореме Радо-Эдмондса]] множество минимального веса, имеющее мощность базы, (то есть база минимального веса) ищется последовательным добавлением в изначально пустое множество элементов минимального веса из <tex>X</tex> так, чтобы после каждого добавления множество оставалось независимым. | ||
+ | |||
+ | Алгоритм работает за <tex>O(n \log n + mn)</tex>. На сортировку элементов из <tex>X</tex> по возрастанию весов уходит <tex>O(n \log n)</tex>. После чего, построение базы выполняется <tex>O(n)</tex> шагов цикла, каждый из которых работает <tex>O(m)</tex> времени. Однако, если считать, что проверка множества на независимость происходит за <tex>O(1)</tex>, асимптотика алгоритма будет <tex>O(n \log n)</tex> | ||
+ | }} | ||
+ | |||
+ | == Примеры == | ||
+ | |||
+ | === Графовый матроид === | ||
+ | Примером задачи, которая решается с помощью жадного алгоритма, является поиск [[Лемма о безопасном ребре| остовного дерева]]. Остовное дерево — это база в [[Примеры матроидов#.D0.93.D1.80.D0.B0.D1.84.D0.BE.D0.B2.D1.8B.D0.B9_.D0.BC.D0.B0.D1.82.D1.80.D0.BE.D0.B8.D0.B4| графовом матроиде]]. Данная задача решается с помощью [[Алгоритм Краскала| алгоритма Краскала]]. Код данного алгоритма совпадает с псевдокодом алгоритма поиска базы минимального веса, который был приведен выше. | ||
+ | |||
+ | === Матроид паросочетаний === | ||
+ | Типичной задачей из этого класса, является поиск наибольшего паросочетания в двудольном графе. Здесь мы имеем дело с [[Примеры матроидов#.D0.A2.D1.80.D0.B0.D0.BD.D1.81.D0.B2.D0.B5.D1.80.D1.81.D0.B0.D0.BB.D1.8C.D0.BD.D1.8B.D0.B9_.D0.BC.D0.B0.D1.82.D1.80.D0.BE.D0.B8.D0.B4| трансверсальным матроидом]]. Решается эта задача с помощью [[Алгоритм Куна для поиска максимального паросочетания| алгоритма Куна]]. | ||
+ | |||
+ | === Матричный матроид === | ||
+ | Рассмотрим задачу о нахождении максимального количества линейно независимых строк в матрице. Возьмем матрицу с действительными кэффициентами <tex>[a_{ij}]</tex>. Пусть <tex>E</tex> — множество её строк, <tex>I</tex> — семейство множеств линейно независимых строк. Тогда <tex>M = \langle E, I \rangle</tex> — [[Примеры матроидов#.D0.9C.D0.B0.D1.82.D1.80.D0.B8.D1.87.D0.BD.D1.8B.D0.B9_.D0.BC.D0.B0.D1.82.D1.80.D0.BE.D0.B8.D0.B4| матричный матроид]]. Данная задача, как и задача о решении системы линейных алгебраических уравнений, решается с помощью метода Гаусса<ref>[http://e-maxx.ru/algo/linear_systems_gauss MAXimal :: algo :: Метод Гаусса]</ref> | ||
+ | |||
+ | == См. также == | ||
+ | * [[Теорема о базах]] | ||
+ | * [[Теорема Эдмондса-Лоулера]] | ||
+ | |||
+ | == Примечания == | ||
+ | <references /> | ||
+ | |||
+ | == Источники информации == | ||
+ | * [[wikipedia:ru:Жадный алгоритм Радо — Эдмондса | Википедия — Жадный алгоритм Радо-Эдмондса]] | ||
+ | * [http://www.mathematik.hu-berlin.de/~wilhelm/greedy-vortrag.pdf| Greedy Algorithm And Edmonds Matroid Intersection Algorithm] | ||
+ | * [http://habrahabr.ru/post/120343/| Habrahabr — Жадные алгоритмы] | ||
+ | |||
+ | [[Категория:Алгоритмы и структуры данных]] | ||
+ | [[Категория:Матроиды]] | ||
+ | [[Категория:Основные факты теории матроидов]] |
Версия 19:39, 25 мая 2015
Содержание
Теорема Радо-Эдмондса
Теорема (Радо-Эдмондса): |
На носителе матроида задана весовая функция . Пусть — множество минимального веса среди независимых подмножеств мощности . Возьмем , , — минимальна.
Тогда — множество минимального веса среди независимых подмножеств мощности . |
Доказательство: |
Рассмотрим — множество минимального веса среди независимых подмножеств мощности .Из определения матроида: .Тогда верны два неравенства:
Заметим, что величина с двух сторон ограничивает величину . Значит, эти величины равны: .Следовательно, Таким образом получаем, что если объединить множество . с — минимальным из таких, что , — то получим множество минимального веса среди независимых подмножеств мощности . |
Жадный алгоритм поиска базы минимального веса
Теорема (жадный алгоритм поиска базы минимального веса): |
Пусть на носителе матроида база минимального веса матроида ищется жадно. задана весовая функция . Для любого выполнено: . Тогда |
Доказательство: |
Пусть ¸ а — время, за которое выполняется проверка множества на независимость.Псевдокод алгоритма: sort(X) // сортируем элементы по возрастанию веса for to if Рассмотрим шаг алгоритма, на котором мы пытаемся добавить элемент . Заметим, что если при его добавлении сохраняется независимость множества , то это элемент минимального веса не из . В самом деле, пусть — элемент минимального веса не из , который можно добавить к с сохранением его независимости, тогда . Но тогда он уже был бы добавлен на -ом шаге алгоритма.Понятно, что все базы имеют одинаковую мощность (иначе в меньшую можно было бы добавить элемент из большей по аксиоме матроидов, что противоречит определению базы). По теореме Радо-Эдмондса множество минимального веса, имеющее мощность базы, (то есть база минимального веса) ищется последовательным добавлением в изначально пустое множество элементов минимального веса из так, чтобы после каждого добавления множество оставалось независимым. Алгоритм работает за . На сортировку элементов из по возрастанию весов уходит . После чего, построение базы выполняется шагов цикла, каждый из которых работает времени. Однако, если считать, что проверка множества на независимость происходит за , асимптотика алгоритма будет |
Примеры
Графовый матроид
Примером задачи, которая решается с помощью жадного алгоритма, является поиск остовного дерева. Остовное дерево — это база в графовом матроиде. Данная задача решается с помощью алгоритма Краскала. Код данного алгоритма совпадает с псевдокодом алгоритма поиска базы минимального веса, который был приведен выше.
Матроид паросочетаний
Типичной задачей из этого класса, является поиск наибольшего паросочетания в двудольном графе. Здесь мы имеем дело с трансверсальным матроидом. Решается эта задача с помощью алгоритма Куна.
Матричный матроид
Рассмотрим задачу о нахождении максимального количества линейно независимых строк в матрице. Возьмем матрицу с действительными кэффициентами матричный матроид. Данная задача, как и задача о решении системы линейных алгебраических уравнений, решается с помощью метода Гаусса[1]
. Пусть — множество её строк, — семейство множеств линейно независимых строк. Тогда —