Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кр одмита.doc
Скачиваний:
180
Добавлен:
24.02.2016
Размер:
6.17 Mб
Скачать

8.2. Особенности оптимизационных комбинаторных задач

Примерами оптимизационных комбинаторных задач, решение которых предполагает комбинаторный поиск, являются рассмотренные нами в предыдущих разделах поиск наибольшего независимого и наименьшего доминирующего множеств, раскраска графа.

В отличие от задач традиционной математики, где решение получается с помощью целенаправленной вычислительной процедуры, однозначно ведущей к цели, решение комбинаторной задачи сводится зачастую к полному перебору различных вариантов. Перебираются и испытываются конструкции определенного вида, среди которых должно находиться решение задачи. Как только выясняется, что очередная конструкция является решением, процесс поиска решения можно считать завершенным.

В традиционной математике трудоемкость задачи обычно не очень сильно зависит от размера области возможных решений, в то время как для комбинаторных задач эта зависимость весьма велика.

Комбинаторные задачи характерны еще тем, что множество, среди элементов которого отыскивается решение, всегда конечно. Реализовав полный перебор, либо найдем решение, либо убедимся в том, что решения нет. Таким образом, всякая подобная задача может быть решена за конечное время. Однако это не значит, что она может быть решена за практически приемлемое время даже с помощью самой быстродействующей вычислительной машины.

8.3. Вычислительная сложность

Трудоемкость алгоритма, или временнáя сложность, т. е. время, затрачиваемое на выполнение алгоритма, оценивается числом условных элементарных операций, которые необходимо выполнить при решении задачи. Естественно, эта величина зависит от объема исходных данных, который оценивается некоторым параметром. Например, для графа это может быть число вершин или число ребер. Трудоемкость алгоритма, таким образом, можно оценить некоторой функцией f(n), где п – натуральное число, выражающее объем исходных данных.

Принято писать f(n) = O(g(n)), где g(n)  некоторая конкретная функция от n, если найдется такая константа с, что f(n)  сg(n) для любого n  0. При этом употребляют такие выражения: «трудоемкость алгоритма есть O(g(n))» или «алгоритм решает задачу за время O(g(n))». Если трудоемкость не зависит от объема исходных данных, то для ее обозначения используется символ О(1). Алгоритм трудоемкости О(п) называют линейным. Алгоритм трудоемкости О(пb), где b – константа (возможно, дробная), называется полиномиальным. Если g(n) является показательной функцией, например 2п, то говорят, что алгоритм обладает неполиномиальной, или экспоненциальной, сложностью.

Оценка трудоемкости алгоритма позволяет судить о том, как влияет быстродействие вычислительной машины на время выполнения алгоритма. Пусть имеется пять алгоритмов, трудоемкость которых соответственно п, n logn, п2, п3 и 2п. Пусть условная элементарная операция, которая является единицей измерения трудоемкости алгоритма, выполняется за одну миллисекунду. В табл. 8.1, показано, какого размера задачи могут быть решены каждым из этих алгоритмов за одну секунду, одну минуту и один час. Из этой таблицы видно, например, что за одну минуту алгоритм с трудоемкостью п2 решает задачу в шесть раз большую, чем алгоритм с трудоемкостью п3.

Следует, однако, иметь в виду, что трудоемкость, выражаемая большей степенью полинома, может иметь меньший множитель с из приведенного выше неравенства f(n)  сg(n). Точно так же сложность алгоритма, которая носит экспоненциальный характер, может иметь множитель, меньший, чем у полиномиальной сложности. При разработке компьютерных программ для решения практических задач важно знать, при каких значениях параметра п время выполнения экспоненциального алгоритма оказывается меньше, чем время выполнения полиномиального алгоритма, решающего ту же задачу.

Таблица 8.1

Связь трудоемкости алгоритма с максимальным размером

задачи, решаемой за единицу времени

Временнáя

Максимальный размер задачи

сложность

1 с

1 мин

1 ч

п

1000

6  104

3,6  106

п logn

140

4893

2,0  105

n2

31

244

1897

n3

10

39

153

2n

9

15

21

Для очень многих практических комбинаторных задач существуют алгоритмы только экспоненциальной трудоемкости. Может показаться, что с совершенствованием вычислительной техники и ростом быстродействия вычислительных машин проблема трудоемкости ослабевает. Однако данные, приведенные в табл. 8.2, говорят, что это не так. Пусть следующее поколение вычислительных машин будет иметь быстродействие, в десять раз большее, чем у современных вычислительных машин. В табл. 8.2 показано, как благодаря увеличению быстродействия возрастут размеры задач, которые могут быть решены за некоторую фиксированную единицу времени. Задачи достаточно большого размера, решаемые только алгоритмами экспоненциальной трудоемкости, вообще не могут быть решены за практически приемлемое время, даже если надеяться на существенное увеличение быстродействия вычислительных машин в будущем.

Таблица 8.2

Связь размера задачи, решаемой за заданное время,

с быстродействием вычислительной машины

Временнáя

Максимальный размер задачи

сложность

до ускорения

после ускорения

п

s1

10 s1

п logn

s2

 10 s2

n2

s3

3,16 s3

n3

s4

2,15 s4

2n

s5

s5  3,3

Иногда удается найти способы сокращения перебора благодаря некоторым особенностям конкретных исходных данных.

Другой путь выхода из такого положения – использование приближенных методов. Для практических задач не всегда требуется получать точное решение. Часто достаточно иметь решение, близкое к оптимальному. Пример приближенного метода рассмотрен нами ранее при решении задачи раскраски графа.