SlideShare a Scribd company logo
1 of 63
Download to read offline
Лекция 11
Методы разработки
алгоритмов
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net/teaching
Основные методы разработки алгоритмов
22
 Метод грубой силы (brute force, исчерпывающий поиск –
полный перебор)
 Декомпозиция (decomposition, “разделяй и властвуй”)
 Уменьшение размера задачи (“уменьшай и властвуй”)
 Преобразование (“преобразуй и властвуй”)
 Жадные алгоритмы (greedy algorithms)
 Динамическое программирование (dynamic programming)
 Поиск с возвратом (backtracking)
 Локальный поиск (local search)
 Метод грубой силы (brute force) – решение “в лоб”
 Основан на прямом подходе к решению задачи
 Опирается на определения понятий, используемых
в постановке задачи
 Пример
Задача возведения числа a в неотрицательную степень n
Алгоритм решения “в лоб”
По определению an = a ∙ a ∙ … ∙ a
Метод грубой силы (brute force)
33
n
Метод грубой силы (brute force)
44
function pow(a, n)
pow = 1
for i = 1 to n do
pow = pow * a
end for
end function
Из определения следует простейший алгоритм
TPow = O(n)
Метод грубой силы (brute force)
55
Примеры алгоритмов, основанных на методе грубой силы:
 Умножение матриц по определению O(n3)
 Линейный поиск наибольшего/наименьшего элемента
в списке
 Сортировка выбором (Selection sort, O(n2))
 Пузырьковая сортировка (Bubble sort, O(n2))
 Поиск подстроки в строке методом грубой силы
 Поиск перебором пары ближайших точек на плоскости
 …
6
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)
H e l l o W o r l d
l o W o
s
p
i = 4
 Поиск подстроки p в строке s методом грубой силы:
Поиск пары ближайших точек (Closest points)
77
 Задача. Во множестве из n точек необходимо
найти две, расстояние между которыми
минимально (точки ближе других друг к другу)
 Координаты всех точек известны: Pi = (xi, yi)
 Расстояние d(i, j) между парой точек
вычисляется как евклидово:
d(i, j) = sqrt((xi – xj)2 + (yi – yj)2)
8
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)
Какова вычислительная
сложность алгоритма?
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)
Какова вычислительная
сложность алгоритма?
T = O(n2)
Метод декомпозиции (Decomposition)
1010
 Метод декомпозиции (decomposition method,
метод “разделяй и властвуй” – “divide and conquer”)
 Структура алгоритмов, основанных на этом методе:
1. Задача разбивается на несколько меньших
экземпляров той же задачи
2. Решаются сформированные меньшие экземпляры
задачи (обычно рекурсивно)
3. При необходимости решение исходной задачи
формируется как комбинация решений меньших
экземпляров задачи
Problem =
SubProblemA + SubProblemB
A B
Problem
Вычисление суммы чисел
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
TSum = 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)
Возведение числа а в степень n
1515
 Задача. Возвести число a неотрицательную степень n
 Решение. Алгоритм на основе метода декомпозиции:
𝑎 𝑛 = 𝑎 𝑛 2
∙ 𝑎 𝑛− 𝑛 2
, 𝑛 > 1
𝑎, 𝑛 = 1
TPow = O(n)
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);
}
Метод декомпозиции (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 𝑛 , если 𝑎 = 𝑏 𝑑
,
𝜃 𝑛log 𝑏 𝑎
, если 𝑎 > 𝑏 𝑑
.
Анализ алгоритма суммирования n чисел
1818
 b = 2 (интервал делим на 2 части)
 а = 2 (обе части обрабатываем)
 f(n) = 1
(трудоемкость разделения интервала на 2 подмножества
и слияние результатов (операция “+”) выполняется
за время O(1))
T(n) = 2T(n / 2) + 1
 Так как f(n) = 1 = n0, следовательно d = 0,
тогда согласно теореме сложность алгоритма
суммирования n чисел
𝑇 𝑛 = 𝜃 𝑛log22 = 𝜃 𝑛
Метод декомпозиции (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 𝑛
 Теоретический минимум вычислительной сложности алгоритмов
сортировки, основанных на сравнениях, есть
log2 𝑛! ≈ 𝑛log2 𝑛 − 1.44𝑛
Динамическое программирование
2323
 Динамическое программирование
(Dynamic programming) – метод решения задач
(преимущественно оптимизационных) путем разбиения
их на более простые подзадачи
 Решение задачи идет от простых подзадач к сложным,
периодически используя ответы для уже решенных
подзадач (как правило, через рекуррентные соотношения)
 Основная идея – запоминать решения встречающихся
подзадач на случай, если та же подзадача встретится
вновь
 Теория динамического программирования разработана
Р. Беллманом в 1940 – 50-х годах
Последовательность Фибоначчи
2424
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
F(n) = F(n – 1) + F(n – 2), при n > 1
F(0) = 0, F(1) = 1
 Задача
Вычислить n-й член последовательности Фибоначчи
F(n) = ?
Последовательность Фибоначчи
2525
function Fibo(n)
if n <= 1 then
return n
end if
return Fibo(n - 1) + Fibo(n - 2)
end function
Последовательность Фибоначчи
2626
Fibo(5)
Fibo(4) Fibo(3)
Fibo(3) Fibo(2) Fibo(2) Fibo(1)
Fibo(1) Fibo(0)Fibo(2) Fibo(1)
Fibo(1) Fibo(0)
Fibo(1) Fibo(0)
Некоторые элементы последовательности
вычисляются повторно: Fibo(3), Fibo(2), …
Рекурсивные вызовы функции Fibo
В динамическом программировании используются
таблицы, в которых сохраняются решения подзадач
(жертвуем памятью ради времени)
Последовательность Фибоначчи
2727
function Fibo(n)
F[0] = 0
F[1] = 1
for i = 2 to n do
F[i] = F[i - 1] + F[i - 2]
end for
return F[n]
end function
“Жадные” алгоритмы (Greedy)
2828
 “Жадный” алгоритм (Greedy algorithms) – алгоритм,
принимающий на каждом шаге локально-оптимальное
решение
 Предполагается, что конечное решение окажется
оптимальным
 Примеры “жадных” алгоритмов:
o алгоритм Прима
o алгоритм Курскала
o алгоритм Дейкстры
o алгоритм Хаффмана (кодирования)
Задача о размене (Change-making problem)
2929
 Задача
Имеется неограниченное количество монет номиналом
(достоинством) a1 < a2 < … < an
 Требуется выдать сумму S наименьшим числом монет
 Пример
Имеются монеты достоинством 1, 2, 5 и 10 рублей
Выдать сумму S = 27 рублей
 “Жадное” решение (алгоритм):
2 монеты по 10 руб., 1 по 5, 1 по 2
 На каждом шаге берётся наибольшее
возможное количество монет достоинства an
(от большего к меньшему)
Задача о размене (Change-making problem)
3030
 Задача
Имеется неограниченное количество монет номиналом
(достоинством) a1 < a2 < … < an
 Требуется выдать сумму S наименьшим числом монет
 Пример
Имеются монеты достоинством 1, 5 и 7 рублей
Выдать сумму S = 24 рубля
 Решение жадным алгоритмом: 3 по 7, 3 по 1 = 6 монет
 Оптимальное решение: 2 по 7, 2 по 5 = 4 монеты
Код Хаффмана
3131
 Деревья Хаффмана (Huffman) и коды Хаффмана
используются для сжатия информации путем
кодирования часто встречающихся символов короткими
последовательностями битов
 Предложен Д. А. Хаффманом в 1952 году (США, MIT)
Код Хаффмана
3232
 Задано множество символов и известны вероятности
их появления в тексте (в файле)
 A = {a1, a2, …, an} – множество символов (алфавит)
 P = {p1, p2, …, pn} – вероятности появления символов
 Требуется каждому символу сопоставить код –
последовательность битов (codeword)
С(A, P) = {c1, c2, …, cn}
Пример
Символ A B C D _
Код (биты) 11 100 00 01 101
Код Хаффмана
3333
 Шаг 1. Создается n одноузловых деревьев
 В каждом узле записан символ алфавита и вероятность
его повеления в тексте
A
0.35
B
0.1
C
0.2
D
0.2
_
0.15
Код Хаффмана
3434
 Шаг 2. Находим два дерева с наименьшими вероятностями
и делаем их левым и правым поддеревьями нового дерева
– создаем родительский узел
 В созданном узле записываем сумму вероятностей
поддеревьев
 Повторяем шаг 2 пока не получим одно дерево
На каждом шаге осуществляется “жадный выбор” –
выбираем два узла с наименьшими вероятностями
Код Хаффмана
3535
Символ B _ C D A
Вероятность 0.1 0.15 0.2 0.2 0.35
B _ C D A
0.25
Код Хаффмана
3636
Символ B _ C D A
Вероятность 0.25 0.2 0.2 0.35
B _ C D A
0.25
Код Хаффмана
3737
Символ C D B, _ A
Вероятность 0.4 0.25 0.35
B _C D A
0.4
0.25
Код Хаффмана
3838
Символ C D B, _ A
Вероятность 0.4 0.6
B _
C D
A
0.4 0.6
0.25
Код Хаффмана
3939
B _
C D
A
0.4 0.6
1.0
root
0.25
Код Хаффмана
4040
B _
C D
A
0.4 0.6
1.0
 Часто встречающиеся символы получили короткие коды
 Ни один код не является префиксом другого
1
1
0
0 1 0
10
Символ Код
A 11
B 100
C 00
D 01
_ 101
 Левое ребро – 1
 Правое ребро – 0
Поиск с возвратом (Backtracking)
41
 Поиск с возвратом (Backtracking) – метод решения
задач, в которых необходим полный перебор всех
возможных вариантов в некотором множестве М
 “Построить все возможные варианты …”,
“Сколько существует способов …”, “Есть ли способ …”.
 Термин Backtrack введен в 1950 г. D. H. Lehmer
 Примеры задач:
o Задача коммивояжёра
o Подбор пароля
o Задача о восьми ферзях
o Задача о ранце
o Раскраска карты
41
Поиск выхода из лабиринта
4242
6 9
1 1
1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 1 1 1
1 0 0 1 1 0 0 0 1
1 1 0 0 0 0 1 0 1
1 0 0 1 0 1 1 0 1
1 1 1 1 0 1 1 1 1
6 строк, 9 столбцов
Старт: cтрока 1, столбец 1
 1 – стена
 0 – проход
 Разрешено ходить влево, вправо, вверх и вниз
Поиск выхода из лабиринта (Backtracking)
4343
int main(int argc, char **argv)
{
if (argc < 2) {
fprintf(stderr,
"usage: maze <maze-file>n");
exit(1);
}
load_maze(argv[1]);
print_maze();
backtrack(startrow, startcol);
printf("Exit not foundn");
return 0;
}
Поиск выхода из лабиринта
4444
void backtrack(int row, int col)
{
int drow[4] = {-1, 0, 1, 0};
int dcol[4] = {0, 1, 0, -1};
int nextrow, nextcol, i;
maze[row][col] = 2; // Встали на новую позицию
if (row == 0 || col == 0 ||
row == (nrows - 1) || col == (ncols - 1))
{
print_maze(); // Нашли выход
}
for (i = 0; i < 4; i++) {
nextrow = row + drow[i];
nextcol = col + dcol[i];
if (maze[nextrow][nextcol] == 0) // Проход есть?
backtrack(nextrow, nextcol);
}
maze[row * ncols + col] = 0;
}
Поиск выхода из лабиринта
4545
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 1 1 1
1 0 0 1 1 2 0 0 1
1 1 0 0 2 2 1 0 1
1 0 0 1 2 1 1 0 1
1 1 1 1 2 1 1 1 1
Общая структура метода backtracking
4646
int main()
{
backtracking(1);
}
void backtracking(int step)
{
save_variant();
if (is_solution_found()) {
print_solution();
exit(1);
}
for (i = 0; i < nvariants; i++) {
if (is_correct_variant())
backtracking(step + 1);
}
delete_variant();
}
Задача о восьми ферзях (eight queens puzzle)
47
 Классическая формулировка
Расставить на стандартной
64-клеточной шахматной доске
8 ферзей (королев) так, чтобы
ни один из них не находился
под боем другого
47
 Альтернативная формулировка
Заполнить матрицу размером 8×8 нулями и единицами
таким образом, чтобы сумма всех элементов матрицы
была равна 8, при этом сумма элементов ни в одном
столбце, строке или диагональном ряде матрицы не
превышала единицы
Задача о восьми ферзях (eight queens puzzle)
4848
 Задача впервые была решена в 1850 г.
Карлом Фридрихом Гаубом
(Carl Friedrich Gaub)
 Число возможных решений
на 64-клеточной доске: 92
Задача о восьми ферзях (eight queens puzzle)
4949
X
1
Задача о восьми ферзях (eight queens puzzle)
5050
X
1
X
X
X
X
X
X
2
…
Задача о восьми ферзях (eight queens puzzle)
5151
X
1
X
X
X
X
X
X
2
…X
X
X
…3
X
X
X
Задача о восьми ферзях (eight queens puzzle)
5252
X
1
X
X
X
X
X
X
2
…X
X
X
…3
X
X
X
…
8
Задача о восьми ферзях (eight queens puzzle)
5353
enum { N = 8 };
int board[N][N];
int main()
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
board[i][j] = 0;
}
}
backtrack(0);
return 0;
}
Задача о восьми ферзях (eight queens puzzle)
5454
void backtrack(int row)
{
int col;
if (row >= N) {
print_board();
}
for (col = 0; col < N; col++) {
if (is_correct_order(row, col)) {
board[row][col] = 1; // Ставим ферзя
backtrack(row + 1);
board[row][col] = 0; // Откат
}
}
}
Задача о восьми ферзях (eight queens puzzle)
5555
int is_correct_order(int row, int col)
{
int i, j;
if (row == 0)
return 1;
/* Проверка позиций сверху */
for (i = row - 1; i >= 0; i--) {
if (board[i][col] != 0)
return 0;
}
/* Проверить левую и правую диагонали... */
return 1;
}
X
Задача о восьми ферзях (eight queens puzzle)
5656
1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
Задача о раскраске графа в k цветов
5757
 Имеется граф G = (V, E) состоящий из n вершин
 Каждую вершину надо раскрасить в один из k цветов
так, чтобы смежные вершины были раскрашены
в разные цвета
Пример раскраски 10
вершин графа в 3 цвета
Задача о раскраске графа в k цветов
5858
int main()
{
backtracking(1);
}
void backtracking(int v)
{
if (v > nvertices) {
print_colors();
return; /* exit(0) */
}
for (i = 0; i < ncolors; i++) {
color[v - 1] = i;
if (is_correct_color(v))
backtracking(v + 1);
color[v - 1] = -1;
}
}
Задача о раскраске графа в k цветов
5959
/*
* Граф представлен матрицей смежности
* (см. graph.h, graph.c)
*/
int is_correct_color(int v)
{
int i;
for (i = 0; i < nvertices; i++) {
if (graph_get_edge(g, v, i + 1) > 0)
if (colors[v - 1] == colors[i])
return 0;
}
return 1;
}
Локальный поиск (local search)
6060
 Локальный поиск (Local search) – это метод
приближенного решения оптимизационных задач
 Жертвуем точностью решения для сокращения времени
работы алгоритма
 Примеры методов локального поиска:
o Имитация отжига (Simulated annealing)
o Генетические алгоритмы (Genetic algorithms)
o Поиск с запретами (Tabu search)
o …
Локальный поиск (local search)
6161
F(x)
x
Initial solution
Local
minimum
Global
minimum
Локальный поиск (local search)
6262
function LocalSearch()
x = InitialSolution()
repeat
x’ = GenerateNewSolution(x)
if F(x’) < F(x) then
x = x’
end if
while not ExitCondition(x, x’)
return x
end function
Домашнее чтение и задание
6363
 Прочитать в [Levitin] раздел о методах разработки
алгоритмов
 Оценить трудоемкость алгоритма быстрой сортировки
с использованием обобщённого рекуррентного уравнения
декомпозиции [Levitin, С. 174]

More Related Content

What's hot

Selection sort
Selection sortSelection sort
Selection sortJay Patel
 
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+ziedCours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+ziedWajdi Ben Helal
 
Linear Search
Linear SearchLinear Search
Linear SearchSWATHIR72
 
Algorithms Lecture 5: Sorting Algorithms II
Algorithms Lecture 5: Sorting Algorithms IIAlgorithms Lecture 5: Sorting Algorithms II
Algorithms Lecture 5: Sorting Algorithms IIMohamed Loey
 
Quick sort algorithn
Quick sort algorithnQuick sort algorithn
Quick sort algorithnKumar
 
Serie recurrents & arithmetiques
Serie recurrents & arithmetiquesSerie recurrents & arithmetiques
Serie recurrents & arithmetiquesmohamed_SAYARI
 
Fundamental computing algorithms
Fundamental computing algorithmsFundamental computing algorithms
Fundamental computing algorithmsGanesh Solanke
 
презентации по информатике
презентации по информатикепрезентации по информатике
презентации по информатикеNick535
 
PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...
PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...
PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...Umesh Kumar
 
Design and Analysis of Algorithms.pptx
Design and Analysis of Algorithms.pptxDesign and Analysis of Algorithms.pptx
Design and Analysis of Algorithms.pptxSyed Zaid Irshad
 
Divide and conquer 1
Divide and conquer 1Divide and conquer 1
Divide and conquer 1Kumar
 
Quick sort Algorithm Discussion And Analysis
Quick sort Algorithm Discussion And AnalysisQuick sort Algorithm Discussion And Analysis
Quick sort Algorithm Discussion And AnalysisSNJ Chaudhary
 

What's hot (20)

Selection sort
Selection sortSelection sort
Selection sort
 
Searching algorithms
Searching algorithmsSearching algorithms
Searching algorithms
 
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+ziedCours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
Cours+sql++ +base+de+données+-+bac+informatique+(2009-2010)++elève++khmiri+zied
 
Greedy method
Greedy method Greedy method
Greedy method
 
Linear Search
Linear SearchLinear Search
Linear Search
 
Algorithms Lecture 5: Sorting Algorithms II
Algorithms Lecture 5: Sorting Algorithms IIAlgorithms Lecture 5: Sorting Algorithms II
Algorithms Lecture 5: Sorting Algorithms II
 
Quick sort algorithn
Quick sort algorithnQuick sort algorithn
Quick sort algorithn
 
Serie recurrents & arithmetiques
Serie recurrents & arithmetiquesSerie recurrents & arithmetiques
Serie recurrents & arithmetiques
 
Sorting algorithms
Sorting algorithmsSorting algorithms
Sorting algorithms
 
Fundamental computing algorithms
Fundamental computing algorithmsFundamental computing algorithms
Fundamental computing algorithms
 
презентации по информатике
презентации по информатикепрезентации по информатике
презентации по информатике
 
Activity selection problem
Activity selection problemActivity selection problem
Activity selection problem
 
Résumer arithmétique
Résumer arithmétiqueRésumer arithmétique
Résumer arithmétique
 
Complexity of Algorithm
Complexity of AlgorithmComplexity of Algorithm
Complexity of Algorithm
 
PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...
PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...
PPT On Sorting And Searching Concepts In Data Structure | In Programming Lang...
 
Sorting Algorithms
Sorting AlgorithmsSorting Algorithms
Sorting Algorithms
 
Big o notation
Big o notationBig o notation
Big o notation
 
Design and Analysis of Algorithms.pptx
Design and Analysis of Algorithms.pptxDesign and Analysis of Algorithms.pptx
Design and Analysis of Algorithms.pptx
 
Divide and conquer 1
Divide and conquer 1Divide and conquer 1
Divide and conquer 1
 
Quick sort Algorithm Discussion And Analysis
Quick sort Algorithm Discussion And AnalysisQuick sort Algorithm Discussion And Analysis
Quick sort Algorithm Discussion And Analysis
 

Viewers also liked

Визуализация графов: теорема Татта о барицентрической укладке
Визуализация графов: теорема Татта о барицентрической укладкеВизуализация графов: теорема Татта о барицентрической укладке
Визуализация графов: теорема Татта о барицентрической укладкеAlex Dainiak
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаMikhail Kurnosov
 
этапы подготовки конференции
этапы подготовки конференцииэтапы подготовки конференции
этапы подготовки конференцииvlaroman
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска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
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Mikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиMikhail Kurnosov
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)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
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Mikhail Kurnosov
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Mikhail Kurnosov
 

Viewers also liked (20)

Визуализация графов: теорема Татта о барицентрической укладке
Визуализация графов: теорема Татта о барицентрической укладкеВизуализация графов: теорема Татта о барицентрической укладке
Визуализация графов: теорема Татта о барицентрической укладке
 
Лекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поискаЛекция 5: Бинарные деревья поиска
Лекция 5: Бинарные деревья поиска
 
этапы подготовки конференции
этапы подготовки конференцииэтапы подготовки конференции
этапы подготовки конференции
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачиЛекция 12: Трудноразрешимые задачи
Лекция 12: Трудноразрешимые задачи
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
 
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
 

Similar to Лекция 11: Методы разработки алгоритмов

Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Mikhail Kurnosov
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияPositive Hack Days
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторика01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторикаRoman Brovko
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Technosphere1
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс2berkas
 

Similar to Лекция 11: Методы разработки алгоритмов (20)

Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисления
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8
 
01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторика01 - Введение в дискретную математику. Теория множеств и комбинаторика
01 - Введение в дискретную математику. Теория множеств и комбинаторика
 
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
 

More from Mikhail Kurnosov

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)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
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)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
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)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
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 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...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 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...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 

Лекция 11: Методы разработки алгоритмов

  • 1. Лекция 11 Методы разработки алгоритмов Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net/teaching
  • 2. Основные методы разработки алгоритмов 22  Метод грубой силы (brute force, исчерпывающий поиск – полный перебор)  Декомпозиция (decomposition, “разделяй и властвуй”)  Уменьшение размера задачи (“уменьшай и властвуй”)  Преобразование (“преобразуй и властвуй”)  Жадные алгоритмы (greedy algorithms)  Динамическое программирование (dynamic programming)  Поиск с возвратом (backtracking)  Локальный поиск (local search)
  • 3.  Метод грубой силы (brute force) – решение “в лоб”  Основан на прямом подходе к решению задачи  Опирается на определения понятий, используемых в постановке задачи  Пример Задача возведения числа a в неотрицательную степень n Алгоритм решения “в лоб” По определению an = a ∙ a ∙ … ∙ a Метод грубой силы (brute force) 33 n
  • 4. Метод грубой силы (brute force) 44 function pow(a, n) pow = 1 for i = 1 to n do pow = pow * a end for end function Из определения следует простейший алгоритм TPow = O(n)
  • 5. Метод грубой силы (brute force) 55 Примеры алгоритмов, основанных на методе грубой силы:  Умножение матриц по определению O(n3)  Линейный поиск наибольшего/наименьшего элемента в списке  Сортировка выбором (Selection sort, O(n2))  Пузырьковая сортировка (Bubble sort, O(n2))  Поиск подстроки в строке методом грубой силы  Поиск перебором пары ближайших точек на плоскости  …
  • 6. 6 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) H e l l o W o r l d l o W o s p i = 4  Поиск подстроки p в строке s методом грубой силы:
  • 7. Поиск пары ближайших точек (Closest points) 77  Задача. Во множестве из n точек необходимо найти две, расстояние между которыми минимально (точки ближе других друг к другу)  Координаты всех точек известны: Pi = (xi, yi)  Расстояние d(i, j) между парой точек вычисляется как евклидово: d(i, j) = sqrt((xi – xj)2 + (yi – yj)2)
  • 8. 8 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) Какова вычислительная сложность алгоритма?
  • 9. 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) Какова вычислительная сложность алгоритма? T = O(n2)
  • 10. Метод декомпозиции (Decomposition) 1010  Метод декомпозиции (decomposition method, метод “разделяй и властвуй” – “divide and conquer”)  Структура алгоритмов, основанных на этом методе: 1. Задача разбивается на несколько меньших экземпляров той же задачи 2. Решаются сформированные меньшие экземпляры задачи (обычно рекурсивно) 3. При необходимости решение исходной задачи формируется как комбинация решений меньших экземпляров задачи Problem = SubProblemA + SubProblemB A B Problem
  • 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 TSum = 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. Возведение числа а в степень n 1515  Задача. Возвести число a неотрицательную степень n  Решение. Алгоритм на основе метода декомпозиции: 𝑎 𝑛 = 𝑎 𝑛 2 ∙ 𝑎 𝑛− 𝑛 2 , 𝑛 > 1 𝑎, 𝑛 = 1 TPow = O(n) 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); }
  • 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 𝑛 , если 𝑎 = 𝑏 𝑑 , 𝜃 𝑛log 𝑏 𝑎 , если 𝑎 > 𝑏 𝑑 .
  • 18. Анализ алгоритма суммирования n чисел 1818  b = 2 (интервал делим на 2 части)  а = 2 (обе части обрабатываем)  f(n) = 1 (трудоемкость разделения интервала на 2 подмножества и слияние результатов (операция “+”) выполняется за время O(1)) T(n) = 2T(n / 2) + 1  Так как f(n) = 1 = n0, следовательно d = 0, тогда согласно теореме сложность алгоритма суммирования n чисел 𝑇 𝑛 = 𝜃 𝑛log22 = 𝜃 𝑛
  • 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 𝑛  Теоретический минимум вычислительной сложности алгоритмов сортировки, основанных на сравнениях, есть log2 𝑛! ≈ 𝑛log2 𝑛 − 1.44𝑛
  • 23. Динамическое программирование 2323  Динамическое программирование (Dynamic programming) – метод решения задач (преимущественно оптимизационных) путем разбиения их на более простые подзадачи  Решение задачи идет от простых подзадач к сложным, периодически используя ответы для уже решенных подзадач (как правило, через рекуррентные соотношения)  Основная идея – запоминать решения встречающихся подзадач на случай, если та же подзадача встретится вновь  Теория динамического программирования разработана Р. Беллманом в 1940 – 50-х годах
  • 24. Последовательность Фибоначчи 2424 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, … F(n) = F(n – 1) + F(n – 2), при n > 1 F(0) = 0, F(1) = 1  Задача Вычислить n-й член последовательности Фибоначчи F(n) = ?
  • 25. Последовательность Фибоначчи 2525 function Fibo(n) if n <= 1 then return n end if return Fibo(n - 1) + Fibo(n - 2) end function
  • 26. Последовательность Фибоначчи 2626 Fibo(5) Fibo(4) Fibo(3) Fibo(3) Fibo(2) Fibo(2) Fibo(1) Fibo(1) Fibo(0)Fibo(2) Fibo(1) Fibo(1) Fibo(0) Fibo(1) Fibo(0) Некоторые элементы последовательности вычисляются повторно: Fibo(3), Fibo(2), … Рекурсивные вызовы функции Fibo
  • 27. В динамическом программировании используются таблицы, в которых сохраняются решения подзадач (жертвуем памятью ради времени) Последовательность Фибоначчи 2727 function Fibo(n) F[0] = 0 F[1] = 1 for i = 2 to n do F[i] = F[i - 1] + F[i - 2] end for return F[n] end function
  • 28. “Жадные” алгоритмы (Greedy) 2828  “Жадный” алгоритм (Greedy algorithms) – алгоритм, принимающий на каждом шаге локально-оптимальное решение  Предполагается, что конечное решение окажется оптимальным  Примеры “жадных” алгоритмов: o алгоритм Прима o алгоритм Курскала o алгоритм Дейкстры o алгоритм Хаффмана (кодирования)
  • 29. Задача о размене (Change-making problem) 2929  Задача Имеется неограниченное количество монет номиналом (достоинством) a1 < a2 < … < an  Требуется выдать сумму S наименьшим числом монет  Пример Имеются монеты достоинством 1, 2, 5 и 10 рублей Выдать сумму S = 27 рублей  “Жадное” решение (алгоритм): 2 монеты по 10 руб., 1 по 5, 1 по 2  На каждом шаге берётся наибольшее возможное количество монет достоинства an (от большего к меньшему)
  • 30. Задача о размене (Change-making problem) 3030  Задача Имеется неограниченное количество монет номиналом (достоинством) a1 < a2 < … < an  Требуется выдать сумму S наименьшим числом монет  Пример Имеются монеты достоинством 1, 5 и 7 рублей Выдать сумму S = 24 рубля  Решение жадным алгоритмом: 3 по 7, 3 по 1 = 6 монет  Оптимальное решение: 2 по 7, 2 по 5 = 4 монеты
  • 31. Код Хаффмана 3131  Деревья Хаффмана (Huffman) и коды Хаффмана используются для сжатия информации путем кодирования часто встречающихся символов короткими последовательностями битов  Предложен Д. А. Хаффманом в 1952 году (США, MIT)
  • 32. Код Хаффмана 3232  Задано множество символов и известны вероятности их появления в тексте (в файле)  A = {a1, a2, …, an} – множество символов (алфавит)  P = {p1, p2, …, pn} – вероятности появления символов  Требуется каждому символу сопоставить код – последовательность битов (codeword) С(A, P) = {c1, c2, …, cn} Пример Символ A B C D _ Код (биты) 11 100 00 01 101
  • 33. Код Хаффмана 3333  Шаг 1. Создается n одноузловых деревьев  В каждом узле записан символ алфавита и вероятность его повеления в тексте A 0.35 B 0.1 C 0.2 D 0.2 _ 0.15
  • 34. Код Хаффмана 3434  Шаг 2. Находим два дерева с наименьшими вероятностями и делаем их левым и правым поддеревьями нового дерева – создаем родительский узел  В созданном узле записываем сумму вероятностей поддеревьев  Повторяем шаг 2 пока не получим одно дерево На каждом шаге осуществляется “жадный выбор” – выбираем два узла с наименьшими вероятностями
  • 35. Код Хаффмана 3535 Символ B _ C D A Вероятность 0.1 0.15 0.2 0.2 0.35 B _ C D A
  • 36. 0.25 Код Хаффмана 3636 Символ B _ C D A Вероятность 0.25 0.2 0.2 0.35 B _ C D A
  • 37. 0.25 Код Хаффмана 3737 Символ C D B, _ A Вероятность 0.4 0.25 0.35 B _C D A 0.4
  • 38. 0.25 Код Хаффмана 3838 Символ C D B, _ A Вероятность 0.4 0.6 B _ C D A 0.4 0.6
  • 40. 0.25 Код Хаффмана 4040 B _ C D A 0.4 0.6 1.0  Часто встречающиеся символы получили короткие коды  Ни один код не является префиксом другого 1 1 0 0 1 0 10 Символ Код A 11 B 100 C 00 D 01 _ 101  Левое ребро – 1  Правое ребро – 0
  • 41. Поиск с возвратом (Backtracking) 41  Поиск с возвратом (Backtracking) – метод решения задач, в которых необходим полный перебор всех возможных вариантов в некотором множестве М  “Построить все возможные варианты …”, “Сколько существует способов …”, “Есть ли способ …”.  Термин Backtrack введен в 1950 г. D. H. Lehmer  Примеры задач: o Задача коммивояжёра o Подбор пароля o Задача о восьми ферзях o Задача о ранце o Раскраска карты 41
  • 42. Поиск выхода из лабиринта 4242 6 9 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 6 строк, 9 столбцов Старт: cтрока 1, столбец 1  1 – стена  0 – проход  Разрешено ходить влево, вправо, вверх и вниз
  • 43. Поиск выхода из лабиринта (Backtracking) 4343 int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "usage: maze <maze-file>n"); exit(1); } load_maze(argv[1]); print_maze(); backtrack(startrow, startcol); printf("Exit not foundn"); return 0; }
  • 44. Поиск выхода из лабиринта 4444 void backtrack(int row, int col) { int drow[4] = {-1, 0, 1, 0}; int dcol[4] = {0, 1, 0, -1}; int nextrow, nextcol, i; maze[row][col] = 2; // Встали на новую позицию if (row == 0 || col == 0 || row == (nrows - 1) || col == (ncols - 1)) { print_maze(); // Нашли выход } for (i = 0; i < 4; i++) { nextrow = row + drow[i]; nextcol = col + dcol[i]; if (maze[nextrow][nextcol] == 0) // Проход есть? backtrack(nextrow, nextcol); } maze[row * ncols + col] = 0; }
  • 45. Поиск выхода из лабиринта 4545 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 1 1 1 1 0 0 1 1 2 0 0 1 1 1 0 0 2 2 1 0 1 1 0 0 1 2 1 1 0 1 1 1 1 1 2 1 1 1 1
  • 46. Общая структура метода backtracking 4646 int main() { backtracking(1); } void backtracking(int step) { save_variant(); if (is_solution_found()) { print_solution(); exit(1); } for (i = 0; i < nvariants; i++) { if (is_correct_variant()) backtracking(step + 1); } delete_variant(); }
  • 47. Задача о восьми ферзях (eight queens puzzle) 47  Классическая формулировка Расставить на стандартной 64-клеточной шахматной доске 8 ферзей (королев) так, чтобы ни один из них не находился под боем другого 47  Альтернативная формулировка Заполнить матрицу размером 8×8 нулями и единицами таким образом, чтобы сумма всех элементов матрицы была равна 8, при этом сумма элементов ни в одном столбце, строке или диагональном ряде матрицы не превышала единицы
  • 48. Задача о восьми ферзях (eight queens puzzle) 4848  Задача впервые была решена в 1850 г. Карлом Фридрихом Гаубом (Carl Friedrich Gaub)  Число возможных решений на 64-клеточной доске: 92
  • 49. Задача о восьми ферзях (eight queens puzzle) 4949 X 1
  • 50. Задача о восьми ферзях (eight queens puzzle) 5050 X 1 X X X X X X 2 …
  • 51. Задача о восьми ферзях (eight queens puzzle) 5151 X 1 X X X X X X 2 …X X X …3 X X X
  • 52. Задача о восьми ферзях (eight queens puzzle) 5252 X 1 X X X X X X 2 …X X X …3 X X X … 8
  • 53. Задача о восьми ферзях (eight queens puzzle) 5353 enum { N = 8 }; int board[N][N]; int main() { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { board[i][j] = 0; } } backtrack(0); return 0; }
  • 54. Задача о восьми ферзях (eight queens puzzle) 5454 void backtrack(int row) { int col; if (row >= N) { print_board(); } for (col = 0; col < N; col++) { if (is_correct_order(row, col)) { board[row][col] = 1; // Ставим ферзя backtrack(row + 1); board[row][col] = 0; // Откат } } }
  • 55. Задача о восьми ферзях (eight queens puzzle) 5555 int is_correct_order(int row, int col) { int i, j; if (row == 0) return 1; /* Проверка позиций сверху */ for (i = row - 1; i >= 0; i--) { if (board[i][col] != 0) return 0; } /* Проверить левую и правую диагонали... */ return 1; } X
  • 56. Задача о восьми ферзях (eight queens puzzle) 5656 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0
  • 57. Задача о раскраске графа в k цветов 5757  Имеется граф G = (V, E) состоящий из n вершин  Каждую вершину надо раскрасить в один из k цветов так, чтобы смежные вершины были раскрашены в разные цвета Пример раскраски 10 вершин графа в 3 цвета
  • 58. Задача о раскраске графа в k цветов 5858 int main() { backtracking(1); } void backtracking(int v) { if (v > nvertices) { print_colors(); return; /* exit(0) */ } for (i = 0; i < ncolors; i++) { color[v - 1] = i; if (is_correct_color(v)) backtracking(v + 1); color[v - 1] = -1; } }
  • 59. Задача о раскраске графа в k цветов 5959 /* * Граф представлен матрицей смежности * (см. graph.h, graph.c) */ int is_correct_color(int v) { int i; for (i = 0; i < nvertices; i++) { if (graph_get_edge(g, v, i + 1) > 0) if (colors[v - 1] == colors[i]) return 0; } return 1; }
  • 60. Локальный поиск (local search) 6060  Локальный поиск (Local search) – это метод приближенного решения оптимизационных задач  Жертвуем точностью решения для сокращения времени работы алгоритма  Примеры методов локального поиска: o Имитация отжига (Simulated annealing) o Генетические алгоритмы (Genetic algorithms) o Поиск с запретами (Tabu search) o …
  • 61. Локальный поиск (local search) 6161 F(x) x Initial solution Local minimum Global minimum
  • 62. Локальный поиск (local search) 6262 function LocalSearch() x = InitialSolution() repeat x’ = GenerateNewSolution(x) if F(x’) < F(x) then x = x’ end if while not ExitCondition(x, x’) return x end function
  • 63. Домашнее чтение и задание 6363  Прочитать в [Levitin] раздел о методах разработки алгоритмов  Оценить трудоемкость алгоритма быстрой сортировки с использованием обобщённого рекуррентного уравнения декомпозиции [Levitin, С. 174]