- •Тема 1. Основные понятия и определения дисциплины.
- •1.1 История развития теории алгоритмов.
- •1.2 Роль алгоритмов в науке и технике.
- •1.3 Понятие алгоритма.
- •1.4 Алгоритмический процесс.
- •1.5 Алгоритмы и языки.
- •1.6 Основные вопросы теории алгоритмов.
- •1.7 Классификация алгоритмов.
- •1.8 Свойства алгоритмов.
- •1.9 Методы доказательства корректности алгоритмов.
- •1.10 Сложность алгоритмов.
- •Можно показать, что нижняя граница
- •Сложность рекурсивных алгоритмов.
- •Тема 2. Традиционные подходы в теории алгоритмов.
- •2.1 Рекурсивные функции.
- •Операторы рекурсии.
- •2.2 Нормальные алгорифмы Маркова.
- •2.3 Машина Тьюринга.
- •Тема 3 Алгоритмически неразрешимые проблемы
- •Тема 4 Классы p- (polynomial) и np- (nondeterminated polynomial) задач.
- •4.1 Понятие р- и np-задач.
- •4.3 Примеры задач np-класса.
Можно показать, что нижняя граница
3n2 –100n+6 (n3) при С=1.
Неравенство 3n2 –100n+6 n3 не выполняется.
3n2 –100n+6=(n)
C1= , n>n0.
C 1n 3n2-100n+6 (верхняя граница)
C1n 3n2-100n+6 (нижняя граница)
Учитывая сложность оценки , считают, что предпочтительнее являются алгоритмы, имеющие меньший порядок роста. Т. е. если одну и ту же задачу можно решить двумя алгоритмами, для которых порядок сложности кратен O(N2) и O(N3) соответственно, то более эффективным при будет первый алгоритм.
Однако, если учитывать константы С1 и С2 при анализе границ, то в некоторых случаях второй алгоритм будет более эффективным.
Например:
f1(N)=100n2
f2(N)=5n3
n0=20 – критическая точка.
Другой причиной предпочтения алгоритмов с меньшим порядком сложности является то, что чем меньше порядок сложности, тем больший размер задачи N можно решить практически.
Вывод: следует создавать алгоритмы, для которых порядок сложности кратен N или logN : O(N), O(logN), O(MlogN).
Алгоритмы, порядок сложности которых кратен O(2n), O(an) дают экспоненциальный рост сложности.
Таблица скорости роста сложности для различных алгоритмов.
N |
ln(N) |
N |
n*lg(N) |
n2 |
2n |
n! |
10 |
3 нс |
10 нс |
33 нс |
100 нс |
1 мкс |
3,63 мс |
20 |
4 нс |
20 нс |
86 нс |
400 нс |
1 мс |
77 лет |
50 |
|
|
|
2,5 мкс |
13 дней |
|
100 |
|
|
|
|
4*1013 лет |
|
105 |
|
|
0,13 мс |
100 мс |
|
|
106 |
|
|
|
10 с |
|
|
107 |
|
|
|
16,7 мин |
|
|
109 |
30 мс |
1 с |
29,9 с |
31,7 лет |
|
|
Пример 6:
Нужно учитывать, что больший порядок роста сложности алгоритмов как правило имеет меньшую константу С1 по сравнению с малым порядком роста сложности, характеризующимся константой С2.
В этом случае алгоритм с быстро растущей сложностью может оказаться предпочтительнее для решения задач с малыми размерами данных (n0).
Пусть заданы пять алгоритмов решения одной и той же задачи, имеющие следующие сложности роста сложности:
А1: 100N
А2: 100N*logN
А3: 10N2
А4: N3
А5: 2N
Тогда для задач с N=29 более быстродействующим будет А5 (f(N) ~ 4512). Другие алгоритмы при подстановке дадут существенно более низкие показатели.
При N=1058 предпочтительным оказывается А3.
При N=591024 самым эффективным будет А2.
При N>1024 предпочтителен А1.
Для программ, состоящих из нескольких последовательно или параллельно выполняющихся алгоритмов, сложность оценивается по правилу сумм и правилу произведений.
Правило сумм: Пусть программа состоит из двух последовательно выполняющихся алгоритмов Р1 и Р2, для которых определены сложности O(f(n)) и O(g(n)) соответственно. Тогда временная сложность всей программы будет определяться как сумма временных сложностей каждого из алгоритмов:
T(n) = T1(n)+T2(n)
В общем случае получаем:
T(n) O(max f(n), g(n))
Правило произведений: Пусть временная сложность программы, состоящей из двух параллельно выполняющихся алгоритмов, имеющих порядок сложности O(f(n)) и O(g(n)) соответственно, определяется как произведение временных сложностей каждого из алгоритмов:
T(n) = T1(n)*T2(n)
В общем случае:
T(n) O( f(n)*g(n))