Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив WinRAR / Книги, блеать / Абрамов С.А. Вычислительная сложность алгоритмов (конспект лекций)

.pdf
Скачиваний:
185
Добавлен:
20.04.2015
Размер:
1.06 Mб
Скачать

Московский Государственный Университет имени М. В. Ломоносова

Факультет Вычислительной Математики и Кибернетики

Кафедра Алгоритмических Языков

НЕ ЯВЛЯЕТСЯ ОФИЦИАЛЬНЫМ УЧЕБНЫМ ПОСОБИЕМ

Вычислительная сложность алгоритмов

(V семестр)

лектор профессор С. А. Абрамов

(составлено по конспекту лекций за осенний семестр 2005/06 учебного года)

Москва 2005

Содержание

 

Сложность алгоритмов как функций числовых аргументов.........................................................

3

Сложность в среднем.........................................................................................................................

9

Нижняя граница сложности алгоритмов некоторых классов. Оптимальные алгоритмы.........

24

Битовая сложность...........................................................................................................................

30

Об одном классе рекуррентных соотношений («разделяй и властвуй»)....................................

37

Сводимость.......................................................................................................................................

48

Задачи................................................................................................................................................

56

2

Сложность алгоритмов как функций числовых аргументов

А — алгоритм: на вход x, результат — y.

CAT (x) — временные затраты (цена)

CAS (x) — пространственные затраты (по памяти)

x — размер входа: x0

x — пол: округление в меньшую сторону

x — потолок: округление в большую сторону

Примеры

3,14 = 3; 3,14 = −4

3,14 = −3 ; 3,14 = 4

Рассмотрим следующие алгоритмы:

1.(MM) Перемножение 2-х квадратных матриц порядка n: требуется n3 умножений.

2.(TD) Проверка на простоту числа n — пробные деления на 2, 3, …, n : требуется от 1 до n 1 делений.

3. (I) Сортировка простыми вставками массива из n элементов: требуется от n 1 до

n(n 1) сравнений. 2

Определение. Временной сложностью (сложностью в худшем случае по времени) алгоритма

A называется функция от размера входа n следующего вида: T (n) = max CT (x) .

A x=n A

Определение. Пространственной сложностью (сложностью в худшем случае по памяти)

алгоритма A называется функция от размера входа n следующего вида: S A (n) = max CAS (x) .

 

 

 

 

 

 

 

 

 

 

 

 

x

=n

 

 

Замечание. Если алгоритм A представляет собой суперпозицию двух алгоритмов U и V:

A =U V , то вообще говоря, TA (n) TU (n) +TV (n) .

 

 

 

 

 

 

 

 

Примеры.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TMM (n) = n3 ; TI (n) =

n(n 1)

; TTD (n) n 1

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рассмотрим TTD (n) при конкретных значениях n:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

111

112

113

 

114

115

 

116

117

118

119

 

120

 

TTD (n)

2

1

9

 

1

4

 

1

2

1

6

 

 

1

 

Такое поведение сложности связано с неверным выбором размера входа.

STD (n) = O(1) ; SMM (n) = n2 + O(1)

Рассмотрим детальнее алгоритм сортировки простыми вставками (I). Имеется массив из n элементов: x1 , x2 ,..., xn . Считая на i-м шаге, что первые (i 1) элементов упорядочены и

3

нужно поставить (i +1) -й элемент на место. Для этого представляются 2 возможности: 1) пока (i +1) -й элемент больше соседнего левого, менять их местами; 2) начиная с первого элемента и до i-го, сравнивать каждый элемент с (i +1) -м, для определения правильного места (i +1) -го элемента, после чего начать перестановки, аналогичные пункту 1, чтобы (i +1) -й элемент встал на нужное место. Оказывается, что сложности в этих двух случаях

будут различны: T

(n) = n(n 1) ; T (n) =

(n 1)(n + 2)

. Тем не менееT

(n) = O(n2 ) , но

 

 

 

 

 

I1

 

 

 

I1

2

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

(n) = n2 + O(n) , а T

I2

(n) =

n2

+O(n) .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I1

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Определение. Функции

 

f (n) и g(n) являются функциями одного порядка, если найдутся

такие числа c1,c2 > 0 и такое N > 0 , что n > N

верно c1

 

g(n)

 

<

 

f (n)

 

< c2

 

g(n)

 

.

 

 

 

 

 

 

Обозначение: f (n)

 

g(n); f (n) = Θ g(n)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пример. TI (n) = Θ(n)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Замечание. Ограничение n > N в определении не существенно и от него можно отказаться, рассматривая n > 0 . Действительно, пусть условие c1 g(n) < f (n) < c2 g(n) выполняется для всех n, больших некоторого N. Обозначим

 

 

 

m = min

 

 

f (n)

 

, c1′ = min{c1, m}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

g(n)

 

 

 

 

 

 

 

 

 

 

 

1nN

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

M = max

 

 

 

f (n)

 

 

 

, c2′ = min{c2 , M}.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

g(n)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1nN

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

g(n)

 

<

 

 

f (n)

 

 

 

 

g(n)

 

для всех n > 0 .

 

 

 

 

 

 

 

Тогда для таких c1

и c2 будет верно c1

 

 

 

 

 

< c2

 

 

Определение.

f (n) = Ω(g(n)) c, N > 0 :

 

f (n)

 

> c

 

g(n)

 

, n > N .

 

 

 

 

Определение.

Оценка

f (n) = O(g(n))

 

называется

 

 

 

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

подпоследовательность {nk } такую, что для функций ϕ(k) = f (nk ) и ψ (k) = g(nk ) выполнено

ϕ(k) = Ω(ψ (k)) или ϕ(k) = Θ(ψ (k)).

 

Определение. Оценка

f (n) = O(g(n)) называется точной, если

f (n) = O(g(n)) верно, а

f (n) = o(g(n)) — не верно.

 

Определение. Функция

f (n) , определённая для достаточно

больших n, называется

функцией, определённой финально.

Рассмотрим алгоритм построения пересечения 2-х выпуклых многоугольников (алгоритм Шеймоса (SH)). Имеются два выпуклых многоугольника, заданные координатами своих вершин на плоскости: P1, P2 , ... , Pl и Q1, Q2 , ... , Qm . Упорядочим массивы вершин по

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

4

Используя указанный алгоритм можно упорядочить массив вершин многоугольника P, выполнив c0l операций сравнения. Массив вершин многоугольника Q тем же алгоритмом

упорядочивается за c0m операций сравнения. Далее «сольём» полученные два массива, формируя новый массив длинной l + m , выбирая на каждом шаге минимальный из первых нерассмотренных элементов массивов. Для этого потребуется c1(l + m) операций

сравнения.

y

a1 a2 a3

a4 ... ai ai+1 ...

x

al+m

Итоговая сложность не превзойдёт c2 (l + m) . Для каждой полосы aiai+1 строим пересечение

двух трапеций (в некоторых случаях трапеция вырождается в треугольник). Затем объединяем пересечения и получаем требуемый результат, причём количество необходимых операций не превзойдёт c3 (l + m) . В результате получаем оценки:

l + m < CHS (P,Q) < c(l + m)

Если за размер входа взять величину r = l + m , тогда не трудно видеть, что TSH (r) = Θ(r) . Для размера входа s = max{m,l} имеем:

s < m +l 2s s CSH (P,Q) 2cs TSH(s) = Θ(s)

Если рассматривать функцию сложности как функцию двух аргументов l и m, то не трудно

 

 

 

 

 

 

′′

 

 

 

видеть, что TSH (l, m) = Θ(l + m) .

 

 

 

Определение. f (n1, n2 ) = Θ(g(n1, n2 )) c1, c2 , N > 0 такие,

что

n1, n2 > N

верно

c1

 

g(n1, n2 )

 

 

f (n1, n2 )

 

c2

 

g(n1, n2 )

 

.

 

 

 

 

 

 

 

 

 

 

 

 

Пусть G = (V , E) — ориентированный граф. Вояжем в

графе

G назовем

путь,

удовлетворяющий 3 условиям: 1) он начинается в какой-то вершине графа G; 2) не проходит по одной дуге дважды и 3) заканчивается в вершине, откуда нет путей.

Вояж не обязательно охватывает все дуги графа.

Пример.

4

3

5

1 2 6 7

Вояж: (1, 2, 2, 3, 1, 4).

5

Рассмотрим алгоритм нахождения вояжа в графе. Для этого сопоставим с графом квадратную матрицу, порядок которой совпадает с числом вершин в графе. Элементы матрицы aij показывают, сколькими ребрами соединяются вершины i и j. Для графа из примера матрица выглядит следующим образом:

0

1

0

1

0

0

0

 

1

1

0

0

0

 

0

0

 

0

0

1

0

0

 

1

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

 

0

0

0

1

0

 

0

0

 

0

0

0

0

0

 

0

0

Алгоритм заключается в следующем: начинаем с любого ненулевого элемента матрицы aij, получаем начальную вершину вояжа i — строка матрицы с выбранным элементом. Далее, так как элемент матрицы отличен от нуля, существует путь из этой вершины в вершину, соответствующую номеру столбца матрицы j. Полученная вершина будет второй в искомом вояже. Для продолжения алгоритма нужно уменьшить на единицу текущий элемент матрицы аij и перейти к рассмотрению строки j матрицы. Если эта строка не содержит отличных от нуля элементов, то построение вояжа окончено, так как из текущей вершины нет путей. Если найдётся хотя бы один отличный от нуля элемент ajk, то в вояж добавляется вершина k, элемент ajk уменьшается на единицу и построение вояжа продолжается поиском ненулевого элемента в строке k.

Рассмотрим сложность такого алгоритма. Не трудно видеть, что для заданного числа вершин существуют графы в виде «кольца» и «цветка»:

«кольцо» «цветок»

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

0

1

0

...

0

0

 

 

0

0

1

...

0

0

 

 

 

 

[n]

...

... ... ... ...

...

 

0

0

0

...

1

0

 

для «цветка»,

 

 

 

0

0

0

...

0

1

 

где n — число дуг в графе

 

 

0

0

...

0

 

 

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

для «кольца»

 

Для «кольца» с n вершинами получаем сложность: 2 +3 +...+ n +1 = n(n +1)

, тем самым

2

 

T (

 

E

 

)= c

 

E

 

2 .

 

 

 

 

 

 

6

 

Другой алгоритм для поиска вояжа основан на представлении графа в виде набора вершин, за каждой из которых закреплён список вершин, куда идут дуги из данной. Для графа из примера это представление имеет вид:

a1 = (2,4); a2 = (2,3); a3 = (1,4); a4 = (); a5 = (6); a6 = (5); a7 = ()

Для «кольца» имеем следующее представление:

a1 = (2); a2 = (3); a3 = (4); …; aV 1 = (V ); aV = (1)

Алгоритм для поиска вояжа по такому представлению приведём на псевдокоде:

l := cons(v, nil); i := v; while not null(ai) do

i := car(ai);

l := cons(i, l); ai := cdr(ai);

od

где car — первый элемент списка; cdr — конец списка;

cons — вставка.

Не трудно видеть, что сложность представленного алгоритма составляет c E , причём T (E )= Θ(E ), так как для любого числа рёбер E существует граф в виде «цветка».

Битовая длина числа как размер входа.

Рассмотрим функцию ν(n) , определённую следующим образом:

1, еслиn = 0

ν(n) =

log2 n +1, еслиn > 0

Определение. ν(n) называется битовой длиной n.

Рассмотрим сложность алгоритма пробных делений (TD), взяв в качестве размера входа

битовую длину n (сложность, для которой в качестве размера входа выбрана битовая n,

будем обозначать T * ).

 

 

 

 

 

 

 

 

 

A

 

 

 

 

 

 

T *

(m =ν(n)):

 

 

 

 

 

 

 

TD

 

 

 

 

 

 

 

 

 

 

m

 

2

3

4

5

6

7

 

 

n

 

2-3

4-7

8-15

16-31

32-63

64-127

 

 

nˆ

 

3

5

13

31

59

127

 

T * (m)

 

1

1

2

4

6

10

 

 

TD

 

 

 

 

 

 

 

 

где nˆ — некоторое конкретное число из указанного интервала, на котором достигается максимум делений. Таких чисел в конкретном интервале может быть больше одного (например, для интервала 64-127 число 121 тоже требует 10 делений для определения простоты). Как видно из приведённой таблице, сложность алгоритма пробных делений растёт вместе с ростом величины размера входа, что даёт возможность вычислить её асимптотику.

Для этого используем постулат Бертрана, который приведём без доказательства. Теорема (постулат Бертрана). N >1 в интервале (N, 2N) найдётся простое число.

7

Используя это утверждение, легко показать, что T *

(m =ν

 

 

m

 

(см. задачу 6).

 

 

(n))= Θ

2 2

 

 

 

 

 

 

 

TD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Лемма 1. Пусть

 

f (x) — финально неубывающая. Если для

некоторого алгоритма A

T * (m) f (m) , то

T

A

(n) f (log

2

n +1) .

 

 

 

 

 

 

 

 

 

 

A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Доказательство:

2m1 n < 2m ;

nˆ : 2m1 nˆ < 2m и такое, что T (nˆ) = T * (m) .

 

 

 

 

 

 

 

 

 

 

 

A

 

 

 

 

A

T (n) T (nˆ) = T * (m) f (m) = f ( log

n

 

+1)f (log

2

n +1) .

 

A

 

A

 

A

 

2

 

 

 

 

 

 

Лемма 2. Пусть g(x)

не убывает. Тогда

 

 

 

 

 

 

 

 

 

 

1)если TA (n) g(n) , то TA* (m) g(2m );

2)если TA (n) g(n) , то TA* (m) g(2m1 ).

Доказательство:

2

m1

n

<

2

m

ˆ

 

[2

m1

, 2

m

), такое, что на нём достигается максимум

 

 

 

 

 

; n

 

 

 

 

 

T

 

(n) , т.е. T (nˆ) =

 

max

 

T (n) .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

 

A

 

 

2m1n<2m

 

A

 

 

g(2

 

 

 

);

 

 

 

 

 

 

 

 

 

 

*

(m)

=

 

 

ˆ

 

 

ˆ

 

m

 

 

 

 

 

 

 

 

 

 

1) TA

 

TA (n)

 

g(n)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

(m)

=

 

 

ˆ

 

 

ˆ

 

g(2

m1

).

 

 

 

 

 

 

 

 

 

 

2) TA

 

TA (n)

 

 

g(n)

 

 

 

 

 

 

 

 

 

 

 

 

Указанные леммы можно обобщить на асимптотики, тогда получим:

 

 

 

 

Лемма 1*.

Если

 

f (x)

 

неубывающая функция, T * (m) = O(f (m))

, то

T

A

(n) =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A

 

 

 

= O(f (log2 n +1)). Если дополнительно f (x +1) = O(f (x)), то TA (n) = O(f (log2 n)).

 

 

 

Лемма 2*. Пусть g(x)

не убывает. Тогда

 

 

 

 

 

 

 

1)если TA (n) = O(g(n)), то TA* (m) = O(g(2m ));

2)если TA (n) = Ω(g(n)), то TA* (m) = Ω(g(2m1 )).

Если дополнительно g 2x = Ω(

g(x)), то TA* (m) = Ω(g(2m )).

Алгоритм возведения в степень: an.

Рассмотрим алгоритм возведения в натуральную степень методом повторных квадратов (RS

=repeating squaring). Для этого запишем n в двоичной системе счисления: n = βk βk1...β1β0 ,

βi {0, 1}. Приведём сам алгоритм на псевдокоде:

q := a; u := 1; for i = 0 to k do

if βi = 1 then u := u * q fi; if i < k then q := q2 fi;

od

Легко видеть, что, взяв в качестве размера входа битовую длину n, получим сложность этого алгоритма по числу умножений в следующем виде: TRS* (m) = 2m 2 . Если в качестве входа

взять значение n, то сложность перепишется в следующем виде: TRS (n) =ν(n) +ν* (n) 2 , где ν* (n) — количество единиц в двоичной записи n.

8

Сложность в среднем

Рассмотрим

множество

 

Is = {x :

 

 

 

x

 

 

 

= s}

. Введём

 

на этом множестве классическую

 

 

 

 

 

вероятность

P (x) =

1

,

 

x I

s

,

 

 

 

где N

s

= card I

s

=

 

I

s

 

 

(количество элементов множества).

 

 

 

 

 

 

 

 

 

 

s

Ns

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Не трудно видеть, что так введённая вероятность удовлетворяет условию: Ps (x) =1 .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x Is

Определение. Величина TA (s) = CAT (x)Ps (x)

называется временнόй сложностью в среднем

 

 

 

 

 

 

 

 

x Is

 

 

 

 

 

 

 

 

 

 

 

алгоритма A.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Определение. Величина

 

A (s) = CAS (x)Ps (x)

называется пространственной сложностью в

S

 

 

 

 

 

 

 

 

x Is

 

 

 

 

 

 

 

 

 

 

 

среднем алгоритма A.

Утверждение. Сложность в среднем не превосходит сложность в худшем случае:

 

 

 

 

 

 

 

 

 

 

 

TA (s) TA (s) и SA (s) SA (s) .

 

 

Доказательство

проведём для временной сложности (для

пространственной

доказательство

проводится аналогично):

 

 

 

T

 

T

 

 

 

TA (s) = CA (x)Ps (x) max CA

 

 

 

 

 

 

 

x Is

 

x Is

= TA (s)Ps (x) = TA (s)Ps (x) = TA (s) .

 

 

 

x Is

 

 

 

 

 

 

 

x s

x s

 

 

 

 

 

 

 

14243

 

 

 

 

 

 

 

 

 

=1

 

 

 

 

 

 

 

 

сложности

(x) Ps (x) =

Пример. Найдём сложность в среднем алгоритма возведения в степень (RS), описанного ранее. Рассмотрим множество Im ={n : 2m1 n < 2m} . Вероятность каждого элемента этого

множества положим равной

1

 

 

=

 

1

 

 

 

=

 

1

 

 

. Тогда

 

 

 

 

 

 

 

 

 

 

 

 

 

Im

 

 

2m 2m1

 

2m1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

2m 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

2m 1

 

 

 

 

 

 

 

1

 

 

m1

 

 

 

 

 

 

 

 

 

 

 

 

 

*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

 

 

 

 

 

 

m1

 

k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TRS (m) =

 

 

 

ν{(n) +ν

 

(n) 2

= (m 2) +

 

 

 

 

 

 

ν

 

(n)

= m 2 +

 

 

2

 

+kCm1

 

=

2

m1

 

2

m1

 

2

m1

 

 

 

 

 

 

n=2m1

=m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n=2m1

 

 

 

 

 

 

 

 

 

k=1

 

 

 

 

 

 

 

 

 

k

 

 

 

 

 

k1

 

 

 

 

 

 

 

1

 

 

 

 

 

 

m1

 

 

 

 

m1

k1

 

 

 

 

 

 

 

 

 

 

 

 

 

= {kCm1 = (m 1)Cm2

}= m

2 +

 

 

 

 

 

 

2

 

 

 

+(m

1)Cm2

= {k

= l

+1}=

 

 

 

 

 

 

 

2

m1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

m2

 

 

 

 

 

 

 

 

 

 

 

 

m 1

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

= m 2 +

 

 

2m1

+(m 1)Cml 2

= m

1+

2m2

=

(m 1) < 2m 2 = TRS*

(m)

 

 

 

 

 

m1

m1

2

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

l=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14243

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=(1+1)m2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

m2

 

 

 

 

 

 

 

 

 

 

 

 

m 1

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

= m 2 +

 

 

2m1

+(m 1)Cml 2

= m 1+

2m2

=

(m 1) < 2m 2 = TRS*

(m)

 

 

 

 

 

m1

m1

2

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

l=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14243

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

=(1+1)m2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Асимптотический закон распределения простых чисел.

Рассмотрим функцию Эйлера π(n) , равную количеству простых чисел, меньших n. Для этой

9

функции известна асимптотика: π(n) ~ lnnn . Рассмотрим ряд 1, 2, …, N. Вероятность того,

что наперёд взятое число из этого ряда простое, согласно асимптотике π(n) , близка к ln1N .

Предпринимались многие попытки доказать асимптотический закон π(n) . Так, в 1850 г.

Чебышёвым было доказано, что c,C > 0 : c lnnn < π(n) < C lnnn . Позднее было получено, что c = 0,92129 , C =1,10555 . В 1896 г. асимптотический закон для π(n) был доказан Адамаром.

Вернёмся к алгоритму пробных делений. Известно, что T *

 

2

m

 

(см. задачу 6).

 

(m =ν(n))= Θ

2

TD

 

 

 

 

 

 

 

 

 

 

 

Определение. Алгоритм называют алгоритмом с полиномиально ограниченной сложностью, если его сложность составляет O(md ) .

Определение. Алгоритм называют полиномиальным, если его сложность полиномиально ограничена.

Не используя предыдущую оценку, покажем, что алгоритм пробных делений (TD) не является полиномиально ограниченным. Для этого рассмотрим функцию V (m) —

количество

простых

чисел

из

полуинтервала

2m1 n < 2m . При m → ∞ ,

π(2m )~

 

2m

.

mln 2

Тогда V (m) = π(2m )π(2m1 )~

m 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2m

.

Пусть

D(n) — количество

 

делений,

2m(m 1)ln 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

необходимых

алгоритму

при

работе с

n,

тогда если

 

p 2m1

простое

число,

то

D( p) = 2m1 1 2

m

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

(для m 4 ). Используя эту оценку, для TTD (m) получаем:

 

 

 

 

 

 

 

 

 

 

 

 

1

 

2m 1

 

 

1

 

 

 

 

1

 

 

m

1

 

 

 

 

m 2

 

m

 

1

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

TTD (m) =

 

 

D(n)

 

 

D( p)

 

 

 

 

2

 

V (m)

 

 

 

 

2

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

2

 

 

=

 

 

 

 

2

 

 

= Ω

 

 

2

 

 

,

 

2

m1

2

m1

 

2

m1

 

 

 

2m(m 1)ln 2

 

 

 

 

 

 

 

 

 

 

n=2m1

 

 

2m1p<2m

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p - простое

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Сложность в среднем алгоритмов сортировки.

Пусть (a1,..., an )

некоторая перестановка ( ai [1, n], ai aj при i j ). Рассмотрим

функцию ψn (t1,...,tn )

, которая для любого набора попарно различных чисел будет

возвращать перестановку (a1,..., an ), отражающую порядок чисел t1,...,tn .

Пример. ψ

 

 

3

 

 

3

4

, 10, 17 = (2, 1, 3) .

 

 

 

 

Не трудно видеть, что сложности сортировок исходного массива t1, ... , tn и полученной перестановки a1, ... , an совпадают, поэтому можно ограничится рассмотрением сложности алгоритмов сортировки, применяемых к перестановкам.

10