- •Исполнители
- •Сложность алгоритма. O- и θ- нотации Сложность алгоритма
- •Зависимость времени исполнения от исходных данных
- •Неполиномиальные задачи. Задача о рюкзаке
- •Задача о рюкзаке
- •Одно из решений задачи о рюкзаке
- •Свойства алгоритма
- •Сложность решения задачи о рюкзаке
- •Исполнитель алгоритма Исполнители
- •Элементарные и неэлементарные операции
- •Представление типов
- •Инварианты. Индуктивные функции Индуктивное программирование. Индуктивные функции
- •Абстракция “стек”
- •Абстракция “множество”
- •Проблема с представимостью данных
- •Как работать с длинными числами?
- •Как умножать длинные числа?
- •Алгоритм быстрого умножения
- •Алгоритм Карацубы
- •Основная теорема о рекурсии Оценка асимптотического времени алгоритма
- •Основная теорема о рекурсии
- •Оценка сложности алгоритма Карацубы
Технологии программирования
Содержание лекции:
1) Свойства алгоритма;
2) Сложность алгоритма. O- и ϴ- нотации;
3) Исполнитель алгоритма;
4) Инварианты. Индуктивные функции;
5) Абстракции. Интерфейс абстракции;
6) Рекурсия. Принцип разделяй и властвуй;
7) Основная теорема о рекурсии;
8) Быстрое вычисление степеней.
Свойства алгоритма
Исполнитель
Алгоритм – это последовательность команд для исполнителя, обладающая рядом свойств:
1) полезность, т.е. умение решать поставленную задачу;
2) детерминированность, т.е. каждый шаг алгоритма должен быть строго определён во всех возможных ситуациях;
3) конечность, т.е. способность алгоритма завершиться для любого множества входных данных;
4) массовость, т.е. применимость алгоритма к разнообразным входным данным.
Алгоритм для своего исполнения требует от исполнителя некоторых ресурсов.
Программа – это запись алгоритма на формальном языке.
Исполнители
Одна задача – несколько алгоритмов – разные используемые ресурсы.
Разные исполнители – разные элементарные действия и элементарные объекты.
Исполнитель “компьютер”:
1) устройство центральный процессор;
2) элементарные действия – сложение, умножение, сравнение, переход и т.д.
3) устройство память как хранитель элементарных объектов;
4) элементарные объекты – целые, вещественные числа.
Эффективность – способность алгоритма использовать ограниченное количество ресурсов.
Сложность алгоритма. O- и θ- нотации Сложность алгоритма
Какая бывает сложность алгоритма:
1) комбинационная сложность – минимальное число элементов для реализации алгоритма в виде вычислительного устройства;
2) описательная сложность – длина описания алгоритма на формальном языке;
3) вычислительная сложность – количество элементарных операций, исполняемых алгоритмом для неких входных данных.
Нет циклов – описательная сложность примерно коррелирует с вычислительной.
Есть циклы – интересна асимптотика зависимости времени вычисления от входных данных.
Главный параметр сложности алгоритма
Введём понятие главный параметр N, наиболее сильно влияющий на скорость исполнения алгоритма. Это может быть:
1) размер массива;
2) количество символов в строке;
3) количество битов в записи числа;
4) если таких параметров несколько – обобщённый параметр, функция от нескольких параметров.
Нотация сложности. Символ ϴ (читается "тэта большое")
Далее: сложность ≡ – вычислительная сложность.
Функция f(N) имеет порядок ϴ(g(N)), если существуют постоянные c1, c2 и N1 такие, что для всех N>N1.
0 ≤ c1g(N) ≤ f (N) ≤ c2g(N)
ϴ(f(n)) – класс функций, примерно пропорциональных f(n).
Нотация сложности. Символ O (читается "О большое")
Функция f(N) имеет порядок O(g(N)), если существуют постоянные c1 и N1 такие, что для всех N>N1.
f(N) ≤ c1g(N)
O(f(n)) – класс функций, ограниченных сверху cf(n).
Приближённое вычисление сложности
Пусть F(N) – функция сложности алгоритма в зависимости от N.
Тогда если существует такая функция G(N) (асимптотическая функция) и константа C, что
то сложность алгоритма F(N) определяется
функцией G(N) с коэффициентом амортизации
C.
Асимптотика основных зависимостей
Класс сложности определяется по асимптотической зависимости F(N).
Экспонента с любым коэффициентом превосходит любую степень.
Степень с любым коэффициентом, большим единицы, превосходит логарифм по любому основанию, большему единицы.
Логарифм по любому основанию, большему единицы превосходит 1.
F(N) = N3 + 7N2 - 14N = ϴ(N3)
F(N) = 1.01N + N10 = ϴ(1.01N)
F(N) = N1.3 + 10log2N = ϴ(N1.3)
На практике чаще используют O-нотацию, так как ϴ-нотацию обычно сложнее доказывать.
Зависимость времени исполнения от исходных данных
Пусть имеется массив A длиной N элементов.
Сколько операций потребуется, чтобы обнаружить номер первого вхождения элемента со значением P алгоритмом, заключающимся в последовательном просмотре элементов массива?
Kmin = 1
Kmax = N
Подходит ли символ ϴ?
Нет. Для данного алгоритма подходит O-символ: f(N) = O(N).
Пусть имеется массив A длиной N элементов.
Сколько операций потребуется, чтобы сложить все элементы массива?
K = N
Подходит ли символ ϴ?
Подходит. f(N) = ϴ(N).
