Pull to refresh

Greedy algorithms and proof of correctness (part 1)

Это цикл статей о том, как распознавать задачи, решаемые жадными алгоритмами, писать строгие доказательства корректности этих алгоритмов, а также о том, как распознавать задачи для которых жадные алгоритмы не применимы.

Вступление


О жадных алгоритмах многие знают еще со школы с университета. В любом курсе по алгоритмам выделена хотя бы одна небольшая глава посвященная жадным алгоритмам. В частности, в книге Томаса Кормена «Алгоритмы. Построение и анализ» освящается эта тема.

В данной статье будет одна задача, для которой будет приведено строгое доказательство на почти формальном математическом языке.

Задача


Пусть задан неориентированный граф $inline$G=(V, E)$inline$. Нужно найти максимальный подграф $inline$G^* = (V^*, E^*) \subset G $inline$ такой, чтобы выполнялось условие:
$$display$$\forall v \in V^*: 2 \le deg(v) \le |V^*|-2$$display$$

Решение:


Первое, что приходит на ум — итеративно исключать на каждом шаге вершину
$$display$$v_n: deg(v_n) < 2 \vee deg(v_n) > |V_n|-2 $$display$$
Здесь следует пояснить, что на $inline$n$inline$-ом шаге рассматривается граф $inline$G_n = (V_n, E_n)$inline$, который отличается от исходного графа тем, что в нем отсутствуют вершины $inline$ \{ v_1, v_2, ..., v_{n-1} \} $inline$.
Данную процедуру мы можем повторять до тех пор пока в графе есть хоть какие-нибудь вершины и пока можно хоть какую-нибудь вершину удалить из графа, поэтому такой алгоритм работает за конечное число шагов.
В результате, мы получим граф $inline$G_N=(V_N,E_N)$inline$, который удовлетворяет нашим условиям, но будет ли такой граф максимальным?

Доказательство жадности:


В данной задаче ответ на последний вопрос положительный. Указанный граф действительно будет максимальным из всех существующих. Чтобы строго доказать это, сформулируем лемму:

Определение:
Множеством всех решений данной задачи $inline$Sol(G)$inline$ назовем множество всех графов, которые подходят под ограничения, т.е.
$$display$$Sol(G) \stackrel{def}{=} \{\dot G = (\dot V,\dot E) \subset G\ |\ \forall v \in \dot V: 2 \le deg(v) \le |\dot V|-2 \}$$display$$

Лемма:
Не существует $inline$ \dot G \in Sol(G_n)\ \exists v \in V_n: deg(v) < 2 \vee deg(v) > |V_n|-2 $inline$
Доказательство:
Пусть лемма не верна. Тогда предположим, что существует решение $inline$ \dot G $inline$, включающее в себя вершину $inline$ v $inline$
$$display$$v \in \dot V: deg(v) < 2 \vee deg(v) > |\dot V|-2 $$display$$

По определению $inline$ \dot G \subset G_n $inline$, следовательно $inline$ \forall v \in V_n: deg(v) $inline$ не меньше, чем $inline$ deg(v) $inline$ в его подграфе $inline$ \dot G $inline$. Поэтому первое неравенство выполняться не может.
Аналогичное рассуждение можно провести со вторым неравенством: В исходном графе $inline$ V_n $inline$ не может быть меньше вершин не инидентных с данной, чем в его подграфе. Следовательно, мы получили противоречие, наше предположение не верно и такого решения действительно не существует.
Ч.т.д.

Тогда, в силу леммы, на каждом шаге алгоритма, мы можем выкидывать вершины графа, не подходящие под начальные ограничения, тем самым не теряя решений. Жадность алгоритма доказана!

Заключение


В следующих статьях я постараюсь привести еще больше задач в решении которых имеют место жадные алгоритмы. Надеюсь данная тема будет интересна определенному кругу читателей хабра. Буду рад вашим замечаниям и конструктивным предложениям по улучшению данного материала.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.