Intro And Samples
-
Upload
stas-fomin -
Category
Documents
-
view
317 -
download
0
Transcript of Intro And Samples
Несложно о сложности. Примеры алгоритмов.
Н.Н. Кузюрин С.А. Фомин
10 октября 2008 г.
1 / 86
История алгоритмов
Понятие алгоритма известно с незапамятных временАлгоритм Евклида (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
История алгоритмов
Понятие алгоритма известно с незапамятных временАлгоритм Евклида (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
История алгоритмов
Понятие алгоритма известно с незапамятных временАлгоритм Евклида (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
История алгоритмов
Понятие алгоритма известно с незапамятных временАлгоритм Евклида (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
Теория сложностиРесурсные ограничения
ВремяПамятьОбъем коммуникаций
Переборные алгоритмыПригодны для любой задачи разрешения, но время работы растетэкспоненциально.
Теория сложностиФормулирует алгоритмические задачи. Для каждой задачи ищет:Эффективные алгоритмы — верхние оценки затрат (времени, памяти,
. . .)Доказательства сложности — нижние оценки затрат.
6 / 86
Теория сложностиРесурсные ограничения
ВремяПамятьОбъем коммуникаций
Переборные алгоритмыПригодны для любой задачи разрешения, но время работы растетэкспоненциально.
Теория сложностиФормулирует алгоритмические задачи. Для каждой задачи ищет:Эффективные алгоритмы — верхние оценки затрат (времени, памяти,
. . .)Доказательства сложности — нижние оценки затрат.
7 / 86
Теория сложностиРесурсные ограничения
ВремяПамятьОбъем коммуникаций
Переборные алгоритмыПригодны для любой задачи разрешения, но время работы растетэкспоненциально.
Теория сложностиФормулирует алгоритмические задачи. Для каждой задачи ищет:Эффективные алгоритмы — верхние оценки затрат (времени, памяти,
. . .)Доказательства сложности — нижние оценки затрат.
8 / 86
Обозначения
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
Обозначения
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
Тривиальное вычисление 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
Разумное вычисление 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
Вычисление факториала 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
Дискретный логарифм
Задача
«Дискретный логарифм» (Discrete logarithm) Даны натуральные a, b,и p — нечетное простое число. Найти минимальный x , такой, что
ax ≡ b (mod p).
Вычисление дискретного логарифма является очень сложной задачей.Самые быстрые из известных алгоритмов требуютсверхполиномиального времени.
На этом свойстве односторонней вычислимости модульной экспонентыосновано множество алгоритмов современной криптографии.
14 / 86
Дискретный логарифм
Задача
«Дискретный логарифм» (Discrete logarithm) Даны натуральные a, b,и p — нечетное простое число. Найти минимальный x , такой, что
ax ≡ b (mod p).
Вычисление дискретного логарифма является очень сложной задачей.Самые быстрые из известных алгоритмов требуютсверхполиномиального времени.
На этом свойстве односторонней вычислимости модульной экспонентыосновано множество алгоритмов современной криптографии.
15 / 86
Дискретный логарифм
Задача
«Дискретный логарифм» (Discrete logarithm) Даны натуральные a, b,и p — нечетное простое число. Найти минимальный x , такой, что
ax ≡ b (mod p).
Вычисление дискретного логарифма является очень сложной задачей.Самые быстрые из известных алгоритмов требуютсверхполиномиального времени.
На этом свойстве односторонней вычислимости модульной экспонентыосновано множество алгоритмов современной криптографии.
16 / 86
Наибольший общий делитель
Задача
«Наибольший общий делитель»Для заданных натуральных a и b найти максимальное q, для которого
a... q и b
... q (a и b кратны q).
17 / 86
Алгоритм Евклида
Базовое соотношение
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
Алгоритм Евклида
Базовое соотношение
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
Алгоритм Евклида: Время выполнения
ЛеммаВремя работы алгоритма Евклида — 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
Алгоритм Евклида: Время выполнения
ЛеммаВремя работы алгоритма Евклида — 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
Алгоритм Евклида: Время выполнения
ЛеммаВремя работы алгоритма Евклида — 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
Алгоритм Евклида: Время выполнения
ЛеммаВремя работы алгоритма Евклида — 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
Алгоритм Евклида: Время выполнения
ЛеммаВремя работы алгоритма Евклида — 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
Алгоритм Евклида: Время выполнения
ЛеммаВремя работы алгоритма Евклида — 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
Задача Коммивояжера
Задача
«Коммивояжер», «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
Переборный алгоритм для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Перебор для 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
Кратчайшие пути в графе
Задача
«Кратчайший путь в графе»a.Заданы n вершин графа (узлов сети) v1, v2, . . . , vn и положительныецелые длины дуг dij ≡ d(vi , vj) между ними.Нужно для всех k ∈ (2 . . . n) найти минимальную длину пути из v1 в vk .
aВ англоязычной литературе — Shortest Path Problem.
53 / 86
Кратчайшие пути в графеВажное свойствоЕсли у нас есть кратчайший путь от v до w , проходящий черезвершину y , назовем его (v → w)∗, то его первая часть от v до y ,(v → y)∗, тоже будет кратчайшим путем.
Доказательство.
Если бы существовал бы путь (v → y)! длины меньшей, чем (v → y)∗,то можно было бы улучшить оптимальный путь (v → w)∗, заменивв нем (v → y)∗ на (v → y)!.
54 / 86
Алгоритм Дейкстры
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
Выполнение алгоритма Дейкстры
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
Выполнение алгоритма Дейкстры
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
Выполнение алгоритма Дейкстры
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
Выполнение алгоритма Дейкстры
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
Выполнение алгоритма Дейкстры
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
Выполнение алгоритма Дейкстры
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
Выполнение алгоритма Дейкстры
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
Трудоемкость алгоритма Дейкстры
ЛеммаТрудоемкость алгоритма Дейкстры составляет O(n2) операций, гдеn — число вершин.
Доказательство.1 Внешний цикл по вершинам дает множитель n.2 Внутренний цикл содержит выбор минимального элемента — O(n)
+ пересчет оценок длин для соседей выбранного узла — O(n).3 Итого — O(n2).
63 / 86
Трудоемкость алгоритма Дейкстры
ЛеммаТрудоемкость алгоритма Дейкстры составляет O(n2) операций, гдеn — число вершин.
Доказательство.1 Внешний цикл по вершинам дает множитель n.2 Внутренний цикл содержит выбор минимального элемента — O(n)
+ пересчет оценок длин для соседей выбранного узла — O(n).3 Итого — O(n2).
64 / 86
Трудоемкость алгоритма Дейкстры
ЛеммаТрудоемкость алгоритма Дейкстры составляет O(n2) операций, гдеn — число вершин.
Доказательство.1 Внешний цикл по вершинам дает множитель n.2 Внутренний цикл содержит выбор минимального элемента — O(n)
+ пересчет оценок длин для соседей выбранного узла — O(n).3 Итого — O(n2).
65 / 86
Кратчайшие пути в графе с отрицательными весами
Задача
«Кратчайшие пути с отрицательными расстояниями».Задан ориентированный граф G = (V , E ) и весовая функция на дугахwe : e → Z , отображающая ребра в целые числа, такая, что в графенет цикла отрицательной длины. Найти минимальные длины путеймежду всеми парами вершин.
66 / 86
Алгоритм Флойда-Уоршолла
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
Выполнение алгоритма Флойда-Уоршолла
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
Выполнение алгоритма Флойда-Уоршолла
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
Выполнение алгоритма Флойда-Уоршолла
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
Выполнение алгоритма Флойда-Уоршолла
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
Выполнение алгоритма Флойда-Уоршолла
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
Минимальное остовное деревоЗадача
«Минимальное остовное дерево» (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
Алгоритм Прима
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
Выполнение алгоритма Прима
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
Выполнение алгоритма Прима
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
Выполнение алгоритма Прима
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
Выполнение алгоритма Прима
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
Выполнение алгоритма Прима
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
Сортировка
Задача«Сортировка» (Sorting)Имеется произвольный массив A : a1, . . . , an.Tребуется путем сравнений отсортировать этот массив таким образом,чтобы элементы расположились в порядке возрастания (илиубывания), то есть ai1 ≤ ai2 ≤ . . . ≤ ain.
80 / 86
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
Cортировка слиянием: Выполнение
82 / 86
Cортировка слиянием: Упражнения
УпражнениеНайдите такие упорядоченные последовательности A и B , на которыхпроцедура «merge» выполнит |A|+ 1 сравнений.
УпражнениеНайдите такие упорядоченные последовательности A и B , на которыхпроцедура «merge» выполнит |A|+ |B| − 1 сравнений.
83 / 86
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
�Карта памяти� лекции
85 / 86