|
| |||
|
|
Двойной счёт Очередной параграф, довольно простой, почти закрывающая тему элементарной комбинаторики в этой главе (к комбинаторике я буду возвращаться в дальнейшем многократно, но только уже когда будет введены понятия анализа и алгебры). Читать как всегда лучше в pdf, для кармы будет полезно помогать на GitHub.
Напомню, что в графе степенью вершины Теорема. Пусть Доказательство. Мы можем пересчитать все рёбра графа двумя способами: собственно, пересчитывая сами рёбра (получим в этом случае Это элементарное доказательство является простейшим примером доказательства методом двойного счёта. Приём этот выглядит всегда одинаково: мы берём некоторый набор объектов и считаем его двумя разными способами, получая в итоге одно и то же значение, но записанное в разном виде. По большому счёту рекурсивные формулы для вычисления числа сочетаний, чисел Белла и чисел Стирлинга, а так же формулы их сумм, доказывались нами именно методом двойного счёта, только мы не произносили этого слова. Остаток этого параграфа мы посвятим разбору ещё нескольких подобных примеров. Теорема. Доказательство. Пусть у нас имеется Следствие. Теорема. Доказательство. Левую часть можно интерпретировать как количество способов выбрать различные подмножества Теорема. Доказательство. Справа, как мы увидели в конце прошлого параграфа, перечислено количество сюръекций Определение. Граф называется связным, если в нём существует путь между любыми двумя вершинами. Определение. Деревом называется связный граф без циклов. Деревья часто применяются в компьютерных системах поиска. Самый распространённый вариант — это двоичные деревья поиска, которые представляют собой следующую структуру: каждая вершина дерева обладает некоторым значением и, возможно, тремя гранями, называемых ветвями. Одна ветвь ведёт в направлении корня, другая ветвь, называемая левой, ведёт ко всем вершинам со значениями, меньшими чем текущее, а вторая ветвь, называемая правой, ведёт к большим значениям. Если предположить, что значения — это строки, то их порядок может восприниматься как алфавитный. Пример такого бинарного дерева поиска представлен на рисунке 3.11. Предположим, что в дереве на рисунке 3.11 так же в каждом узле дерева записан телефон, и что мы захотели найти телефон Ольги. Если бы мы просматривали все телефоны подряд, то в случае их упорядоченности по алфавиту, прежде чем мы наткнулись бы на Олин телефон, нам пришлось бы проверить шесть записей. Однако, вместо этого мы могли бы искать телефон в дереве, двигаясь от корня: вначале мы увидели бы, что имя "Ольга" должно идти после имени Николай, что значит, что мы должны искать по правой ветви от корня, где мы встречаем имя Роман. Ольга идёт раньше Романа по алфавиту, поэтому мы продолжаем искать её в левой ветви, где и находим её телефон. Итого нам потребовалось три шага поиска: вдвое быстрее чем при последовательном переборе. Упражнение. Пусть мы ищем телефон Фиофанта. Покажите, что при последовательном поиске нам потребовалось бы 7 шагов, чтобы убедиться, что такого телефона нет, а при поиске в дереве всего 3 шага. Упражнение. Пусть у нас теперь имеется дерево, в котором записано 2147483647 телефонных номеров. Например, это может база данных ФСБ или ещё какая. Покажите, что используя бинарное дерево поиска, мы можем найти любой телефон (или убедиться, что его нет в базе) максимум за 31 шаг. Последнее упражнение показывает, что использование деревьев может здорово упростить поиск информации (зачастую ускорение получается в миллионы раз). Собственно очень похожим образом устроены почти все базы данных, и без деревьев не было бы ни компании Гугл, ни, наверное, вообще компьютерной техники в современном её виде. Чтобы уметь анализировать скорость работы алгоритмов, нам прежде всего необходимо уметь пересчитывать все деревья. Бинарные деревья — это в общем-то частный случай дерева. Как перечислить все возможные деревья поиска мы поймём позже в нашем курсе (мы изучим общие подходы), а пока что же мы перечислим просто все возможные деревья с
Если изменить любое из этих условий, то формула для количества деревьев будет уже совершенно другой, но пока мы не будем рассматривать эти случаи.
Теорема. Существует Доказательство. Подсчитаем количество функций Если упорядочить по возрастанию элементы Надо теперь показать, что и для каждого дерева мы можем задать функцию. Это делается в полной аналогии: вначале выбираем в дереве условные «начало» и «конец» (внимание!) и находим путь от начала к концу. Вершины этого пути задают множество Остаётся лишь заметить, что заданная конструкция даёт нам не просто дерево, а дерево с выбранными «началом» и «концом». У дерева с |
|||||||||||||||||||||||||