Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дискретка / Книги / Галиев Ш.И. Математическая логика и теория алгоритмов (2002).pdf
Скачиваний:
2274
Добавлен:
25.02.2016
Размер:
7.49 Mб
Скачать

225

 

Временная

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

Алгоритм

сложность

 

 

 

алгоритма

до ускорения

после ускорения в 10 раз

А1

N

S1

10 S1

А2

N log2 N

S2

10 S2

А3

N2

S3

3,16 S3

А4

N3

S4

2,15 S4

А5

2N

S5

S5+3,3

Из последней таблицы видно, что увеличение быстродействия в 10 раз даёт возможность для алгоритма А1 увеличить размер входа в 10 раз, а для алгоритма А5 увеличение размера входа практически не произошло. Таким образом, чем большую временную сложность имеет алгоритм, тем меньшее улучшение даёт увеличение быстродействия.

§ 3. Полиномиальные алгоритмы и задачи. Класс Р

Считается, что алгоритм – полиномиальный или имеет полиномиальную временную сложность, если существует полином p(x) такой, что на любом входном слове длины n алгоритм завершает вычисления после выполнения не более чем p(n) операций.

Ясно, что, алгоритмы А1 и А2, временные сложности которых равны, например, 0(n3/2) и 0(n2logn) будет считаться полиномиальными, ибо их сложности ограничены полиномами, т.е. имеют порядок не выше, чем 0(n2) и 0(n3) соответственно.

Говорят, что задача разрешима за полиномиальное время или полиномиально разрешима, если для неё существует полиномиальный алгоритм. При этом считается, что задача является «хорошей».

Множество всех задач, для каждой из которых существует полиномиальный алгоритм, называется классом Р.

Среди полиномиальных алгоритмов быстрыми являются линейные алгоритмы, которые обладают сложностью порядка n, где n – размерность входных данных. К линейным алгоритмам относится школьный алгоритм нахождения суммы десятичных чисел, каждое из которых состоит из n цифр. Сложность этого алгоритма – 0(n).

В класс Р кроме линейных задач попадают, например, следующие задачи.

Умножение целых чисел. Школьный метод умножения 2-х n-разрядных чисел имеет временную сложность порядка 0(n2). Существует алгоритм Шёнхаге-Штрассена умножения чисел (заданных в двоичной системе счисления) с меньшей сложностью, именно со сложностью порядка 0(n log2 n log2 log2 n). Подробнее см. ниже.

226

Умножение матриц. Обычный метод имеет порядок сложности 0(n3). Существует более быстрый алгоритм умножения матриц - алгоритм

Штрассена [2] который имеет сложность порядка 0( nlog2 7 ).

Найти кратчайший путь на графе состоящем из n вершин и m рёбер. Сложность алгоритма 0(mn) [28].

Быстрое преобразование Фурье требует 0(n log2 n) арифметических операций [2].

Задача Прима – Краскала – Кэли. Дано n городов. Нужно соединить все города телефонным кабелем так, чтобы общая длина кабеля была минимальной. Эта задача решается с помощью жадного алгоритма сложности 0(nlog2 n) [28].

Нахождение эйлерова цикла в графе с m рёбрами. Алгоритм нахождения эйлерова цикла имеет сложность порядка 0(m), см., например, [22]

Задачи, для которых не существует полиномиального алгоритма, считаются трудно разрешимыми.

Рассмотрим пример определения сложности вычислений (алгоритма) на примерах.

Пусть задано множество S, содержащее n действительных чисел. Требуется найти наибольший и наименьший элементы из S. Положим, что каждое одно сравнение двух любых чисел осуществляется за одинаковое время.

Один из возможных методов состоит в поиске сначала наибольшего элемента из S, а затем – наименьшего. Наибольший элемент можно найти, проводя n-1 сравнений, например по следующему алгоритму.

begin

MAXпроизвольный элемент из S; for все другие элементы х из S do if x>MAX then MAXx;

end.

В результате n-1 сравнений найдётся наибольший элемент. Заметим, что не учитывается время на выборку элемента. Далее начинается поиск наименьшего элемента по аналогичному алгоритму. Если считать эти процедуры независимыми, то вновь потребуется n-1 сравнений. В итоге для нахождения наибольшего и наименьшего элементов из S потребуется 2n-2 сравнений.

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

Стратегия дублирования состоит в следующем. Пусть размер задачи (размер входных данных задачи) равен n. Разобьём задачу на две подзадачи размера n/2 той же структуры, что и исходная задача. Если решения этих задач можно скомбинировать в решение исходной задачи, то получится эффективный алгоритм.

227

Рассмотрим, как стратегия дублирования даёт ускорение для решения предыдущей задачи. Положим, что число элементов множества S является степенью числа 2, т.е. n=2k, для некоторого k, k1.

Реализуем рекурсивный поиск, при котором множество S разбивается последовательно на два подмножества по следующей процедуре MAXMIN.

procedure MAXMIN(S):

1.if S =2 then begin

2.пусть S={a,b};

3.return(MAX(a,b),MIN(a,b))

end else

begin

4.разбить S на два равных подмножества S1 и S2;

5.(max1, min1)MAXMIN(S1);

6.(max2, min2)MAXMIN(S2);

7.return(MAX(max1, max2). MIN(min1, min2))

end

В этой процедуре сравнения происходят только на 3-ем шаге, где сравниваются два элемента множества S из которых оно и состоит, и на шаге 7, где сравниваются max1 с max2 и min1 с min2. Пусть Т(n) – число сравнений элементов множества S. Ясно, что Т(2)=1. Если n>2, то Т(n) – общее число сравнений, произведённых в двух вызовах процедуры MAXMIN (строка 5 и 6), работающих на множествах размера n/2 и ещё два сравнения в строке 7. Таким образом,

 

1,

 

если

n = 2,

(7.1)

Т(n)=

 

+ 2,

если

n > 2.

 

2T(n/2)

 

Решением рекуррентных уравнений (7.1) служит функция Т(n)=(3/2)n-2. Таким образом, вместо 2n-2 сравнений получили (3/2)n-2 сравнений чисел, т.е на (n/2) сравнений меньше.

Рассмотрим второй пример. Пусть требуется умножить два n разрядных двоичных чисел. При традиционном (школьном) алгоритме требуется 0(n2) битовых операций. Применим стратегию дублирования и разобьем числа х и у на две равные части:

х =

a

b

y =

 

 

c

d

Считаем, что n есть степень числа 2. Тогда

xy=(a2n/2+b)(c2n/2+d)=ac2n+(ad+bc)2n/2+bd. (7.2)

228

Равенство (7.2) даёт способ вычисления ху с помощью четырёх умножений (n/2) разрядных чисел и нескольких сложений и сдвигов (умножений на степень числа 2). Можно получить, что вместо 0(n2) битовых операций нужно

0( nlog2( 3 ) ) 0(n1,59) битовых операций. Здесь число разбивалось на два блока. Разбивая эти числа на большее число блоков можно получить, что умножение двух чисел имеет сложность 0(n log2n log2 log2n) для алгоритма Шёнхаге-Штрассена [2].

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

§ 4. NP класс

Наиболее простыми считаются полиномиальные задачи, т.е. задачи класса Р.

Другим, возможно более широким, «сложностным классом» является класс NP. Эта аббревиатура обозначает выражение «разрешимых на Недетерминированной машине Тьюринга за Полиномиальное время». Класс NP стали впервые изучать Эдмонде, Кук и Кири. Оказалось, что многие известные задачи принадлежат к NP классу.

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

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

Недетерминированность лучше всего понять, рассматривая алгоритм, который производит вычисления до тех пор, пока не доходит до места, в котором должен быть сделан выбор из нескольких альтернатив. Детерминированный алгоритм исследовал бы сначала одну альтернативу, а потом вернулся для рассмотрения следующей альтернативы. Недетерминированный алгоритм может исследовать все альтернативы одновременно, «копируя», в сущности, самого себя для каждой альтернативы. Все копии работают независимо. Если копия обнаруживает, что данный путь безрезультатный, то она прекращает выполняться. Если копия находит требуемое решение, она объявляет об этом, и все копии прекращают работать.

229

Определим NP класс как класс задач, которые можно решить недетерминированными алгоритмами, работающими в течение полиномиального времени.

Чтобы доказать, что некоторая задача принадлежит классу NP, достаточно построить недетерминированный алгоритм (алгоритм недетерминированной машины Тьюринга), который решает эту задачу за полиномиальное время.

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

Рассмотрим следующий алгоритм.

begin

v1 1

{Пункт отправления}

S {2,3,…,n}

{Множество вершин которые нужно

Длина пути 0

посетить}

{Общая длина пути}

nv1

{Число пройденных вершин}

{Пусть преемник (vnv) обозначает допустимое, (не содержащее паразитных циклов) множество вершин, в которые можно попасть из vnv}

while преемник (vnv) do begin

vnv-1 ВЫБОР(преемник (vnv)); nvnv+1;

Длина пути Длина пути + длина дуги (vnv-1, vnv) end

if nv=n and Длина пути M then успех else неудача

end

В этом алгоритме рассмотрение каждого варианта, т.е. последовательности соединённых дугами вершин v1, vi2, vi3,…vin требует n шагов. Следовательно, каждая процедура ВЫБОР (иначе каждая копия алгоритма просмотра одного пути) работает не более, чем полиномиальное время, точнее имеет сложность порядка 0(n). Таким образом, задача выяснения существования в ориентированном графе гамильтонового цикла, длина которого меньше или равна M, является NP задачей.

Детерминированная машина Тьюринга является частным случаем недетерминированной машины Тьюринга (которая не имеет копий), поэтому имеем, что P NP.

Вопрос о том, будет ли P=NP является открытой проблемой теории сложности. Широко распространено мнение, что P NP, следовательно,

P NP.

230

Примеры задач из класса NP:

1)выяснение выполнимости формулы логики высказываний, записанной в к.н.ф.;

2)нахождение целочисленных решений системы линейных

уравнений;

3)задача распознавания простого числа;

4)выяснение гамильтоновости графа;

5)задача коммивояжёра;

6)размещение обслуживающих центров (телефон, телевидение, срочные службы) для максимального числа клиентов при минимальном числе центров;

7)оптимальный раскрой (бумага, стальной прокат, отливка), оптимизация маршрутов в воздушном пространстве, инвестиций, станочного парка;

8)составление расписаний, учитывающих определённые условия;

9)оптимальная загрузка ёмкости (рюкзак, поезд, корабль, самолёт) при некоторых условиях;

10)динамическое распределение памяти. Раскроем эту проблему.

Пусть заданы А – множество элементов данных, размер s(a) Z+, Z+={1,2,3,…}, каждого элемента данных а А, время поступления r(a) Z0+,

Z0+={0,1,2,3,…} и время d(a) Z+ окончания работы с элементом данных а А,

положительное целое число D – размер области памяти. Вопрос. Существует ли для множества элементов данных допустимое распределение памяти? Иначе говоря, существует ли такая функция σ: А{1,2,3,…}, что для каждого элемента а А интервал

l(a)=[σ(a), σ(a)+s(a)-1]

содержится в [1, D], причём для любых а, а* А, если l(a)l(a*), то либо d(a)r(a*), либо d(a*)r(a).

В случае, когда размеры всех элементов данных одинаковы, то задача решается за полиномиальное время [10];

11) организация памяти в виде корневого дерева. Задача состоит в следующем [10]. Заданы конечное множество Х, набор С={X1,X2,…,Xn} подмножеств множества Х, положительное целое число K. Вопрос. Существует ли такой набор С={X1*, X2*,…,Xn*} подмножеств множества Х,

n

что Xi Xi* при всех i, 1i n, Xi* \Xi K и существует

i=1

ориентированное корневое дерево Т(х,А), в котором элементы каждого из подмножеств Xi*, 1i n, образуют ориентированный путь?

12) достаточность числа регистров для реализации циклов. Задача состоит в следующем. Заданы множество V параметров циклов, длина цикла

N Z+, для каждого параметра v начальное время s(v) Z0+ и

продолжительность l(v) Z+, целое положительное число K. Вопрос. Достаточно ли K регистров для запоминания параметров циклов? Иными