Продолжим обсуждение задачи [...].
Профессор. Обратите внимание, что вопрос о самом эффективном алгоритме становится особенно важным, если сформулировать задачу следующим образом: каково наименьшее количество взвешиваний, с помощью которых можно выявить фальшивую монету среди N монет? В такой формулировке задачи, даже при конкретном значении N, решение должно быть иным. Заметьте, что, вообще говоря, не требуется разрабатывать алгоритм группировки монет и их взвешиваний. Но если вы все же пошли по такому пути, то необходимо еще доказать, что не существует более эффективного алгоритма.
Зануда. Я, пожалуй берусь доказать, что для достаточно больших количеств всех монет N не обойтись одним взвешиванием.
П р о с т а к. Но это почти и так очевидно, безо всяких выкладок.
Зануда. Но если я это докажу, то смогу убедить вас, что мой алгоритм для случая N = 8 или N = 9 самый эффективный.
Профессор. Попробуйте, уважаемый Зануда, это интересно.
Зануда. В самом деле, взвешивание состоит в том, что на чаши весов кладутся два подмножества монет, причем монет должно быть поровну, поскольку в противном случае результат взвешивания ничего не скажет нам о наличии или отсутствии фальшивой монеты. Итак, сравниваемых подмножеств должно быть минимум два. Допустим, эти подмножества содержат по m монет. Разумеется. m?0 и 2m < N. Очевидно, возможны два варианта:
1. 2m = N. Нетрудно заметить, что N является четным числом. Если N = 2, то m = 1 и, следовательно, достаточно одного взвешивания. Если N > 2 (например, 4, 6, 8, ...), то m > 1 и результат взвешивания приведет к необходимости рассматривать подмножество из нескольких монет, следовательно, понадобится, по крайней мере, еще одно взвешивание. Таким образом, для четных N>2 одного взвешивания недостаточно.
2. 2m < N. Нетрудно заметить, что в данном случае N > 2 (например, 3, 4, 5,
...). Если N = 3 или N = 4, то m=1 и, следовательно, одного взвешивания будет достаточно. Если N > 4, то либо m > 1, либо N – 2m > 1. В первом случае при взвешивании не исключено, что фальшивая монета окажется среди m > 1 монет, и тогда потребуется хотя бы одно дополнительное взвешивание. Во втором случае не исключено, что при первом взвешивании вес подмножеств окажется одинаковым и придется рассматривать подмножество из N-2m> 1 монет, а тогда без дополнительного взвешивания не обойтись. Итак, при N > 4 одного взвешивания недостаточно.
Объединяя результаты рассмотрения двух частных случаев, но исчерпывающих все пространство возможностей, заключаем, что при общем количестве монет N?4 требуется не меньше двух взвешиваний. Поскольку ранее я изобрел алгоритм, обеспечивающий для N = 8 и N = 9 только что полученное минимальное, равное двум, количество взвешиваний, он наилучший.
Простак. Признаюсь, я не ожидал от тебя, Зануда, таких аналитических способностей. Тем не менее, теперь мне ясно, что ты не изобрел свой алгоритм в результате какого-то наития, подобно поэту или композитору, а пришел к нему чисто логическим путем, т. е. посредством скучных, рутинных операций. Впрочем, это не умаляет твоих заслуг.
Зануда. Честно говоря, на меня повлияло твое, Простак, упоминание о поиске льва в пустыне методом деления ее участков пополам - Я тогда подумал: а что если делить не пополам, а на три или больше частей? Но теперь я и сам вижу, что мой алгоритм не зависит от этой идеи. Она была моей "музой" — скорее стимулировала мое воображение, чем указывала путь. Алгоритм решения был почти полностью предопределен условием задачи: взвешивайте группы монет на рычажных весах.
Оставалось неочевидным: что сравнивать с помощью весов — две произвольно выбранные монеты или два произвольных подмножества монет? То, что количества монет на разных чашах весов должны быть одинаковы, и так понятно, сколько монет следует выбирать для одного взвешивания, я вычислил, рассуждая логически.
Простак. Мне кажется, что подобным образом можно доказать, что для одних значений N потребуется не менее трех, а для других — не менее четырех взвешиваний. Хорошо бы найти формулу, определяющую минимальное количество взвешиваний для заданного N.
Зануда. Не ручаюсь за общий случай, но, как мне кажется, я бы смог доказать, что при N? 10 потребуется не менее трех взвешиваний.
Профессор. Попробуйте это сделать на досуге, сейчас не будем тратить на это время.
Простак. Действительно, мы и так слишком задержались на этой задаче, не имеющей важного практического значения. Но меня сейчас больше волнует вопрос: может быть, это не единственный алгоритм, обеспечивающий обнаружение фальшивой монеты с помощью минимального количества взвешиваний?
Профессор. Да, таких алгоритмов может быть несколько. Например, при N = 6 можно разбить множество всех монет на 2 подмножества по 3 монеты либо на 3 подмножества по 2 монеты. В любом случае, потребуется 2 взвешивания. А поскольку для N = 6 по "теореме" Зануды это минимальная оценка, то оба алгоритма считаются наилучшими. Замечу, что здесь алгоритмы различаются только способом исходного разбиения множества монет на подмножества.
В дальнейшем мы продолжим разбирать алгоритмические задачи. Для этого достаточно пройти по ссылке. До новых встреч!
Статья подготовлена по материалам книги Вадима Дунаева «Занимательная математика. Множества и отношения».
Похоже, что отвечая на предыдущую задачу, я ответил и на эту, не зная, что она будет поставлена отдельно.
Спасибо! Замечательная “гимнастика” для мозга! Пока дочитал до конца задачку, покрылся испариной:)!
Пожалуйста, Игорь! От одного прочтения вспотел?!
Любопытный диалог, спасибо