Доказывая, что алгоритм верен

Предположим, у нас есть n продавцов и m покупателей, отсортированных в порядке возрастания. Мы говорим, что продавец s и покупатель b «совпадают», если s ‹ b. Найдите максимальное подмножество A, состоящее из совпадающих пар (может совпасть ровно один покупатель и продавец).

Мой алгоритм является жадным и работает, выбирая первого продавца s1 и находя первого покупателя b1 в позиции c, такой что s1 ‹ b1, и добавляя это к A. Затем мы переходим ко второму продавцу s2 и повторяемся от c+1 в покупателях, пока не получим найти покупателя b2 такого, что s2 ‹ b2. Так делаем до тех пор, пока позиция c не станет равна размеру списка покупателей.

У меня просто проблемы с доказательством правильности алгоритма. Я не уверен, как формализовать метод, чтобы было легко увидеть, что оптимальное решение всегда находится. Когда я думаю об этом, это имеет смысл, но опять же формальная проверка - это то, с чем у меня проблемы.


person Bob Jonas    schedule 05.10.2014    source источник
comment
Формальная проверка сложна.   -  person Hot Licks    schedule 05.10.2014
comment
Я бы рекомендовал попытаться перевести это в код или, по крайней мере, код песудо и задать тот же вопрос на codereview.stackexchange.com.   -  person Ricardo Sanchez    schedule 05.10.2014


Ответы (1)


«Формальное» доказательство — это своего рода расплывчатое описание. Я набросаю доказательство примерно с уровнем детализации, который можно было бы увидеть в исследовательской статье (который может быть ниже уровня детализации, необходимого для набора задач в курсе алгоритмов).

Жадный алгоритм явно производит действительное сопоставление. (Из-за трудностей формальных методов на практике это действительно злоупотребление словом «ясно».)

Чтобы показать, что это паросочетание имеет максимальный размер, мы докажем по индукции следующее техническое утверждение. Для всех k, не превышающих этот размер, существует максимальное паросочетание, при котором сопоставляются k наименьших продавцов, как в жадном паросочетании.

Базовый случай: k = 0. Мы можем взять любое старое максимальное паросочетание, так как утверждение бессодержательно истинно (наименьшее 0 — это пустое множество).

Шаг индукции состоит в том, чтобы для k > 0 доказать, что утверждение для k - 1 влечет за собой утверждение для k. Существует максимальное паросочетание M, которое согласуется с жадным решением для k - 1 наименьшего количества продавцов, но, возможно, не для k-го наименьшего, которое мы будем называть sk. Теперь дело за аргументом.

Случай 1: sk совпадает в M и в жадном решении. Пусть bG будет покупателем sk в жадном решении, а bM будет покупателем sk в M. Если bG = bM, то дело сделано. В противном случае bG ‹ bM, потому что жадное решение выбрало минимально подходящего покупателя среди всех покупателей, исключая только покупателей для s1, ..., sk-1 (которые сопоставляются таким же образом в M). Если bG доступен в M, то переключите покупателя sk на bG. В противном случае поменяйте bG на bM в M; продавец, ранее покупавший у bG, получает более крупного покупателя, поэтому своп действителен.

Случай 2: sk соответствует M, но не соответствует жадному решению. Тогда жадное решение является подмножеством M. Это невозможно, потому что покупатель sk в M доступен в жадном решении (жадное решение максимально).

Случай 3: sk не соответствует M. Соответствует какой-то более крупный продавец; замените его на sk и примените один из других случаев.

person David Eisenstat    schedule 05.10.2014