SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
Лекция 11:
Методы разработки
алгоритмов
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Контроль
2
1. Что такое остовное дерево (Spanning tree)?
2. Что такое остовное дерево минимальной стоимости
(Minimum spanning tree)?
3. Какие алгоритмы построения остовных деревьев
минимальной стоимости Вам известны?
4. Приведите примеры практического использования
задачи о построении остовного дерева минимальной
стоимости.
Основные методы разработки алгоритмов
33
Метод грубой силы (brute force, исчерпывающий поиск –
полный перебор).
Декомпозиция (decomposition, “разделяй и властвуй”)
Уменьшение размера задачи (“уменьшай и властвуй”)
Преобразование (“преобразуй и властвуй”)
Жадные алгоритмы (greedy algorithms)
Динамическое программирование (dynamic programming)
Поиск с возвратом (backtracking)
Локальный поиск (local search)
Метод грубой силы (brute force)
44
Метод грубой силы – решение “в лоб”.
Основан на прямом подходе к решению задачи.
Опирается на определения понятий, используемых в
постановке задачи.
Пример. Задач возведения числа a в неотрицательную
степень n.
По определению an = a · a ·… · a
n
Метод грубой силы (brute force)
55
function pow(a, n)
pow = 1
for i = 1 to n do
pow = pow * a
end for
end function
Из определения следует простейший алгоритм
T = O(n)
Метод грубой силы (brute force)
66
Примеры алгоритмов, основанных на методе грубой силы:
Умножение матриц по определению
Поиск наибольшего/наименьшего элемента в списке
Сортировка выбором (Selection sort)
Пузырьковая сортировка (Bubble sort)
Поиск подстроки в строке методом грубой силы
Поиск пары ближайших точек на плоскоси
…
function strcmp(s, p)
n = strlen(s)
m = strlen(p)
for i = 1 to n – m do
j = 1
while j <= m and s[i + j - 1] = p[j] do
j = j + 1
end while
if j > m then
return i
end if
end for
end function
Поиск подстроки в строке (String match)
77
H e l l o W o r l d
l o W o
s
p
i = 4
Поиск подстроки p в строке s методом грубой силы:
Поиск пары ближайших точек (Closest points)
88
Задача. Во множестве n точек необходимо найти
две, расстояние между которыми минимально
(точки ближе других друг к другу).
Координаты всех точек известны: Pi = (xi, yi).
Расстояние d(i, j) между парой точек вычисляется
как евклидово:
d(i, j) = sqrt((xi – xj)2 + (yi – yj)2)
function SearchClosestPoints()
dmin = Infinity
for i = 1 to n – 1 do
for j = i + 1 to n do
d = sqrt((x[i] – x[j])^2 +
(y[i] – y[j])^2)
if d < dmin then
dmin = d
imin = i
jmin = j
end if
end for
end for
return imin, jmin
end function
Поиск пары ближайших точек (Closest points)
99
Какова вычислительная
сложность алгоритма?
T = O(n2)
Метод декомпозиции (Decomposition)
1010
Метод декомпозиции (decomposition method,
метод “разделяй и властвуй” – “divide and conquer”).
Структура алгоритмов, основанных на этом методе:
1. Задача разбивается на несколько меньших
экземпляров той же задачи.
2. Решаются сформированные меньшие экземпляры
задачи (обычно рекурсивно).
3. При необходимости решение исходной задачи
формируется как комбинация решений меньших
экземпляров задачи.
Вычисление суммы чисел
1111
Задача. Вычислить сумму чисел a0, a1, .., an – 1.
Алгоритм на основе метода грубой силы
(brute force, по определению):
function sum(a[0, n - 1])
sum = 0
for i = 0 to n - 1 do
sum = sum + a[i]
end for
end function
T = O(n)
Вычисление суммы чисел
1212
Задача. Вычислить сумму чисел a0, a1, .., an – 1.
Алгоритм на основе метода декомпозиции:
ࢇ૙ + ⋯ + ࢇ࢔ି૚ = ࢇ૙ + ⋯ + ࢇ ࢔ ૛⁄ ି૚ + ࢇ ࢔ ૛⁄ + … + ࢇ࢔ି૚
4 + 5 + 1 + 9 + 13 + 11 + 7 = (4 + 5 + 1) + (9 + 13 + 11 + 7) =
= (4 + (5 + 1)) + ((9 + 13) + (11 + 7)) = 50
int sum(int *a, int l, int r)
{
int k;
if (l == r)
return a[l];
k = (r - l + 1) / 2;
return sum(a, l, l + k - 1) +
sum(a, l + k, r);
}
int main()
{
s = sum(a, 0, N - 1);
}
Вычисление суммы чисел (декомпозиция)
1313
Вычисление суммы чисел (декомпозиция)
1414
[0, 6]
[0, 2] [3, 6]
[0, 0] [1, 2]
[1, 1] [2, 2]
[3, 4]
[3, 3] [4, 4]
[5, 6]
[5, 5] [6, 6]
4 + 5 + 1 + 9 + 13 + 11 + 7 = (4 + 5 + 1) + (9 + 13 + 11 + 7) =
= (4 + (5 + 1)) + ((9 + 13) + (11 + 7)) = 50
Структура рекурсивных вызовов функции sum(0, 6)
int pow_decomp(int a, int n)
{
int k;
if (n == 1)
return a;
k = n / 2;
return pow_decomp(a, k) * pow_decomp(a, n - k);
}
Возведение числа а в степень n
1515
Задача. Возвести число a неотрицательную степень n.
Алгоритм на основе метода декомпозиции:
ܽ௡
= ൜ܽ ௡ ଶ⁄
∙ ܽ௡ି ௡ ଶ⁄
, ݊ > 1
ܽ, ݊ = 1
T = O(n)
Метод декомпозиции (Decomposition)
1616
В общем случае задача размера n делится на экземпляры
задачи размера n / b, из которых a требуется решить
(b > 1, a ≥ 0).
Время T(n) работы алгоритмы, основанного на методе
декомпозиции есть
T(n) = aT(n / b) + f(n), (*)
где f(n) – функция, учитывающая затраты времени на
разделение задачи на экземпляры и комбинирование их
решений.
Рекуррентное соотношение (*) –
это обобщённое рекуррентное уравнение декомпозиции
(general divide-and-conquer recurrence)
Метод декомпозиции (Decomposition)
1717
Теорема. Если в обобщённом рекуррентном уравнении
декомпозициифункция f(n) = Θ(nd), где d ≥ 0, то
ܶ ݊ = ൞
ߠ ݊ௗ
, если	ܽ < ܾௗ
,
ߠ ݊ௗ
log ݊ , если	ܽ = ܾௗ
,
ߠ ݊୪୭୥್௔
, если	ܽ > ܾௗ
.
Анализ алгоритма суммирования чисел
1818
Алгоритм суммирования n чисел:
b = 2 (интервал делим на 2 части)
а = 2 (обе части обрабатываем)
f(n) = 1
(трудоемкость разделения интервала на 2 подмножества
и слияние результатов (операция “+”)выполняется за
время O(1))
T(n) = 2T(n / 2) + 1
Так как, f(n) = 1 = Θ(n0), то d = 0, следовательно по теореме
ܶ ݊ = ߠ ݊୪୭୥మଶ
= ߠ ݊
Метод декомпозиции (Decomposition)
1919
Примеры алгоритмов, основанных на методе декомпозиции:
Сортировка слиянием (Mergesort)
Быстрая сортировка (QuickSort)
Бинарный поиск (Binary search)
Обход двоичного дерева (Tree traverse)
Решение задачи о поиске пары ближайших точек
Решение задачи о поиске выпуклой оболочки
Умножение матриц алгоритмом Штрассена
…
Сортировка слиянием (Mergesort)
2020
function MergeSort(a[0, n - 1])
if n > 1 then
k = n / 2
Copy(a[0, k - 1], b[0, k - 1])
Copy(a[k, n - 1], c[0, k - 1])
MergeSort(b)
MergeSort(c)
Merge(b, c, a)
end if
end function
Сортировка слиянием (Mergesort)
2121
function Merge(b[p], c[q], a[n])
i = j = k = 0
while i < p and j < q do
if b[i] ≤ c[j] then
a[k] = b[i]
i = i + 1
else
a[k] = c[j]
j = j + 1
end if
k = k + 1
end while
if i = p then
Copy(c[j, q - 1], a[k, p + q - 1])
else
Copy(b[i, p - 1], a[k, p + q - 1])
end if
end function
Анализ алгоритма сортировки слиянием
2222
b = 2 (массив делим на 2 части)
а = 2 (обе части обрабатываем)
f(n) = Tmerge(n) – количество сравнений в процессе слияния
массивов. В худшем случае Tmerge(n) = n – 1
T(n) = 2T(n / 2) + n – 1
Так как, f(n) = n– 1 = Θ(n), то d = 1, следовательно по
теореме
ܶ ݊ = ߠ ݊ௗ
log ݊ = ߠ ݊ log ݊
Теоретический минимум трудоемксоти алгоритмов сортировки,
основанных на сравнениях, есть logଶ ݊! ≈ ݊logଶ ݊ − 1.44݊
Пакет gnuplot
2323
100000 0.018952
200000 0.035840
300000 0.054507
400000 0.073788
500000 0.093617
600000 0.113488
700000 0.132952
800000 0.152574
900000 0.173556
1000000 0.193220
Файл mergesort.dat
Пакет gnuplot
2424
set terminal pngcairo size 800,480 enhanced
set output 'mergesort.png'
set key top left
set grid
set format y "%.6f"
set xlabel "Number of elements" font "Times, 16"
set format x "%.0f"
set ylabel "Execution time (sec)" font "Times, 16"
set xtics 100000 font "Times, 12"
set ytics font "Times, 12"
plot "mergesort.dat" using 1:2 title "MergeSort"
with linespoints ls 1,
"quicksort.dat" using 1:2 title "QuickSort“
with linespoints ls 2
Файл graph.pt
Пакет gnuplot
2525
$ gnuplot ./graph.pt
Задание
2626
Оценить трудоемкость алгоритма быстрой сортировки
с использованием обобщённого рекуррентного уравнения
декомпозиции (Levitin, С. 174).

Weitere ähnliche Inhalte

Was ist angesagt?

Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
ИНТЕГРАЛ ТАЛБАЙ /Integral/
 ИНТЕГРАЛ ТАЛБАЙ /Integral/ ИНТЕГРАЛ ТАЛБАЙ /Integral/
ИНТЕГРАЛ ТАЛБАЙ /Integral/Khishighuu Myanganbuu
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахMikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...AIST
 
Maths 18-01-23
Maths 18-01-23Maths 18-01-23
Maths 18-01-23foxford-ru
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Mikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Theoretical mechanics department
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 

Was ist angesagt? (20)

Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
ИНТЕГРАЛ ТАЛБАЙ /Integral/
 ИНТЕГРАЛ ТАЛБАЙ /Integral/ ИНТЕГРАЛ ТАЛБАЙ /Integral/
ИНТЕГРАЛ ТАЛБАЙ /Integral/
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графе
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графах
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Vzaimno obratnye funkcii
Vzaimno obratnye funkciiVzaimno obratnye funkcii
Vzaimno obratnye funkcii
 
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
E. Ostheimer, V. G. Labunets, D. E. Komarov, T. S. Fedorova and V. V. Ganzha ...
 
Maths 18-01-23
Maths 18-01-23Maths 18-01-23
Maths 18-01-23
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 

Andere mochten auch

Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...
Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...
Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Лекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицыЛекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицыMikhail Kurnosov
 

Andere mochten auch (14)

Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...
Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...
Лекция 2: Оптимизация ветвлений и циклов (Branch prediction and loops optimiz...
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицыЛекция 6: Словари. Хеш-таблицы
Лекция 6: Словари. Хеш-таблицы
 

Ähnlich wie Лекция 13: Трудноразрешимые задачи. NP-полнота.

чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Technosphere1
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторика01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторикаRoman Brovko
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияPositive Hack Days
 
ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3Andrey Danilchenko
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...it-people
 
20101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture0820101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture08Computer Science Club
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыsimple_people
 
Use of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signatureUse of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signatureAndrei Poliakov
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяMikhail Kurnosov
 

Ähnlich wie Лекция 13: Трудноразрешимые задачи. NP-полнота. (20)

чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторика01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторика
 
8
88
8
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисления
 
ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3ITMO RecSys course. Autumn 2014. Lecture 3
ITMO RecSys course. Autumn 2014. Lecture 3
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
DUMP-2013 Наука и жизнь - Приближённый подсчёт количества уникальных элементо...
 
20101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture0820101125 proof complexity_hirsch_lecture08
20101125 proof complexity_hirsch_lecture08
 
Лекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмыЛекция 11 Приближенные алгоритмы
Лекция 11 Приближенные алгоритмы
 
Use of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signatureUse of eliptic curves for generating digital signature
Use of eliptic curves for generating digital signature
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревья
 

Mehr von Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

Mehr von Mikhail Kurnosov (16)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

Лекция 13: Трудноразрешимые задачи. NP-полнота.

  • 1. Лекция 11: Методы разработки алгоритмов Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net
  • 2. Контроль 2 1. Что такое остовное дерево (Spanning tree)? 2. Что такое остовное дерево минимальной стоимости (Minimum spanning tree)? 3. Какие алгоритмы построения остовных деревьев минимальной стоимости Вам известны? 4. Приведите примеры практического использования задачи о построении остовного дерева минимальной стоимости.
  • 3. Основные методы разработки алгоритмов 33 Метод грубой силы (brute force, исчерпывающий поиск – полный перебор). Декомпозиция (decomposition, “разделяй и властвуй”) Уменьшение размера задачи (“уменьшай и властвуй”) Преобразование (“преобразуй и властвуй”) Жадные алгоритмы (greedy algorithms) Динамическое программирование (dynamic programming) Поиск с возвратом (backtracking) Локальный поиск (local search)
  • 4. Метод грубой силы (brute force) 44 Метод грубой силы – решение “в лоб”. Основан на прямом подходе к решению задачи. Опирается на определения понятий, используемых в постановке задачи. Пример. Задач возведения числа a в неотрицательную степень n. По определению an = a · a ·… · a n
  • 5. Метод грубой силы (brute force) 55 function pow(a, n) pow = 1 for i = 1 to n do pow = pow * a end for end function Из определения следует простейший алгоритм T = O(n)
  • 6. Метод грубой силы (brute force) 66 Примеры алгоритмов, основанных на методе грубой силы: Умножение матриц по определению Поиск наибольшего/наименьшего элемента в списке Сортировка выбором (Selection sort) Пузырьковая сортировка (Bubble sort) Поиск подстроки в строке методом грубой силы Поиск пары ближайших точек на плоскоси …
  • 7. function strcmp(s, p) n = strlen(s) m = strlen(p) for i = 1 to n – m do j = 1 while j <= m and s[i + j - 1] = p[j] do j = j + 1 end while if j > m then return i end if end for end function Поиск подстроки в строке (String match) 77 H e l l o W o r l d l o W o s p i = 4 Поиск подстроки p в строке s методом грубой силы:
  • 8. Поиск пары ближайших точек (Closest points) 88 Задача. Во множестве n точек необходимо найти две, расстояние между которыми минимально (точки ближе других друг к другу). Координаты всех точек известны: Pi = (xi, yi). Расстояние d(i, j) между парой точек вычисляется как евклидово: d(i, j) = sqrt((xi – xj)2 + (yi – yj)2)
  • 9. function SearchClosestPoints() dmin = Infinity for i = 1 to n – 1 do for j = i + 1 to n do d = sqrt((x[i] – x[j])^2 + (y[i] – y[j])^2) if d < dmin then dmin = d imin = i jmin = j end if end for end for return imin, jmin end function Поиск пары ближайших точек (Closest points) 99 Какова вычислительная сложность алгоритма? T = O(n2)
  • 10. Метод декомпозиции (Decomposition) 1010 Метод декомпозиции (decomposition method, метод “разделяй и властвуй” – “divide and conquer”). Структура алгоритмов, основанных на этом методе: 1. Задача разбивается на несколько меньших экземпляров той же задачи. 2. Решаются сформированные меньшие экземпляры задачи (обычно рекурсивно). 3. При необходимости решение исходной задачи формируется как комбинация решений меньших экземпляров задачи.
  • 11. Вычисление суммы чисел 1111 Задача. Вычислить сумму чисел a0, a1, .., an – 1. Алгоритм на основе метода грубой силы (brute force, по определению): function sum(a[0, n - 1]) sum = 0 for i = 0 to n - 1 do sum = sum + a[i] end for end function T = O(n)
  • 12. Вычисление суммы чисел 1212 Задача. Вычислить сумму чисел a0, a1, .., an – 1. Алгоритм на основе метода декомпозиции: ࢇ૙ + ⋯ + ࢇ࢔ି૚ = ࢇ૙ + ⋯ + ࢇ ࢔ ૛⁄ ି૚ + ࢇ ࢔ ૛⁄ + … + ࢇ࢔ି૚ 4 + 5 + 1 + 9 + 13 + 11 + 7 = (4 + 5 + 1) + (9 + 13 + 11 + 7) = = (4 + (5 + 1)) + ((9 + 13) + (11 + 7)) = 50
  • 13. int sum(int *a, int l, int r) { int k; if (l == r) return a[l]; k = (r - l + 1) / 2; return sum(a, l, l + k - 1) + sum(a, l + k, r); } int main() { s = sum(a, 0, N - 1); } Вычисление суммы чисел (декомпозиция) 1313
  • 14. Вычисление суммы чисел (декомпозиция) 1414 [0, 6] [0, 2] [3, 6] [0, 0] [1, 2] [1, 1] [2, 2] [3, 4] [3, 3] [4, 4] [5, 6] [5, 5] [6, 6] 4 + 5 + 1 + 9 + 13 + 11 + 7 = (4 + 5 + 1) + (9 + 13 + 11 + 7) = = (4 + (5 + 1)) + ((9 + 13) + (11 + 7)) = 50 Структура рекурсивных вызовов функции sum(0, 6)
  • 15. int pow_decomp(int a, int n) { int k; if (n == 1) return a; k = n / 2; return pow_decomp(a, k) * pow_decomp(a, n - k); } Возведение числа а в степень n 1515 Задача. Возвести число a неотрицательную степень n. Алгоритм на основе метода декомпозиции: ܽ௡ = ൜ܽ ௡ ଶ⁄ ∙ ܽ௡ି ௡ ଶ⁄ , ݊ > 1 ܽ, ݊ = 1 T = O(n)
  • 16. Метод декомпозиции (Decomposition) 1616 В общем случае задача размера n делится на экземпляры задачи размера n / b, из которых a требуется решить (b > 1, a ≥ 0). Время T(n) работы алгоритмы, основанного на методе декомпозиции есть T(n) = aT(n / b) + f(n), (*) где f(n) – функция, учитывающая затраты времени на разделение задачи на экземпляры и комбинирование их решений. Рекуррентное соотношение (*) – это обобщённое рекуррентное уравнение декомпозиции (general divide-and-conquer recurrence)
  • 17. Метод декомпозиции (Decomposition) 1717 Теорема. Если в обобщённом рекуррентном уравнении декомпозициифункция f(n) = Θ(nd), где d ≥ 0, то ܶ ݊ = ൞ ߠ ݊ௗ , если ܽ < ܾௗ , ߠ ݊ௗ log ݊ , если ܽ = ܾௗ , ߠ ݊୪୭୥್௔ , если ܽ > ܾௗ .
  • 18. Анализ алгоритма суммирования чисел 1818 Алгоритм суммирования n чисел: b = 2 (интервал делим на 2 части) а = 2 (обе части обрабатываем) f(n) = 1 (трудоемкость разделения интервала на 2 подмножества и слияние результатов (операция “+”)выполняется за время O(1)) T(n) = 2T(n / 2) + 1 Так как, f(n) = 1 = Θ(n0), то d = 0, следовательно по теореме ܶ ݊ = ߠ ݊୪୭୥మଶ = ߠ ݊
  • 19. Метод декомпозиции (Decomposition) 1919 Примеры алгоритмов, основанных на методе декомпозиции: Сортировка слиянием (Mergesort) Быстрая сортировка (QuickSort) Бинарный поиск (Binary search) Обход двоичного дерева (Tree traverse) Решение задачи о поиске пары ближайших точек Решение задачи о поиске выпуклой оболочки Умножение матриц алгоритмом Штрассена …
  • 20. Сортировка слиянием (Mergesort) 2020 function MergeSort(a[0, n - 1]) if n > 1 then k = n / 2 Copy(a[0, k - 1], b[0, k - 1]) Copy(a[k, n - 1], c[0, k - 1]) MergeSort(b) MergeSort(c) Merge(b, c, a) end if end function
  • 21. Сортировка слиянием (Mergesort) 2121 function Merge(b[p], c[q], a[n]) i = j = k = 0 while i < p and j < q do if b[i] ≤ c[j] then a[k] = b[i] i = i + 1 else a[k] = c[j] j = j + 1 end if k = k + 1 end while if i = p then Copy(c[j, q - 1], a[k, p + q - 1]) else Copy(b[i, p - 1], a[k, p + q - 1]) end if end function
  • 22. Анализ алгоритма сортировки слиянием 2222 b = 2 (массив делим на 2 части) а = 2 (обе части обрабатываем) f(n) = Tmerge(n) – количество сравнений в процессе слияния массивов. В худшем случае Tmerge(n) = n – 1 T(n) = 2T(n / 2) + n – 1 Так как, f(n) = n– 1 = Θ(n), то d = 1, следовательно по теореме ܶ ݊ = ߠ ݊ௗ log ݊ = ߠ ݊ log ݊ Теоретический минимум трудоемксоти алгоритмов сортировки, основанных на сравнениях, есть logଶ ݊! ≈ ݊logଶ ݊ − 1.44݊
  • 23. Пакет gnuplot 2323 100000 0.018952 200000 0.035840 300000 0.054507 400000 0.073788 500000 0.093617 600000 0.113488 700000 0.132952 800000 0.152574 900000 0.173556 1000000 0.193220 Файл mergesort.dat
  • 24. Пакет gnuplot 2424 set terminal pngcairo size 800,480 enhanced set output 'mergesort.png' set key top left set grid set format y "%.6f" set xlabel "Number of elements" font "Times, 16" set format x "%.0f" set ylabel "Execution time (sec)" font "Times, 16" set xtics 100000 font "Times, 12" set ytics font "Times, 12" plot "mergesort.dat" using 1:2 title "MergeSort" with linespoints ls 1, "quicksort.dat" using 1:2 title "QuickSort“ with linespoints ls 2 Файл graph.pt
  • 26. Задание 2626 Оценить трудоемкость алгоритма быстрой сортировки с использованием обобщённого рекуррентного уравнения декомпозиции (Levitin, С. 174).