SlideShare a Scribd company logo
Лекция 11
Методы разработки
алгоритмов
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры и алгоритмы обработки данных»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Весенний семестр, 2015
Основные методы разработки алгоритмов
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 = a
for i = 2 to n do
pow = pow * a
end for
return pow
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(x[1..n], y[1..n])
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(x[1..n], y[1..n])
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

Compiler construction tools
Compiler construction toolsCompiler construction tools
Compiler construction tools
Akhil Kaushik
 
Regular Expression to Finite Automata
Regular Expression to Finite AutomataRegular Expression to Finite Automata
Regular Expression to Finite Automata
Archana Gopinath
 
Regular Expression (Regex) Fundamentals
Regular Expression (Regex) FundamentalsRegular Expression (Regex) Fundamentals
Regular Expression (Regex) Fundamentals
Mesut Günes
 
Deterministic Finite Automata (DFA)
Deterministic Finite Automata (DFA)Deterministic Finite Automata (DFA)
Deterministic Finite Automata (DFA)
Animesh Chaturvedi
 
Compiler Chapter 1
Compiler Chapter 1Compiler Chapter 1
Compiler Chapter 1
Huawei Technologies
 
7. check box control
7. check box control7. check box control
7. check box control
chauhankapil
 
Bit manipulation
Bit manipulationBit manipulation
Bit manipulation
Priyanka Yadav
 
Directed Acyclic Graph Representation of basic blocks
Directed Acyclic Graph Representation of basic blocksDirected Acyclic Graph Representation of basic blocks
Directed Acyclic Graph Representation of basic blocks
Mohammad Vaseem Akaram
 
Code Optimization
Code OptimizationCode Optimization
Code Optimization
Akhil Kaushik
 
Code generation in Compiler Design
Code generation in Compiler DesignCode generation in Compiler Design
Code generation in Compiler Design
Kuppusamy P
 
JAVA PROGRAMMING- GUI Programming with Swing - The Swing Buttons
JAVA PROGRAMMING- GUI Programming with Swing - The Swing ButtonsJAVA PROGRAMMING- GUI Programming with Swing - The Swing Buttons
JAVA PROGRAMMING- GUI Programming with Swing - The Swing Buttons
Jyothishmathi Institute of Technology and Science Karimnagar
 
Nondeterministic Finite Automata
Nondeterministic Finite AutomataNondeterministic Finite Automata
Nondeterministic Finite AutomataAdel Al-Ofairi
 
Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)   Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)
Tasif Tanzim
 
Shell programming
Shell programmingShell programming
Shell programming
Moayad Moawiah
 
Lesson 02 python keywords and identifiers
Lesson 02   python keywords and identifiersLesson 02   python keywords and identifiers
Lesson 02 python keywords and identifiers
Nilimesh Halder
 

What's hot (20)

Compiler construction tools
Compiler construction toolsCompiler construction tools
Compiler construction tools
 
Regular Expression to Finite Automata
Regular Expression to Finite AutomataRegular Expression to Finite Automata
Regular Expression to Finite Automata
 
Regular Expression (Regex) Fundamentals
Regular Expression (Regex) FundamentalsRegular Expression (Regex) Fundamentals
Regular Expression (Regex) Fundamentals
 
Deterministic Finite Automata (DFA)
Deterministic Finite Automata (DFA)Deterministic Finite Automata (DFA)
Deterministic Finite Automata (DFA)
 
Error handling in ASP.NET
Error handling in ASP.NETError handling in ASP.NET
Error handling in ASP.NET
 
Mysql joins
Mysql joinsMysql joins
Mysql joins
 
SQL Views
SQL ViewsSQL Views
SQL Views
 
Compiler Chapter 1
Compiler Chapter 1Compiler Chapter 1
Compiler Chapter 1
 
7. check box control
7. check box control7. check box control
7. check box control
 
Bit manipulation
Bit manipulationBit manipulation
Bit manipulation
 
Directed Acyclic Graph Representation of basic blocks
Directed Acyclic Graph Representation of basic blocksDirected Acyclic Graph Representation of basic blocks
Directed Acyclic Graph Representation of basic blocks
 
Code Optimization
Code OptimizationCode Optimization
Code Optimization
 
Joins in SQL
Joins in SQLJoins in SQL
Joins in SQL
 
Code generation in Compiler Design
Code generation in Compiler DesignCode generation in Compiler Design
Code generation in Compiler Design
 
JAVA PROGRAMMING- GUI Programming with Swing - The Swing Buttons
JAVA PROGRAMMING- GUI Programming with Swing - The Swing ButtonsJAVA PROGRAMMING- GUI Programming with Swing - The Swing Buttons
JAVA PROGRAMMING- GUI Programming with Swing - The Swing Buttons
 
Nondeterministic Finite Automata
Nondeterministic Finite AutomataNondeterministic Finite Automata
Nondeterministic Finite Automata
 
Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)   Intermediate code generation (Compiler Design)
Intermediate code generation (Compiler Design)
 
Shell programming
Shell programmingShell programming
Shell programming
 
Compiler Construction
Compiler ConstructionCompiler Construction
Compiler Construction
 
Lesson 02 python keywords and identifiers
Lesson 02   python keywords and identifiersLesson 02   python keywords and identifiers
Lesson 02 python keywords and identifiers
 

Viewers also liked

Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
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
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
Mikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
Mikhail Kurnosov
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
Mikhail Kurnosov
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыMikhail Kurnosov
 

Viewers also liked (9)

Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицыЛекция 6: Хеш-таблицы
Лекция 6: Хеш-таблицы
 

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
 
04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Николай Паламарчук "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
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс2berkas
 
Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Алгоритмы и структуры данных осень 2013 лекция 1
Алгоритмы и структуры данных осень 2013 лекция 1Technopark
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
Roman Brovko
 
Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Алгоритмы и структуры данных осень 2013 лекция 8
Алгоритмы и структуры данных осень 2013 лекция 8Technopark
 
Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1Лекция 12 Теоретико-числовые алгоритмы Часть 1
Лекция 12 Теоретико-числовые алгоритмы Часть 1
simple_people
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисления
Positive Hack Days
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы Python. Функции
Основы Python. ФункцииОсновы Python. Функции
Основы Python. Функции
Theoretical mechanics department
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Technosphere1
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 

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

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

More from 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. Стандарт OpenMP
Mikhail 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
 
Семинар 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
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
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
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
Mikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 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...
 
Лекция 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...
 
Семинар 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)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 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. Бинарные кучи. Пирамидальная сортировка
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 

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

  • 1. Лекция 11 Методы разработки алгоритмов Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Весенний семестр, 2015
  • 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 = a for i = 2 to n do pow = pow * a end for return pow 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(x[1..n], y[1..n]) 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(x[1..n], y[1..n]) 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]