Комбинаторная математика является старой дисциплиной. Она получила свое наименование в 1666 г. от Лейбница в его "Dissertation de Arte Combinatori". Комбинаторные алгоритмы с их акцентом на разработку, анализ и реализацию практических алгоритмов являются продуктом века вычислительных машин.
Предмет теории комбинаторных алгоритмов - вычисления на дискретных математических структурах. Это новое направление исследований. Лишь в последние несколько лет из наборов искусных приемов и разрозненных алгоритмов сформировалась система знаний о разработке, реализации и анализе алгоритмов.
Комбинаторные вычисления находятся в таком же отношении к комбинаторной математике (дискретной, конечной математике), как численные методы анализа - к анализу. Комбинаторные вычисления развиваются в следующем направлении:
В отличие от некоторых других разделов математики, комбинаторные вычисления не имеют "ядра", то есть некоторого количества "фундаментальных теорем", составляющих суть предмета, из которых выводится большинство результатов. Сначала может показаться, что в целом эта область состоит из наборов специальных методов и хитрых приемов. Однако после того, как было исследовано достаточно много комбинаторных алгоритмов, стали вырисовываться некоторые общие принципы. Именно эти принципы делают комбинаторные вычисления связной областью знаний и позволяют изложить ее в систематизированном виде.
Чрезвычайно важной проблемой в комбинаторных вычислениях является задача эффективного представления объектов, подлежащих обработке. Она возникает потому, что обычно имеется много возможных способов представления сложных объектов более простыми структурами, которые можно заложить в языки программирования, но не все такие представления в одинаковой степени эффективны с точки зрения времени и памяти. Более того, идеальное представление зависит от вида производимых операций.
Приведем примеры, в которых задаются весьма специфические операции над целыми. Целые определяются как данные простейшего типа почти во всех вычислительных устройствах и языках программирования. Таким образом, проблема представления, как правило, не возникает. Имеющееся представление почти всегда наилучшее. Однако существуют некоторые заслуживающие внимания исключения, когда выгодно или даже необходимо использовать представление целых в вычислительном устройстве иным способом. Эти исключения появляются в следующих случаях:
Проблемы кодов, сохраняющих разности, касаются случаев 2 и 3.
В задачах распознавания образов и классификации для решения вопроса, будут ли
два
Одной из причин быстрого прогресса комбинаторных вычислений является
усиление внимания к исследованию
Как можно строго определить, возможно, бесконечный,
Задача. Имеется $$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}$$.
Рассматриваемые алгоритмы можно представить в форме
(рис 1.1) Дерево решений для задачи о фальшивой монете с четырьмя монетамиКорень дерева на рисунке изображен полой окружностью и помечен отношением $$1:2$$. Это означает, что алгоритм начинает работу сравнением весов монет с номерами 1 и 2. Три исходящие из корня ветви ведут к поддеревьям, определяющим продолжение работы алгоритма после каждого из трех возможных исходов первого сравнения. Окружности, залитые черной краской, называются листьями дерева и означают, что работа алгоритма заканчивается. Метки соответствуют исходам: "1л" - монета 1 легкая, "1т" - монета 1 тяжелая, "н" - все монеты настоящие. Непомеченная вершина дерева означает, что при наших предположениях этот случай возникнуть не может.
Алгоритм, приведенный на рис. 1.1, требует двух сравнений в одних случаях и трех - в других. Скажем, что он требует "трех сравнений в худшем случае". Обычно важно знать, сколько работы требует алгоритм в среднем, однако для этого требуется задать вероятности различных исходов. Если предположим, что все восемь исходов 1л, 1т, 2л, 2т, 3л, 3т, 4л, 4т, - равновероятны, то тогда этот алгоритм требует в среднем 7/3 сравнений.
На одну чашку весов можем положить больше одной монеты. Например, можно начать сравнения, положив на одну чашку весов монеты 1 и 2, а на другую - монеты 3 и 4 (рис. 1.2).
(рис 1.2) Корень другого дерева решений для задачи о четырех монетахЕсли посчастливится, задачу можно решить за одно сравнение - это может
произойти, когда все монеты настоящие. Независимо от того, как дополняется это дерево
решений, в худшем случае задача все равно потребует тех же трех сравнений, поскольку
единственное тернарное решение не может идентифицировать один из четырех
исходов, которые возможны на ветви, помеченной символом " $$<$$ ", так же как и один из четырех исходов на ветви, помеченной символом " $$>$$ ". К тому же, независимо от того, как дополняется это
Используя монету 0, о которой известно, что она настоящая, можно получить приведенное на рис. 1.3 дерево решений (полное двухъярусное тернарное дерево), которое и в худшем, и в среднем случае требует двух сравнений.
(рис 1.3) Оптимальное дерево решений для задачи о четырех монетахРассматриваемый
Поскольку в задаче о четырех монетах требуется различить девять возможных исходов, любое дерево решений для этой задачи должно иметь, по крайней мере, девять листьев и, следовательно, не менее двух ярусов. Поэтому дерево на рис.1.3 является оптимальным и для худшего случая, и для среднего. Существуют ли другие оптимальные деревья? Для ответа на этот вопрос нужно рассмотреть множество всех деревьев решений для задачи о четырех монетах. Попытаемся исключить из дальнейшего рассмотрения какую-либо часть этого множества. Прежде всего видно, что путем любой перестановки множества $$\{ 1,2,\ldots,n\}$$ сомнительных монет из одного дерева, приведенного на рис.1.3, можно получить другие оптимальные деревья. Все они будут изоморфны дереву на рис.1.3. Исходя из этого, уточним постановку задачи и будем интересоваться попарно неизоморфными деревьями.
Рассмотрим затем, существует ли оптимальное дерево среди тех, у которых в
корне не используется монета с номером 0. При таком ограничении в корне дерева
можно сделать только два различных сравнения, а именно $$1:2$$ и $$1,2:3,4$$.
Рассмотрим разбиение исходов по трем ветвям, выходящим из корня, как показано
на рис.1.2. Для получения такого, как на рис.1.3, полного двухъярусного
Наконец, рассмотрим те деревья решений, которые используют монету 0 в корне. В этом случае видно, что в корне фактически возможны только два сравнения: $$(0:1)$$ и $$0,1:2,3$$. Для первого сравнения набор исходов будет (1, 7, 1), в связи с чем все алгоритмы, начинающиеся таким способом, для нас непригодны. Набор исходов (3, 3, 3) приводит к оптимальному дереву, показанному на рис.1.3. Аналогичным образом устанавливается, что для оптимального дерева сравнения в первом от корня ярусе определяются единственным образом. Отсюда заключаем, что для задачи о четырех монетах фактически существует только одно оптимальное дерево.
Когда используемые идеи анализа задачи о четырех монетах переносятся на произвольный случай, в некоторой степени все идеи обобщаются на случай любого числа монет. Однако некоторые из них не имеют практического значения, когда $$n$$ значительно больше четырех. В принципе, оптимальные деревья решений всегда можно найти путем систематического поиска в множестве деревьев, поскольку для любого заданного $$n$$ в качестве кандидатов требуется рассмотреть лишь конечное число деревьев решений. В лекции обсуждается техника исчерпывающего поиска в таких конечных множествах. Однако, если даже поиск организован разумно и рассматриваются лишь существенно различные (не изоморфные) деревья, эта процедура не может служить практическим способом отыскания оптимальных деревьев решений. С ростом $$n$$ число деревьев растет экспоненциально, и поэтому техника исчерпывающего поиска имеет практическое значение только для малых значений $$n$$.
Поскольку число листьев в дереве решений должно быть по крайней мере таким же, как и число возможных исходов задачи ( $$2n + 1$$ для задачи о монетах), сразу же можно получить нижнюю оценку необходимого числа сравнений (или, что эквивалентно, верхнюю оценку числа монет для данного сравнения).
В процессе разработки и реализации алгоритма естественным образом раскрываются некоторые его свойства. По мере того как алгоритмы становятся все более и более сложными, все менее и менее вероятно, что их важные свойства проявятся на стадиях разработки и реализации. Как правило, некоторые важные аспекты поведения алгоритма, такие как его корректность, необходимое число операций или объем памяти, определить трудно. Поэтому обычно глубокое понимание нового алгоритма предваряется очень длинной стадией его анализа.
Из-за трудностей анализа им зачастую просто пренебрегают. Вместо этого программа выполняется для того, чтобы увидеть, что получается (например, измеряется время работы). Такой подход можно признать удовлетворительным, если есть основание полагать, что тестовые задачи достаточно хорошо характеризуют работу алгоритма в общем случае; если же это не так, то описанный подход даст мало ценной информации. Даже если тест прекрасно характеризует работу алгоритма, он никогда не даст ответ на придирчивый вопрос, могут ли существовать лучшие алгоритмы для решения той же самой задачи. Проблему оптимальности алгоритма можно решить только путем его анализа.
В анализе алгоритмов существуют две фундаментальные проблемы:
Фундаментальная разница между этими двумя вопросами состоит в подходе к
ответу на них. В первом случае алгоритм задан и заключения выводятся путем изучения
свойств, присущих ему. Во втором случае задается проблема и точно определяется
структура алгоритма. Заключения выводятся на основе изучения существа проблемы
по отношению к данному
Программа 1.Поиск фальшивой монеты
//Монета ищется простым перебором.
//Алгоритм реализован на языке программирования Turbo-C++.
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
int main() {
clrscr();
int k, n, flag = -1;
int *mas;
printf("Введите число монет: ");
scanf("%i", n);
mas = (int*)malloc(sizeof(n));
randomize();
k = random (10) + 1;
for (int i = 0; i < n; i++) {
mas[i] = k;
}
for (i = k; i == k; i = random (20));
mas[random (n)] = i;
printf("Масса монет: ");
for (i = 0; i < n; i++) {
printf("%5i", mas[i]);
if (mas[i] != k) {
flag = i;
}
}
printf("\nФальшивая монета под номером %i ее вес %i", flag+1,
mas[flag]);
getch();
free(mas);
return 0;
}
Комбинаторная математика является старой дисциплиной. Она получила свое наименование в 1666 г. от Лейбница в его "Dissertation de Arte Combinatori". Комбинаторные алгоритмы с их акцентом на разработку, анализ и реализацию практических алгоритмов являются продуктом века вычислительных машин.
Предмет теории комбинаторных алгоритмов - вычисления на дискретных математических структурах. Это новое направление исследований. Лишь в последние несколько лет из наборов искусных приемов и разрозненных алгоритмов сформировалась система знаний о разработке, реализации и анализе алгоритмов.
Комбинаторные вычисления находятся в таком же отношении к комбинаторной математике (дискретной, конечной математике), как численные методы анализа - к анализу. Комбинаторные вычисления развиваются в следующем направлении:
В отличие от некоторых других разделов математики, комбинаторные вычисления не имеют "ядра", то есть некоторого количества "фундаментальных теорем", составляющих суть предмета, из которых выводится большинство результатов. Сначала может показаться, что в целом эта область состоит из наборов специальных методов и хитрых приемов. Однако после того, как было исследовано достаточно много комбинаторных алгоритмов, стали вырисовываться некоторые общие принципы. Именно эти принципы делают комбинаторные вычисления связной областью знаний и позволяют изложить ее в систематизированном виде.
Чрезвычайно важной проблемой в комбинаторных вычислениях является задача эффективного представления объектов, подлежащих обработке. Она возникает потому, что обычно имеется много возможных способов представления сложных объектов более простыми структурами, которые можно заложить в языки программирования, но не все такие представления в одинаковой степени эффективны с точки зрения времени и памяти. Более того, идеальное представление зависит от вида производимых операций.
Приведем примеры, в которых задаются весьма специфические операции над целыми. Целые определяются как данные простейшего типа почти во всех вычислительных устройствах и языках программирования. Таким образом, проблема представления, как правило, не возникает. Имеющееся представление почти всегда наилучшее. Однако существуют некоторые заслуживающие внимания исключения, когда выгодно или даже необходимо использовать представление целых в вычислительном устройстве иным способом. Эти исключения появляются в следующих случаях:
Проблемы кодов, сохраняющих разности, касаются случаев 2 и 3.
В задачах распознавания образов и классификации для решения вопроса, будут ли
два
Одной из причин быстрого прогресса комбинаторных вычислений является
усиление внимания к исследованию
Как можно строго определить, возможно, бесконечный,
Задача. Имеется $$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}$$.
Рассматриваемые алгоритмы можно представить в форме
(рис 1.1) Дерево решений для задачи о фальшивой монете с четырьмя монетамиКорень дерева на рисунке изображен полой окружностью и помечен отношением $$1:2$$. Это означает, что алгоритм начинает работу сравнением весов монет с номерами 1 и 2. Три исходящие из корня ветви ведут к поддеревьям, определяющим продолжение работы алгоритма после каждого из трех возможных исходов первого сравнения. Окружности, залитые черной краской, называются листьями дерева и означают, что работа алгоритма заканчивается. Метки соответствуют исходам: "1л" - монета 1 легкая, "1т" - монета 1 тяжелая, "н" - все монеты настоящие. Непомеченная вершина дерева означает, что при наших предположениях этот случай возникнуть не может.
Алгоритм, приведенный на рис. 1.1, требует двух сравнений в одних случаях и трех - в других. Скажем, что он требует "трех сравнений в худшем случае". Обычно важно знать, сколько работы требует алгоритм в среднем, однако для этого требуется задать вероятности различных исходов. Если предположим, что все восемь исходов 1л, 1т, 2л, 2т, 3л, 3т, 4л, 4т, - равновероятны, то тогда этот алгоритм требует в среднем 7/3 сравнений.
На одну чашку весов можем положить больше одной монеты. Например, можно начать сравнения, положив на одну чашку весов монеты 1 и 2, а на другую - монеты 3 и 4 (рис. 1.2).
(рис 1.2) Корень другого дерева решений для задачи о четырех монетахЕсли посчастливится, задачу можно решить за одно сравнение - это может
произойти, когда все монеты настоящие. Независимо от того, как дополняется это дерево
решений, в худшем случае задача все равно потребует тех же трех сравнений, поскольку
единственное тернарное решение не может идентифицировать один из четырех
исходов, которые возможны на ветви, помеченной символом " $$<$$ ", так же как и один из четырех исходов на ветви, помеченной символом " $$>$$ ". К тому же, независимо от того, как дополняется это
Используя монету 0, о которой известно, что она настоящая, можно получить приведенное на рис. 1.3 дерево решений (полное двухъярусное тернарное дерево), которое и в худшем, и в среднем случае требует двух сравнений.
(рис 1.3) Оптимальное дерево решений для задачи о четырех монетахРассматриваемый
Поскольку в задаче о четырех монетах требуется различить девять возможных исходов, любое дерево решений для этой задачи должно иметь, по крайней мере, девять листьев и, следовательно, не менее двух ярусов. Поэтому дерево на рис.1.3 является оптимальным и для худшего случая, и для среднего. Существуют ли другие оптимальные деревья? Для ответа на этот вопрос нужно рассмотреть множество всех деревьев решений для задачи о четырех монетах. Попытаемся исключить из дальнейшего рассмотрения какую-либо часть этого множества. Прежде всего видно, что путем любой перестановки множества $$\{ 1,2,\ldots,n\}$$ сомнительных монет из одного дерева, приведенного на рис.1.3, можно получить другие оптимальные деревья. Все они будут изоморфны дереву на рис.1.3. Исходя из этого, уточним постановку задачи и будем интересоваться попарно неизоморфными деревьями.
Рассмотрим затем, существует ли оптимальное дерево среди тех, у которых в
корне не используется монета с номером 0. При таком ограничении в корне дерева
можно сделать только два различных сравнения, а именно $$1:2$$ и $$1,2:3,4$$.
Рассмотрим разбиение исходов по трем ветвям, выходящим из корня, как показано
на рис.1.2. Для получения такого, как на рис.1.3, полного двухъярусного
Наконец, рассмотрим те деревья решений, которые используют монету 0 в корне. В этом случае видно, что в корне фактически возможны только два сравнения: $$(0:1)$$ и $$0,1:2,3$$. Для первого сравнения набор исходов будет (1, 7, 1), в связи с чем все алгоритмы, начинающиеся таким способом, для нас непригодны. Набор исходов (3, 3, 3) приводит к оптимальному дереву, показанному на рис.1.3. Аналогичным образом устанавливается, что для оптимального дерева сравнения в первом от корня ярусе определяются единственным образом. Отсюда заключаем, что для задачи о четырех монетах фактически существует только одно оптимальное дерево.
Когда используемые идеи анализа задачи о четырех монетах переносятся на произвольный случай, в некоторой степени все идеи обобщаются на случай любого числа монет. Однако некоторые из них не имеют практического значения, когда $$n$$ значительно больше четырех. В принципе, оптимальные деревья решений всегда можно найти путем систематического поиска в множестве деревьев, поскольку для любого заданного $$n$$ в качестве кандидатов требуется рассмотреть лишь конечное число деревьев решений. В лекции обсуждается техника исчерпывающего поиска в таких конечных множествах. Однако, если даже поиск организован разумно и рассматриваются лишь существенно различные (не изоморфные) деревья, эта процедура не может служить практическим способом отыскания оптимальных деревьев решений. С ростом $$n$$ число деревьев растет экспоненциально, и поэтому техника исчерпывающего поиска имеет практическое значение только для малых значений $$n$$.
Поскольку число листьев в дереве решений должно быть по крайней мере таким же, как и число возможных исходов задачи ( $$2n + 1$$ для задачи о монетах), сразу же можно получить нижнюю оценку необходимого числа сравнений (или, что эквивалентно, верхнюю оценку числа монет для данного сравнения).
В процессе разработки и реализации алгоритма естественным образом раскрываются некоторые его свойства. По мере того как алгоритмы становятся все более и более сложными, все менее и менее вероятно, что их важные свойства проявятся на стадиях разработки и реализации. Как правило, некоторые важные аспекты поведения алгоритма, такие как его корректность, необходимое число операций или объем памяти, определить трудно. Поэтому обычно глубокое понимание нового алгоритма предваряется очень длинной стадией его анализа.
Из-за трудностей анализа им зачастую просто пренебрегают. Вместо этого программа выполняется для того, чтобы увидеть, что получается (например, измеряется время работы). Такой подход можно признать удовлетворительным, если есть основание полагать, что тестовые задачи достаточно хорошо характеризуют работу алгоритма в общем случае; если же это не так, то описанный подход даст мало ценной информации. Даже если тест прекрасно характеризует работу алгоритма, он никогда не даст ответ на придирчивый вопрос, могут ли существовать лучшие алгоритмы для решения той же самой задачи. Проблему оптимальности алгоритма можно решить только путем его анализа.
В анализе алгоритмов существуют две фундаментальные проблемы:
Фундаментальная разница между этими двумя вопросами состоит в подходе к
ответу на них. В первом случае алгоритм задан и заключения выводятся путем изучения
свойств, присущих ему. Во втором случае задается проблема и точно определяется
структура алгоритма. Заключения выводятся на основе изучения существа проблемы
по отношению к данному
Программа 1.Поиск фальшивой монеты
//Монета ищется простым перебором.
//Алгоритм реализован на языке программирования Turbo-C++.
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
int main() {
clrscr();
int k, n, flag = -1;
int *mas;
printf("Введите число монет: ");
scanf("%i", n);
mas = (int*)malloc(sizeof(n));
randomize();
k = random (10) + 1;
for (int i = 0; i < n; i++) {
mas[i] = k;
}
for (i = k; i == k; i = random (20));
mas[random (n)] = i;
printf("Масса монет: ");
for (i = 0; i < n; i++) {
printf("%5i", mas[i]);
if (mas[i] != k) {
flag = i;
}
}
printf("\nФальшивая монета под номером %i ее вес %i", flag+1,
mas[flag]);
getch();
free(mas);
return 0;
}
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.