Алгоритм Эвена — Паза
Алгоритм Эвена — Паза — это вычислительно эффективный алгоритм для справедливого разрезания торта. Он предназначен для некоторого разнородного делимого ресурса, такого как торт на день рождения, среди n участников с различными предпочтениями для различных частей торта. Алгоритм позволяет для n людей получить пропорциональный делёж.
История
Первым опубликованным алгоритмом пропорционального дележа торта был алгоритм «последний уменьшивший», опубликованный в 1948 году и имевший сложность . В 1984 году израильские математики Шимон Эвен и Азария Паз опубликовали улучшенный алгоритм, сложность которого составила Шаблон:Sfn.
Описание
Алгоритм использует стратегию «разделяй и властвуй» и способен дать пропорциональный делёж за время .
- Каждого партнёра просят провести линию, делящую торт на левую и правую часть так, что (по его мнению) отношение равно ⌊n/2⌋:⌈n/2⌉. Требуется, чтобы линии не пересекались. Простой путь гарантировать это — разрешать только горизонтальные линии или только вертикальные.
- Алгоритм сортирует n линий и разрезает торт по медиане линий, то есть по ⌊n/2⌋-ой линии. Например, если имеется 5 партнёров, проведших линии x=1, x=3, x=5, x=8 и x=9, то алгоритм режет торт вертикально по линии x=3.
- Алгоритм назначает каждой из половинок партнёров, линии которых принадлежат этой части, то есть партнёры, которые провели первые ⌊n/2⌋ линии назначаются левой части, остальные назначаются правой части. Так, партнёры проведшие линии x=1 и x=3, назначаются левой части, а остальные три партнёра назначаются правой части. Каждая из частей рекурсивно делится среди партнёров, назначенных этой части.
Можно доказать по индукции, что любой партнёр, который играет по правилам, гарантирующий значение по меньшей мере 1/n независимо от поведения других партнёров.
Благодаря стратегии «разделяй и властвуй» число итераций равно лишь O(log n), в отличие от O(n) для процедуры «последний уменьшивший». На каждой итерации от каждого партнёра требуется один маркер. Следовательно, число требуемых маркеров равно .
Оптимальность
Несколькими годами позже после публикации алгоритма Эвена — Паза доказано, что любая детерминированная или рандомизированная процедура пропорционального дележа, назначающего каждого участника непрерывный кусок, должна использовать действийШаблон:Sfn.
Более того, любая процедура детерминированного пропорционального дележа должна использовать действий, даже если процедуре разрешено дать участнику кусок, не являющийся непрерывным, и даже если процедуре разрешено гарантирует лишь примерную справедливостьШаблон:SfnШаблон:Sfn.
Из этих результатов трудности алгоритмов следует, что алгоритм Эвена — Паза является самым быстрым алгоритмом для достижения полной пропорциональности с непрерывными кусками, и этот алгоритм является самым быстрым для получения даже частичной пропорциональности и даже с разрывными кусками. Единственный случай, в котором алгоритм можно улучшить, это рандомизированные алгоритмы, гарантирующие частичную пропорциональность с разрывными кусками. См. «алгоритм Эдмондса — Пруса».
Рандомизированная версия
Можно использовать рандомизацию для снижения числа маркеров. Следующая рандомизированная версия рекурсивной процедуры деления пополам достигает пропорциональный делёж используя только O(n) маркирующих запросов в среднемШаблон:Sfn. Идея в том, что на каждой итерации вместо опроса всех участников сделать отметку посередине, просят только несколько партнёров сделать такие маркеры, в то время как другие партнёры лишь выбирают половинку, которую они предпочитают. Партнёры посылаются либо на запад, либо на восток согласно их предпочтениям, пока число партнёров на каждой стороне не станет равной n/2. Тогда делается разрез и каждая группа из n/2 партнёров делят свою половину рекурсивноШаблон:R.
В худшем случае нам по-прежнему нужно n-1 маркеров на итерацию, так что число требуемых маркеров в худшем случае равно O(n log n). Однако в среднем случае нужно только O(log n) маркеров на итерацию. При решении рекуррентного соотношения можно показать, что число требуемых маркеров равно O(n).
Заметим, что полное число запросов остаётся равным O(n log n), поскольку каждый партнёр должен выбрать половину.