Прямой перебор
Зачем это нужно?
Очень многие комбинаторные задачи можно решить просто вручную составив все возможные комбинации.
Зачем вообще проходить эту тему?
Перебрать варианты любой ведь сможет!
Мы ведь и зашли в этот учебник, чтобы изучать приемы быстрого решения!
Эти и подобные вопросы и возмущения понятны. Но прежде чем научиться летать, нужно сначала научиться ползать. Прежде чем узнать о хитрых приемах, надо сначала изучить и отработать базу — перебор вариантов вручную.
Не волнуйтесь, у прямого перебора вариантов тоже есть свои хитрые приемы и весьма интересные задачи. Скучно не будет.
Перебираем с умом
Казалось бы, что может быть проще!? Просто берешь и выписываешь все возможные комбинации! Как-бы да, но при бездумном и бессистемном выписывании очень легко можно пропустить какую-то комбинацию. Или посчитать одну и ту же дважды. Чтобы такого не проиходило, нужно придерживаться двух простых правил:
Каждому элементу дать уникальное и короткое обозначение.
Придумать удобный алгоритм перебора и строго ему следовать.
Уникальные обозначения элементам нужно давать, чтобы не держать в голове сложные сущности. Превратить их в что-то простое — буквы или символы. Именно так сущности вроде «яблок» и «апельсинов» и «бананов» во время решения задачи превращаются в обезличенные буквы «я», «а» и «б».
Алгоритм перебора помогает не запутаться, не пропустить комбинации и не посчитать лишние. При правильном выборе алгоритма решение задачи на перебор из пытки превращается вы повторение четких действий, которое неизбежно приведет к правильным результатам.
На словах правила звучат довольно просто. Теперь научимся применять их для решения задач. Начнем с чего-нибудь простого:
Петр должен убраться в комнате, сделать домашнее задание и поработать над личным проектом. Сделать нужно все, но Петр еще не решил, в какой последовательности. Сколькими способами он может выбрать эту последовательность?
В некоторых задачах предстоит работать с числами и цифрами. Они и так записываются коротко и хорошо друг от друга отличаются. Поэтому им, обычно, не нужно придумывать уникальные обозначения и первое правило перебора можно считать автоматически выполненным.
Сколько существует четырехзначных чисел, сумма цифр которых меньше 4?
Будем честны, предыдущие примеры вполне можно было решить без всяких правил, просто наобум перебирая дела и числа. Да, это было бы дольше и не так удобно, но все же возможно. Рассмотрим теперь пример задачи, которую без правил перебора решить, скорее всего, не выйдет.
Ресторан посетили 4 человека. Свои шляпы они отдали швейцару. На выходе невнимательный швейцар раздал шляпы случайным образом. Сколько существует вариантов, когда каждый гость получил чужую шляпу?
Заметили, что самое сложное в таких задачах — как раз таки выполнить два правила: ввести обозначения и придумать алгоритм? Но когда оба пункта правил выполнены, то думать уже не надо. Остается только аккуратно и внимательно перебирать варианты. Из всего этого следует довольно простой вывод:
Если соблюдать правила перебора, то множество комбинаторных задач можно решить полным (прямым) перебором. Скорее всего это будет долго, но правильный ответ все равно будет получен.
Дерево вариантов
В большинстве задач дать элементам уникальные обозначения (выполнить первое правило перебора) не составляет труда. Проблемы возникают на втором шаге — придумывании алгоритма перебора. Порой ну никак не получается нащупать удобный механизм.
Тут главное не отчаиваться, ведь существует универсальный, удобный, наглядный и безотказный механизм, который носит гордое название «дерево вариантов».
Как там говорят? Любой человек должен создать семью, построить дом и посадить дерево? Не знаю, что там насчет первых пунктов, но дерево мы с вами сейчас посадим.
Построение дерева
В первом примере этой статьи мы искали все способы составить расписание на день. Каждое дело обозначили своей буквой: уборка — «У», домашнее задание — «Д», личный проект — «П». Таким образом, задача свелась к поиску всех способов записать друг за другом три буквы: «У», «Д» и «П». Найдем все эти способоы с помощью дерева вариантов.
Рисуем точку. Это семечко нашего дерева, его стартовый или нулевой узел. На первое место в комбинациях мы можем поставить любую из трех букв. Поэтому из стартового узла «вырастают» три ветки первого уровня. Три ветки — три буквы:
Левая ветка у нас отвечает за букву «У». После этой буквы можно записать «Д» или «П», получая комбинации «УД» и «УП». Чтобы отобразить это на дереве вариантов, из узла, на котором завершается «У», рисуем еще две ветки для букв «Д» и «П»:
То же самое происходит и с оставшимимся ветками первого уровня. Из каждой из них тоже вырастают еще по две ветки второго уровня с нужными буквами:
Сейчас на древе у нас изображены все возможные комбинации двух букв (слева направо): «УД», «УП», «ДУ», «ДП», «ПУ», «ПД». Осталось только каждой из комбинаций добавить третью букву. Причем для каждой из них эта буква всего одна.
Единственный способ завершить комбинацию «УД», это добавить к ней букву «П», чтобы получить «УДП». И так со всеми остальными комбинациями. Чтобы отобразить это на дереве, из каждого узла второго уровня вырастает одна ветка третьего уровня с соответствующей буквой:
Дерево вариантов готово! Всего у нас получилось 6 узлов последнего, третьего уровня, а значит есть всего 6 способов записать буквы «У», «Д» и «П». Рассматривая каждую ветку по отдельности от нулевого узла к третьему, мы получаем все возможные комбинации: «УДП», «УПД», «ДУП» и так далее.
Говоря о «деревьях» мы представляем себе растения, которые растут снизу вверх.
Но в математике
Деревья бывают разными
Честно говоря, комбинации из трех букв можно и без деревьев найти. Теперь рассмотрим примеры, которые без деревьев решить будет весьма проблематично.
Для полета на Марс требуется собрать команду. На место командира есть 4 кандидата: . На место инженера 3 кандидата: . На место врача тоже 3 кандидата: .
Проверка показала, что командир психологически совместим с инженерами и и врачами . Командир — с инженерами и всеми врачами. Командир — с инженерами и врачами . Командир — только с инженером и всеми врачами.
Кроме того, инженер психологически несовместим с врачом , инженер — с врачом и инженер — с врачом .
Сколькими способами при этих условиях может быть составлена команда корабля?
Помните задачу Эйлера про шляпы? Не факт, что каждый догадается построить удобную таблицу и перебирать комбинации в порядке возрастания. Ничего страшного! Именно для таких безвыходных ситуаций и нужны универсальные приемы! Попробуем использовать дерево.
Решите задачу Эйлера о шляпах с помощью дерева вариантов.
Проблемы деревьев
Дерево вариантов — мощный универсальный способ решать комбинаторные задачи прямым перебором. Но у него есть и недостаток — оно быстро разрастается в размерах и вам может просто не хватить места, чтобы указать все возможные варианты.
Другой очевидный минус — «универсальный» вовсе не означает «лучший». Зачастую можно придумать свой алгоритм, с которым задачу получится решить гораздо быстрее. Отсюда очевидный вывод:
В бою все средства хороши! Придумывайте разные обозначения и алгоритмы! Используйте таблицы, деревья, ритуальные танцы с бубном, да все что угодно, чтобы упростить себе задачу перебора!
Все зависит только от вашего умения выделить главную суть задачи и подать ее так, чтобы было удобно перебирать варианты.
Прямой перебор в жизни
Может показаться, что прямой перебор это своего рода крайняя мера и последний шаг. Показатель того, что вы не справились с задачей и вынуждены просто перебирать все варианты в поисках нужного.
Но не стоит относится к нему именно так. Как раз наоборот, хорошо, что у нас есть возможность вручную проверить все комбинации. Далеко не все задачи можно раскусить, применив одну-две красивые формулы. В реальной жизни все сложнее. Об этом сейчас и поговорим.
«Бомба» Тьюринга
1941 год, в самом разгаре идет Вторая мировая война — одна из самых страшных войн в истории. Для передачи приказов и другой ценной информации Германия использует шифровальные машины «Энигма».
У этих машин было от 3 до 5 роторов, положение которых определяло печатаемый символ. После каждого введенного символа роторы вращались, из-за чего даже изначально одинаковые буквы в исходном сообщении превращались в разные буквы шифра. Чтобы расшифровать сообщение, нужно было знать, в каком именно стартовом положении были установлены роторы до начала набора.
Первые успехи в расшифровке «Энигмы» получили в польском «Бюро шифров» еще до начала Второй мировой. После начала войны в особняке «Блетчли-парк», секретном центре британской разведки, была запущена программа «Ультра». Ее главной задачей был перехват и расшифровка сообщений, передаваемых с помощью «Энигмы».
«Это моя курочка-ряба, которая несёт золотые яйца, но никогда не кудахчет.»
Лучшие британские математики пытались найти способ быстро расшифровывать сообщения немцев. Основным теоретиком среди них был Алан Тьюринг, «отец» современной информатики.
Итогом этой колоссальной работы стало создание машины «Бомба». Она повторяла поведение сразу 26 одновременно работающих «Энигм». Барабаны, выполняющие роль роторов, непрерывно крутились до тех пор, пока прямым перебором не находилось нужное положение всех роторов, позволяющее расшифровать сообщение.
Другими словами, из-за невозможности перебирать варианты вручную (это слишком медленно), британцы создали машину, которая занималась прямым перебором вместо них. А название она получила из-за характерного тикающего звука, возникающего при повороте барабанов.
Успех британских дешифровщиков стал ценным вкладом в дело победы над нацизмом. Надёжность «Энигмы» не вызывала никаких сомнений у немецких специалистов. До самого конца войны немецкое командование искало причины утечек секретной информации где угодно, но не в том, что шифры успевали оперативно взламывать.
Брутфорс
С повсеместным распространением компьютеров, телефонов и интернета, мы стали хранить в них свою информацию. Для защиты этих данных мы используем пароли — комбинации из символов.
Слабое звено такой защиты состоит в том, что количество возможных паролей конечно, ведь это всего лишь комбинации конечной длины (как правило в районе 10 символолв) из конечного набора элементов (на телефонах это 10 цифр).
А раз паролей не бесконечное количество, то все их можно перебрать и уж какой-то точно подойдет. Делают это с помощью специальных программ, а сам процесс взлома пароля через перебор всех возможных вариантов называется брутфорс, от английского выражения «brute force» (грубая сила).
Скорость брутфорса сильно зависит от длины паролей и количества допустимых символов в них, а также от скорости компьютера, на котором проводится процесс взлома. К тому же, брутфорс не проводится «вслепую». Есть списки самых популярных паролей, которые проверяются в первую очередь.
Так что же мешает взломщику просто перебрать все пароли и взломать вашу почту, аккаунты в социальных сетях и все остальное? В теории, остановить его не может ничего, но есть способы очень, очень сильно замедлить процесс взлома, сделав его невыгодным.
Например, после нескольких неправильных попыток ввода пароля добавляются временные задержки перед следующей попыткой или показывается специальная задача, которую могут выполнить только люди — капча.
Все эти способы не дают перебирать пароли быстро — десятками тысяч в секунду, невероятно растягивают процесс. Зачем кому-то 10 лет взламывать пароль от вашей электронной почты, если вы за это время либо поменяете пароль, либо вообще смените почту?