intro and samples

86
Несложно о сложности. Примеры алгоритмов. Н.Н. Кузюрин С.А. Фомин 10 октября 2008 г. 1 / 86

Upload: stas-fomin

Post on 27-Jun-2015

322 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Intro And Samples

Несложно о сложности. Примеры алгоритмов.

Н.Н. Кузюрин С.А. Фомин

10 октября 2008 г.

1 / 86

Page 2: Intro And Samples

История алгоритмов

Понятие алгоритма известно с незапамятных временАлгоритм Евклида (Euclidean algorithm) — 500-300 гг. д.н.э.Решето Эратосфена (Sieve of Eratosthenes) — 300-200 гг. д.н.э.

Формализация понятия — 1930–1940 годы.Курт Гёдель ⇒ «неполнота формальной арифметики», 1931.Алан Тьюринг ⇒ «halting problem», 1936.Эмиль Пост ⇒ «машина Поста», 1936.Алонзо Чёрч ⇒ «An Unsolvable Problem of Elementary NumberTheory», 1936.Стивен Клини ⇒ «Тезис Черча-Тьюринга», 1943.

2 / 86

Page 3: Intro And Samples

История алгоритмов

Понятие алгоритма известно с незапамятных временАлгоритм Евклида (Euclidean algorithm) — 500-300 гг. д.н.э.Решето Эратосфена (Sieve of Eratosthenes) — 300-200 гг. д.н.э.

Формализация понятия — 1930–1940 годы.Курт Гёдель ⇒ «неполнота формальной арифметики», 1931.Алан Тьюринг ⇒ «halting problem», 1936.Эмиль Пост ⇒ «машина Поста», 1936.Алонзо Чёрч ⇒ «An Unsolvable Problem of Elementary NumberTheory», 1936.Стивен Клини ⇒ «Тезис Черча-Тьюринга», 1943.

3 / 86

Page 4: Intro And Samples

История алгоритмов

Понятие алгоритма известно с незапамятных временАлгоритм Евклида (Euclidean algorithm) — 500-300 гг. д.н.э.Решето Эратосфена (Sieve of Eratosthenes) — 300-200 гг. д.н.э.

Формализация понятия — 1930–1940 годы.Курт Гёдель ⇒ «неполнота формальной арифметики», 1931.Алан Тьюринг ⇒ «halting problem», 1936.Эмиль Пост ⇒ «машина Поста», 1936.Алонзо Чёрч ⇒ «An Unsolvable Problem of Elementary NumberTheory», 1936.Стивен Клини ⇒ «Тезис Черча-Тьюринга», 1943.

4 / 86

Page 5: Intro And Samples

История алгоритмов

Понятие алгоритма известно с незапамятных временАлгоритм Евклида (Euclidean algorithm) — 500-300 гг. д.н.э.Решето Эратосфена (Sieve of Eratosthenes) — 300-200 гг. д.н.э.

Формализация понятия — 1930–1940 годы.Курт Гёдель ⇒ «неполнота формальной арифметики», 1931.Алан Тьюринг ⇒ «halting problem», 1936.Эмиль Пост ⇒ «машина Поста», 1936.Алонзо Чёрч ⇒ «An Unsolvable Problem of Elementary NumberTheory», 1936.Стивен Клини ⇒ «Тезис Черча-Тьюринга», 1943.

5 / 86

Page 6: Intro And Samples

Теория сложностиРесурсные ограничения

ВремяПамятьОбъем коммуникаций

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

Теория сложностиФормулирует алгоритмические задачи. Для каждой задачи ищет:Эффективные алгоритмы — верхние оценки затрат (времени, памяти,

. . .)Доказательства сложности — нижние оценки затрат.

6 / 86

Page 7: Intro And Samples

Теория сложностиРесурсные ограничения

ВремяПамятьОбъем коммуникаций

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

Теория сложностиФормулирует алгоритмические задачи. Для каждой задачи ищет:Эффективные алгоритмы — верхние оценки затрат (времени, памяти,

. . .)Доказательства сложности — нижние оценки затрат.

7 / 86

Page 8: Intro And Samples

Теория сложностиРесурсные ограничения

ВремяПамятьОбъем коммуникаций

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

Теория сложностиФормулирует алгоритмические задачи. Для каждой задачи ищет:Эффективные алгоритмы — верхние оценки затрат (времени, памяти,

. . .)Доказательства сложности — нижние оценки затрат.

8 / 86

Page 9: Intro And Samples

Обозначения

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

Существует константа C > 0 такая, что начиная с некоторого nвыполнено f (n) ≤ Cg(n).

f (n) = Ω(g(n))

Существует константа C > 0 такая, что начиная с некоторого nвыполнено f (n) ≥ Cg(n).

Описание алгоритмов«Псевдокод» — неполнота и ошибочность,«C/C++/Java» — нечитаемый синтаксис и слабая абстракция.Мы используем популярный и рекомендованный для преподаванияалгоритмов язык Python.

9 / 86

Page 10: Intro And Samples

Обозначения

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

Существует константа C > 0 такая, что начиная с некоторого nвыполнено f (n) ≤ Cg(n).

f (n) = Ω(g(n))

Существует константа C > 0 такая, что начиная с некоторого nвыполнено f (n) ≥ Cg(n).

Описание алгоритмов«Псевдокод» — неполнота и ошибочность,«C/C++/Java» — нечитаемый синтаксис и слабая абстракция.Мы используем популярный и рекомендованный для преподаванияалгоритмов язык Python.

10 / 86

Page 11: Intro And Samples

Тривиальное вычисление y = xn mod m

def mod_exp (x , n, m) :print x , n, my ← 1for i ∈ range (n) :

y ← y ∗ x % mprint y

return y

Количество умножений — O(n)

13 16 471328353240339371122692317336y = 13^16 (mod 47) = 6

11 / 86

Page 12: Intro And Samples

Разумное вычисление y = xn mod m

xn = x∑k

i=0 ai2i=

k∏i=0

xai2i=

∏{i :ai>0}

x2i

def mod_exp (x , n, m) :print x , n, my ← 1X ← xN ← nwhile N > 0:

if N % 2 = 1:y ← y ∗ X % m

X ← X ∗ X % mN ← N/2print X , N, y

return y

13 16 4728 8 132 4 137 2 16 1 136 0 6y = 13^16 (mod 47) = 6

Количество арифметическихопераций — O(log(n)).

Длина (бит) Умножений в алг. 1 Умножений в алг. 256 256 ≈ 7.2 · 1016 ≈ 100

128 2128 ≈ 3.4 · 1038 ≈ 13012 / 86

Page 13: Intro And Samples

Вычисление факториала y = n! mod m

def factorial (n, m) :print n, my ← 1for i ∈ range (1, n + 1):

y ← y ∗ i % mprint y

return y

Количество умножений — O(n).Временная сложность измеряетсяотносительно длины входа:log n + log m.Поэтому cложностьэкспоненциальна !Возможно ли лучше — открытаяпроблема.

13 1311262412065621031010052100121y =13! mod 131 = 121

13 / 86

Page 14: Intro And Samples

Дискретный логарифм

Задача

«Дискретный логарифм» (Discrete logarithm) Даны натуральные a, b,и p — нечетное простое число. Найти минимальный x , такой, что

ax ≡ b (mod p).

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

На этом свойстве односторонней вычислимости модульной экспонентыосновано множество алгоритмов современной криптографии.

14 / 86

Page 15: Intro And Samples

Дискретный логарифм

Задача

«Дискретный логарифм» (Discrete logarithm) Даны натуральные a, b,и p — нечетное простое число. Найти минимальный x , такой, что

ax ≡ b (mod p).

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

На этом свойстве односторонней вычислимости модульной экспонентыосновано множество алгоритмов современной криптографии.

15 / 86

Page 16: Intro And Samples

Дискретный логарифм

Задача

«Дискретный логарифм» (Discrete logarithm) Даны натуральные a, b,и p — нечетное простое число. Найти минимальный x , такой, что

ax ≡ b (mod p).

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

На этом свойстве односторонней вычислимости модульной экспонентыосновано множество алгоритмов современной криптографии.

16 / 86

Page 17: Intro And Samples

Наибольший общий делитель

Задача

«Наибольший общий делитель»Для заданных натуральных a и b найти максимальное q, для которого

a... q и b

... q (a и b кратны q).

17 / 86

Page 18: Intro And Samples

Алгоритм Евклида

Базовое соотношение

gcd(a, b) = gcd(a, r), b = at + r , 0 ≤ r < a.

def gcd (a, b) :print a, bif a = 0:

return breturn gcd (b % a, a)

Calculating gcd(123456, 6122256):123456 612225672912 12345650544 7291222368 505445808 223684944 5808864 4944624 864240 624144 24096 14448 960 48gcd(123456, 6122256) = 48

18 / 86

Page 19: Intro And Samples

Алгоритм Евклида

Базовое соотношение

gcd(a, b) = gcd(a, r), b = at + r , 0 ≤ r < a.

def gcd (a, b) :print a, bif a = 0:

return breturn gcd (b % a, a)

Calculating gcd(123456, 6122256):123456 612225672912 12345650544 7291222368 505445808 223684944 5808864 4944624 864240 624144 24096 14448 960 48gcd(123456, 6122256) = 48

19 / 86

Page 20: Intro And Samples

Алгоритм Евклида: Время выполнения

ЛеммаВремя работы алгоритма Евклида — O(log a + log b) арифметическихопераций.

Доказательство.1 Имеем b ≥ a + (b mod a) ≥ 2(b mod a) ≡ 2r .2 Отсюда получаем, что r ≤ b

2 .3 ar ≤ ab/2 (на каждой итерации ab уменьшается вдвое).4 После dlog(ab)e итераций ab станет нулем.5 ab = 0 → a = 0 → НОД найден.

20 / 86

Page 21: Intro And Samples

Алгоритм Евклида: Время выполнения

ЛеммаВремя работы алгоритма Евклида — O(log a + log b) арифметическихопераций.

Доказательство.1 Имеем b ≥ a + (b mod a) ≥ 2(b mod a) ≡ 2r .2 Отсюда получаем, что r ≤ b

2 .3 ar ≤ ab/2 (на каждой итерации ab уменьшается вдвое).4 После dlog(ab)e итераций ab станет нулем.5 ab = 0 → a = 0 → НОД найден.

21 / 86

Page 22: Intro And Samples

Алгоритм Евклида: Время выполнения

ЛеммаВремя работы алгоритма Евклида — O(log a + log b) арифметическихопераций.

Доказательство.1 Имеем b ≥ a + (b mod a) ≥ 2(b mod a) ≡ 2r .2 Отсюда получаем, что r ≤ b

2 .3 ar ≤ ab/2 (на каждой итерации ab уменьшается вдвое).4 После dlog(ab)e итераций ab станет нулем.5 ab = 0 → a = 0 → НОД найден.

22 / 86

Page 23: Intro And Samples

Алгоритм Евклида: Время выполнения

ЛеммаВремя работы алгоритма Евклида — O(log a + log b) арифметическихопераций.

Доказательство.1 Имеем b ≥ a + (b mod a) ≥ 2(b mod a) ≡ 2r .2 Отсюда получаем, что r ≤ b

2 .3 ar ≤ ab/2 (на каждой итерации ab уменьшается вдвое).4 После dlog(ab)e итераций ab станет нулем.5 ab = 0 → a = 0 → НОД найден.

23 / 86

Page 24: Intro And Samples

Алгоритм Евклида: Время выполнения

ЛеммаВремя работы алгоритма Евклида — O(log a + log b) арифметическихопераций.

Доказательство.1 Имеем b ≥ a + (b mod a) ≥ 2(b mod a) ≡ 2r .2 Отсюда получаем, что r ≤ b

2 .3 ar ≤ ab/2 (на каждой итерации ab уменьшается вдвое).4 После dlog(ab)e итераций ab станет нулем.5 ab = 0 → a = 0 → НОД найден.

24 / 86

Page 25: Intro And Samples

Алгоритм Евклида: Время выполнения

ЛеммаВремя работы алгоритма Евклида — O(log a + log b) арифметическихопераций.

Доказательство.1 Имеем b ≥ a + (b mod a) ≥ 2(b mod a) ≡ 2r .2 Отсюда получаем, что r ≤ b

2 .3 ar ≤ ab/2 (на каждой итерации ab уменьшается вдвое).4 После dlog(ab)e итераций ab станет нулем.5 ab = 0 → a = 0 → НОД найден.

25 / 86

Page 26: Intro And Samples

Задача Коммивояжера

Задача

«Коммивояжер», «TSPa». Заданы неориентированный граф из nвершин-городов, и dij ≡ d(vi , vj) — положительные целые расстояниямежду городами.Чему равна наименьшая возможная длина кольцевого маршрута,проходящего по одному разу через все города? Т.е. нужно найтиминимально возможное значение суммы

min

p∈

1 2 . . . n. . . .

n−1∑i=1

dpi ,pi+1 + dpn,p1 , (1)

где минимум берется по всем перестановкам p чисел 1, . . . , n.aВ англоязычной литературе — Traveling Salesman Problem.

26 / 86

Page 27: Intro And Samples

Переборный алгоритм для TSP

def TSP_BruteForce (G ) :MinPath← MinPathLength← None

перебор всех перестановок с фиксированным первым узломfor path ∈ xpermutations (G .nodes ()[1 : ]) :

PathLength← getPathLength (path, G .nodes ()[0])if ¬MinPathLength ∨MinPathLength > PathLength :

MinPathLength, MinPath← PathLength, pathreturn MinPath, MinPathLength

27 / 86

Page 28: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 1: [’NY’, ’Moscow’, ’Minsk’, ’Berlin’, ’Kiev’] ⇒ 205

28 / 86

Page 29: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 2: [’NY’, ’Moscow’, ’Minsk’, ’Kiev’, ’Berlin’] ⇒ 170

29 / 86

Page 30: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 3: [’NY’, ’Moscow’, ’Berlin’, ’Minsk’, ’Kiev’] ⇒ 225

30 / 86

Page 31: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 4: [’NY’, ’Moscow’, ’Berlin’, ’Kiev’, ’Minsk’] ⇒ 275

31 / 86

Page 32: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 5: [’NY’, ’Moscow’, ’Kiev’, ’Minsk’, ’Berlin’] ⇒ 155

32 / 86

Page 33: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 6: [’NY’, ’Moscow’, ’Kiev’, ’Berlin’, ’Minsk’] ⇒ 240

33 / 86

Page 34: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 7: [’NY’, ’Minsk’, ’Moscow’, ’Berlin’, ’Kiev’] ⇒ 295

34 / 86

Page 35: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 8: [’NY’, ’Minsk’, ’Moscow’, ’Kiev’, ’Berlin’] ⇒ 225

35 / 86

Page 36: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 9: [’NY’, ’Minsk’, ’Berlin’, ’Moscow’, ’Kiev’] ⇒ 280

36 / 86

Page 37: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 10: [’NY’, ’Minsk’, ’Berlin’, ’Kiev’, ’Moscow’] ⇒ 240

37 / 86

Page 38: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 11: [’NY’, ’Minsk’, ’Kiev’, ’Moscow’, ’Berlin’] ⇒ 245

38 / 86

Page 39: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 12: [’NY’, ’Minsk’, ’Kiev’, ’Berlin’, ’Moscow’] ⇒ 275

39 / 86

Page 40: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 13: [’NY’, ’Berlin’, ’Moscow’, ’Minsk’, ’Kiev’] ⇒ 210

40 / 86

Page 41: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 14: [’NY’, ’Berlin’, ’Moscow’, ’Kiev’, ’Minsk’] ⇒ 245

41 / 86

Page 42: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 15: [’NY’, ’Berlin’, ’Minsk’, ’Moscow’, ’Kiev’] ⇒ 175

42 / 86

Page 43: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 16: [’NY’, ’Berlin’, ’Minsk’, ’Kiev’, ’Moscow’] ⇒ 155

43 / 86

Page 44: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 17: [’NY’, ’Berlin’, ’Kiev’, ’Moscow’, ’Minsk’] ⇒ 225

44 / 86

Page 45: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 18: [’NY’, ’Berlin’, ’Kiev’, ’Minsk’, ’Moscow’] ⇒ 170

45 / 86

Page 46: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 19: [’NY’, ’Kiev’, ’Moscow’, ’Minsk’, ’Berlin’] ⇒ 175

46 / 86

Page 47: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 20: [’NY’, ’Kiev’, ’Moscow’, ’Berlin’, ’Minsk’] ⇒ 280

47 / 86

Page 48: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 21: [’NY’, ’Kiev’, ’Minsk’, ’Moscow’, ’Berlin’] ⇒ 210

48 / 86

Page 49: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 22: [’NY’, ’Kiev’, ’Minsk’, ’Berlin’, ’Moscow’] ⇒ 225

49 / 86

Page 50: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 23: [’NY’, ’Kiev’, ’Berlin’, ’Moscow’, ’Minsk’] ⇒ 295

50 / 86

Page 51: Intro And Samples

Перебор для TSP

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

Цикл № 24: [’NY’, ’Kiev’, ’Berlin’, ’Minsk’, ’Moscow’] ⇒ 205

51 / 86

Page 52: Intro And Samples

Перебор для TSP

[’NY’, ’Moscow’, ’Minsk’, ’Berlin’, ’Kiev’] 205[’NY’, ’Moscow’, ’Minsk’, ’Kiev’, ’Berlin’] 170[’NY’, ’Moscow’, ’Berlin’, ’Minsk’, ’Kiev’] 225[’NY’, ’Moscow’, ’Berlin’, ’Kiev’, ’Minsk’] 275[’NY’, ’Moscow’, ’Kiev’, ’Minsk’, ’Berlin’] 155[’NY’, ’Moscow’, ’Kiev’, ’Berlin’, ’Minsk’] 240[’NY’, ’Minsk’, ’Moscow’, ’Berlin’, ’Kiev’] 295[’NY’, ’Minsk’, ’Moscow’, ’Kiev’, ’Berlin’] 225[’NY’, ’Minsk’, ’Berlin’, ’Moscow’, ’Kiev’] 280[’NY’, ’Minsk’, ’Berlin’, ’Kiev’, ’Moscow’] 240[’NY’, ’Minsk’, ’Kiev’, ’Moscow’, ’Berlin’] 245[’NY’, ’Minsk’, ’Kiev’, ’Berlin’, ’Moscow’] 275[’NY’, ’Berlin’, ’Moscow’, ’Minsk’, ’Kiev’] 210[’NY’, ’Berlin’, ’Moscow’, ’Kiev’, ’Minsk’] 245[’NY’, ’Berlin’, ’Minsk’, ’Moscow’, ’Kiev’] 175[’NY’, ’Berlin’, ’Minsk’, ’Kiev’, ’Moscow’] 155[’NY’, ’Berlin’, ’Kiev’, ’Moscow’, ’Minsk’] 225[’NY’, ’Berlin’, ’Kiev’, ’Minsk’, ’Moscow’] 170[’NY’, ’Kiev’, ’Moscow’, ’Minsk’, ’Berlin’] 175[’NY’, ’Kiev’, ’Moscow’, ’Berlin’, ’Minsk’] 280[’NY’, ’Kiev’, ’Minsk’, ’Moscow’, ’Berlin’] 210[’NY’, ’Kiev’, ’Minsk’, ’Berlin’, ’Moscow’] 225[’NY’, ’Kiev’, ’Berlin’, ’Moscow’, ’Minsk’] 295[’NY’, ’Kiev’, ’Berlin’, ’Minsk’, ’Moscow’] 205Оптимальный путь: [’NY’, ’Moscow’, ’Kiev’, ’Minsk’, ’Berlin’] => 155

N Y

Berlin

$50

Minsk

$120

M o s c o w

$60Kiev

$80

$30

$20

$15

$50

$15

$10

52 / 86

Page 53: Intro And Samples

Кратчайшие пути в графе

Задача

«Кратчайший путь в графе»a.Заданы n вершин графа (узлов сети) v1, v2, . . . , vn и положительныецелые длины дуг dij ≡ d(vi , vj) между ними.Нужно для всех k ∈ (2 . . . n) найти минимальную длину пути из v1 в vk .

aВ англоязычной литературе — Shortest Path Problem.

53 / 86

Page 54: Intro And Samples

Кратчайшие пути в графеВажное свойствоЕсли у нас есть кратчайший путь от v до w , проходящий черезвершину y , назовем его (v → w)∗, то его первая часть от v до y ,(v → y)∗, тоже будет кратчайшим путем.

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

Если бы существовал бы путь (v → y)! длины меньшей, чем (v → y)∗,то можно было бы улучшить оптимальный путь (v → w)∗, заменивв нем (v → y)∗ на (v → y)!.

54 / 86

Page 55: Intro And Samples

Алгоритм Дейкстры

def dijkstra (G , startNode) :Visited← {} # хэш (узел → стоимость) посещенных вершинToVisit← {startNode : 0} # соседи посещенных (уз. → стоим.)Paths← {startNode : [startNode]} # узел → кратчайший путьwhile ToVisit : # пока есть куда стремиться

v ← argmin (ToVisit) # выбираем ближайшуюVisited[v ]← ToVisit[v ] # фиксируем откуда пришли в vdel ToVisit[v ] # кратчайший путь к v найденfor w ∈ G .neighbors (v) : # для всех соседей вершины v

if (w 6∈ Visited) : # еще не нашли кратчайший путьобновляем кратчайшие пути

vwLength← Visited[v ] + G .get_edge (v , w)if (w 6∈ ToVisit) ∨ (vwLength < ToVisit[w ]) :

ToVisit[w ]← vwLength # обновляем ценуPaths[w ]← Paths[v ] + [w ] # посещения соседа

return (Visited, Paths)

55 / 86

Page 56: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$10

Итерация № 1 56 / 86

Page 57: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

$75

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$120

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$10

Итерация № 2 57 / 86

Page 58: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

$75

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$120

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$10

Итерация № 3 58 / 86

Page 59: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

$70

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$120

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$30

$10

Итерация № 4 59 / 86

Page 60: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

$70

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$120

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$30

$10

Итерация № 5 60 / 86

Page 61: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

$70

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$100

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$30

$10

Итерация № 6 61 / 86

Page 62: Intro And Samples

Выполнение алгоритма Дейкстры

N Y

$70

M o s c o w

$15$60

Berlin

$20

$50

Vladivos tok

$100

$30

Minsk

Start

$0

$15

$50

Kiev

$15

$10

$105

$20

$15

$30

Munich

$30

$10

Итерация № 7 62 / 86

Page 63: Intro And Samples

Трудоемкость алгоритма Дейкстры

ЛеммаТрудоемкость алгоритма Дейкстры составляет O(n2) операций, гдеn — число вершин.

Доказательство.1 Внешний цикл по вершинам дает множитель n.2 Внутренний цикл содержит выбор минимального элемента — O(n)

+ пересчет оценок длин для соседей выбранного узла — O(n).3 Итого — O(n2).

63 / 86

Page 64: Intro And Samples

Трудоемкость алгоритма Дейкстры

ЛеммаТрудоемкость алгоритма Дейкстры составляет O(n2) операций, гдеn — число вершин.

Доказательство.1 Внешний цикл по вершинам дает множитель n.2 Внутренний цикл содержит выбор минимального элемента — O(n)

+ пересчет оценок длин для соседей выбранного узла — O(n).3 Итого — O(n2).

64 / 86

Page 65: Intro And Samples

Трудоемкость алгоритма Дейкстры

ЛеммаТрудоемкость алгоритма Дейкстры составляет O(n2) операций, гдеn — число вершин.

Доказательство.1 Внешний цикл по вершинам дает множитель n.2 Внутренний цикл содержит выбор минимального элемента — O(n)

+ пересчет оценок длин для соседей выбранного узла — O(n).3 Итого — O(n2).

65 / 86

Page 66: Intro And Samples

Кратчайшие пути в графе с отрицательными весами

Задача

«Кратчайшие пути с отрицательными расстояниями».Задан ориентированный граф G = (V , E ) и весовая функция на дугахwe : e → Z , отображающая ребра в целые числа, такая, что в графенет цикла отрицательной длины. Найти минимальные длины путеймежду всеми парами вершин.

66 / 86

Page 67: Intro And Samples

Алгоритм Флойда-Уоршолла

for k ∈ range (N) : # N — размер матрицыDD← array (D) # Сохраняем Dk−1 в DDfor v1 ∈ range (N) :

for v2 ∈ range (N) :D[v1, v2]← min (DD[v1, v2], DD[v1, k] + DD[k , v2])

67 / 86

Page 68: Intro And Samples

Выполнение алгоритма Флойда-Уоршолла

N Y ( 0 )

Kiev(4)$80

M o s c o w ( 1 )

$60

Minsk(2 )$-5

Ber l in (3)

$50

$10

$10

$50

$30

$20

$30

$15

$15

k=0 (NY) NY Moscow Minsk Berlin KievNY 0 ∞ ∞ ∞ 80Moscow 60 0 -5 50 10Minsk ∞ 10 0 ∞ ∞Berlin 50 30 20 0 30Kiev ∞ 15 15 ∞ 0

68 / 86

Page 69: Intro And Samples

Выполнение алгоритма Флойда-Уоршолла

N Y ( 0 )

Kiev(4)$80

M o s c o w ( 1 )

$60

Minsk(2 )$-5

Ber l in (3)

$50

$10

$10

$50

$30

$20

$30

$15

$15

k=1(Moscow)

NY Moscow Minsk Berlin Kiev

NY 0 ∞ ∞ ∞ 80Moscow 60 0 -5 50 10Minsk ∞⇒70 10 0 ∞⇒60 ∞⇒20Berlin 50 30 20 0 30Kiev ∞⇒75 15 15⇒10 ∞⇒65 0

69 / 86

Page 70: Intro And Samples

Выполнение алгоритма Флойда-Уоршолла

N Y ( 0 )

Kiev(4)$80

M o s c o w ( 1 )

$60

Minsk(2 )$-5

Ber l in (3)

$50

$10

$10

$50

$30

$20

$30

$15

$15

k=2 (Minsk) NY Moscow Minsk Berlin KievNY 0 ∞ ∞ ∞ 80Moscow 60 0 -5 50 10Minsk 70 10 0 60 20Berlin 50 30 20 0 30Kiev 75 15 10 65 0

70 / 86

Page 71: Intro And Samples

Выполнение алгоритма Флойда-Уоршолла

N Y ( 0 )

Kiev(4)$80

M o s c o w ( 1 )

$60

Minsk(2 )$-5

Ber l in (3)

$50

$10

$10

$50

$30

$20

$30

$15

$15

k=3 (Berlin) NY Moscow Minsk Berlin KievNY 0 ∞ ∞ ∞ 80Moscow 60 0 -5 50 10Minsk 70 10 0 60 20Berlin 50 30 20 0 30Kiev 75 15 10 65 0

71 / 86

Page 72: Intro And Samples

Выполнение алгоритма Флойда-Уоршолла

N Y ( 0 )

Kiev(4)$80

M o s c o w ( 1 )

$60

Minsk(2 )$-5

Ber l in (3)

$50

$10

$10

$50

$30

$20

$30

$15

$15

k=4 (Kiev) NY Moscow Minsk Berlin KievNY 0 ∞⇒95 ∞⇒90 ∞⇒145 80Moscow 60 0 -5 50 10Minsk 70 10 0 60 20Berlin 50 30 20 0 30Kiev 75 15 10 65 0

72 / 86

Page 73: Intro And Samples

Минимальное остовное деревоЗадача

«Минимальное остовное дерево» (Minimum Spanning Tree)Задан связный неориентированный граф G = (V , E ), гдеV—множество вершин, |V | = n, E—множество ребер между ними,и весовая функция w : E → Z+. Иными словами, есть n вершинv1, . . . , vn и положительные целые веса дуг wij ≡ w(vi , vj)

aмежду ними.Требуется найти наименьший возможный вес остовного дерева, т.е.

min∑

(i ,j)∈T

w(vi , vj), (2)

где минимум берется по всем остовным деревьям на n вершинах (повсем множествам T из (n − 1) дуг, связывающим все n вершинв единую сеть).

aМожно вводить веса на ребрах, как we , e ∈ E .

73 / 86

Page 74: Intro And Samples

Алгоритм Прима

def MST_Prim (G , s) :

MST← {} # мин. остовное дерево, хэш (вершина:предшественник)ToVisit← {s : 0} # хэш, граничащих с MST, (узел:стоимость)Predecessor← {s : s} # хэш: вершины из которых включают другиеwhile ToVisit : # пока есть непосещенные вершины

v ← argmin (ToVisit) # ближайшая достижимая вершинаMST[v ]← Predecessor[v ]; # запоминаем, откуда пришлиdel ToVisit[v ]; del Predecessor[v ]; # больше не посещатьfor w ∈ G .neighbors (v) : # для всех соседей вершины v

if w 6∈ MST : # которые еще не в MSTобновляем стоимость включения в MST

if w 6∈ ToVisit ∨ G .get_edge (v , w) < ToVisit[w ] :

ToVisit[w ]← G .get_edge (v , w) # кандидатPredecessor[w ]← v

return MST

74 / 86

Page 75: Intro And Samples

Выполнение алгоритма Прима

N Y

M o s c o w ( $ 1 5 )

$ 6 0

Berl in ($20)

$ 5 0Kiev ($15)

$ 8 0

M i n s k

Start

$ 1 5

$ 5 0

$ 1 0

$ 2 0

$ 1 5

$ 3 0

Итерация № 1 Стоимость MST: 0

75 / 86

Page 76: Intro And Samples

Выполнение алгоритма Прима

N Y ( $ 6 0 )

M o s c o w

$ 6 0

Berl in ($20)

$ 5 0 Kiev ($10)

$ 8 0

M i n s k

Start

$ 1 5

$ 5 0

$ 1 0$ 2 0

$ 1 5

$ 3 0

Итерация № 2 Стоимость MST: 1576 / 86

Page 77: Intro And Samples

Выполнение алгоритма Прима

N Y ( $ 6 0 )

M o s c o w

$ 6 0

Berl in ($20)

$ 5 0 Kiev

$ 8 0

M i n s k

Start

$ 1 5

$ 5 0

$ 1 0

$ 2 0

$ 1 5

$ 3 0

Итерация № 3 Стоимость MST: 2577 / 86

Page 78: Intro And Samples

Выполнение алгоритма Прима

N Y ( $ 5 0 )

M o s c o w

$ 6 0

Berl in

$ 5 0 Kiev

$ 8 0

M i n s k

Start

$ 1 5

$ 5 0

$ 1 0

$ 2 0

$ 1 5

$ 3 0

Итерация № 4 Стоимость MST: 4578 / 86

Page 79: Intro And Samples

Выполнение алгоритма Прима

N Y

M o s c o w

$ 6 0

Berl in

$ 5 0 Kiev

$ 8 0

M i n s k

Start

$ 1 5

$ 5 0

$ 1 0

$ 2 0

$ 1 5

$ 3 0

Итерация № 5 Стоимость MST: 9579 / 86

Page 80: Intro And Samples

Сортировка

Задача«Сортировка» (Sorting)Имеется произвольный массив A : a1, . . . , an.Tребуется путем сравнений отсортировать этот массив таким образом,чтобы элементы расположились в порядке возрастания (илиубывания), то есть ai1 ≤ ai2 ≤ . . . ≤ ain.

80 / 86

Page 81: Intro And Samples

Cортировка слиянием

def mergesort (L) :M ← len (L)/2 # середина спискаif M = 0: # если список меньше двух элементов

return L # сортировать нечегоreturn merge (mergesort (L[ : M]), mergesort (L[M : ]))

def merge (A, B) :C ← [ ]while A ∨ B : # пока оба списка непусты

if ¬B ∨ (A ∧ A[0] < B[0]) :C .append (A.pop (0)) # A0 удаляем из A и добавляем в C

else :C .append (B.pop (0)) # B0 удаляем из B и добавляем в C

return C

81 / 86

Page 82: Intro And Samples

Cортировка слиянием: Выполнение

82 / 86

Page 83: Intro And Samples

Cортировка слиянием: Упражнения

УпражнениеНайдите такие упорядоченные последовательности A и B , на которыхпроцедура «merge» выполнит |A|+ 1 сравнений.

УпражнениеНайдите такие упорядоченные последовательности A и B , на которыхпроцедура «merge» выполнит |A|+ |B| − 1 сравнений.

83 / 86

Page 84: Intro And Samples

Cортировка слиянием: Время выполнения

Пусть T (n) — число сравнений, достаточное для сортировки слиянием.

T (n) ≤ 2T (n/2) + O(n).

Проверим T (n) = cn log2 n:

cn log2 n ≤ cn log(n/2) + O(n) = cn log2 n − cn + O(n)

РезюмеАлгоритм асимптотически оптимален: O(n log n), но используетвспомогательные массивы (не всегда допустимо).

84 / 86

Page 85: Intro And Samples

�Карта памяти� лекции

85 / 86

Page 86: Intro And Samples

Интернет поддержка курса

http://discopal.ispras.ru/

Вопросы?

86 / 86