Комбинаторные алгоритмы для программистов



             

Классы алгоритмов


Одной из причин быстрого прогресса комбинаторных вычислений является усиление внимания к исследованию классов алгоритмов в противоположность изучению отдельных из них. Для того чтобы утверждать, например, что "все алгоритмы, предназначенные для выполнения того-то и того-то, должны обладать такими-то и такими-то свойствами" или "не существует алгоритма, удовлетворяющего тому-то и тому-то", необходимо иметь дело с четко определенным классом алгоритмов. Именно при таком определении становится возможным говорить, что данный алгоритм является оптимальным по отношению к некоторому свойству, если он работает по крайней мере так же хорошо (относительно этого свойства), как любой другой алгоритм из рассматриваемого класса.

Как можно строго определить, возможно, бесконечный, класс алгоритмов? Исследуем этот вопрос на примере задачи о фальшивой монете. Рассматриваемый в этом примере класс алгоритмов порождает более обширный и более важный класс алгоритмов - так называемые деревья решений.

Задача. Имеется

n
монет, о которых известно, что
n - 1
из них являются настоящими и не более чем одна монета, фальшивая (легче или тяжелее остальных монет). Дополнительно к группе из
n
сомнительных монет дается еще одна монета, причем заведомо известно, что она настоящая. Имеются также весы, с помощью которых можно сравнить общий вес любых
m
монет с общим весом любых других
m
монет и тем самым установить, имеют ли две группы по
m
монет одинаковый вес либо одна из групп легче другой. Задача состоит в том, чтобы найти фальшивую монету, если она есть, за наименьшее число взвешиваний, или сравнений.

Решение Пусть сомнительные монеты занумерованы числами

1, 2, \ldots, n
. Монете, о которой известно, что она настоящая, поставим в соответствие номер 0. Пусть
\{ 0,1,2,\ldots,n\}
- множество монет. Если
S_{1},S_{2}
— непересекающиеся непустые подмножества множества
S
, то через
S_{1}:S_{2}
обозначим операцию сравнения весов множества
S_{1},S_{2}
. При сравнении возможны три исхода, которые обозначим следующим образом:
S_{1} <S_{2},S_{1}=S_{2},S_{1} > S_{2}
в зависимости от того, является ли вес
S_{1}
меньшим, равным или большим веса
S_{2}
.




Содержание  Назад  Вперед