
Анализ алгоритмов rev.pptx
- Количество слайдов: 67
АНАЛИЗ АЛГОРИТМОВ REV. 2 Теория II. 1
Персонажи • Программист должен разработать решение проблемы • Клиент хочет чтобы проблема была решена эффективно • Теоретик хочет разобраться в том «как это работает» • Команда? Которая делает всё необходимое, чтобы завершить работу • Студент – может быть кум угодно 2
Время работы алгоритма 3
Причины для анализа алгоритмов • Предсказать производительность алгоритма • Сравнить алгоритмы (в т. ч. ) по производительности • Гарантировать работу алгоритма • Понять как в теории алгоритм работает • Главная причина: избежать ошибок (багов) в работе алгоритма Напр: Клиент получает медленно работающий алгоритм, так как программист не понимает характеристик алгоритма, отвечающих за производительность. 4
Пример успешного усовершенствования алгоритма Быстрое преобразование Фурье • Дискретное преобразование Фурье вычисляется по формуле за O(N 2) шагов • Теоретическое применение: Разделение волны (напр. звуковой) на N компонент • Практическое применение: MP 3, JPEG, MRI и тд. • БПФ позволяет это сделать за N*log. N шагов 5
Пример успешного усовершенствования алгоритма 6
Пример успешного усовершенствования алгоритма Симуляция N тел • Симуляция гравитационного взаимодействия между N телами • Грубый подход – N 2 шагов • Алгоритм Barnes-Hut: N*log. N шагов 7
Задачи • Сможет ли программа обработать огромный набор входящих данных? • Будет ли она достаточно быстрой? • Не кончится ли доступная память? Решение: Использование математического анализа (научного подхода) для оценки производительности алгоритмов 8
Научный подход для анализа алгоритмов Методы, позволяющие предсказать производительность и сравнить алгоритмы Особенности научного подхода: • Наблюдение объектов окружающего мира • Создание гипотезы - модели, соответствующей наблюдениям • Предположение событий с использованием гипотезы • Уточнение предположений с помощью дальнейших наблюдений • Повторяющаяся валидация, до тех пор, пока гипотеза и наблюдения не будут согласованы Принципы: • Эксперименты должны быть повторимыми • Гипотеза должна быть опровержима (фальсифицируема) 9
ПРОСЫПАЕМСЯ! Дано: N = 1, 000 (1 миллион) Во сколько быстрее работает алгоритм N*log 2 N по сравнению с N 2? • в 20 • в 1000 • в 50, 000 • в 1, 000 10
Пример: 3 -сумма Дано N различных целых числе, сколько сумм из 3 любых чисел даёт 0 (ноль)? Вход программы: Выход программы 11
Грубая сила Проверка всех троек, при этом тройки проверяются только 1 раз В if() предполагаем что переполнения int не будет (max int = 2 147 483 647) 12
Оценка времени работы Как измерить время работы? 1)Вручную с секундомером. 13
Оценка времени работы 2) Программно с помощью класса Stop. Watch using System. Diagnostics; //Библиотека class Stopwatch //Класс секундомер Stopwatch. Elapsed //время работы секундомера 14
Оценка времени работы • Запускаем программу много раз с различными массивами чисел • Считаем время работы 35 • (Строим график) 30 Число элементов Время (сек) 8 ~0 1000 0, 47 2000 3, 758 4000 29, 13 25 20 15 10 5 0 8 1000 2000 4000 15
Анализ данных Соотношение времени работы T(N) к размеру входных данных N 16
Анализ данных Логарифмический график Соотношение времени работы T(N) к размеру входных данных N с использованием шкалы log-log Регрессия. Можно провести прямую линию через точки a * Nb Lg(T(N)) = b*lg(N) + c b = 2, 999 c = -33. 2103 T(N) = a* Nb , где a = 2 c Гипотеза. Время работы примерно равно 1, 006 * 10 -10 * N 2, 999 секунд. 17
Предположения и оценки Гипотеза. Время работы примерно равно 1, 006 * 10 -10 * N 2, 999 секунд. На её основе делаем предположения (подставляем в формулу) Предположения: • 51 секунда для N = 8000 • 408 секунд для N = 16000 Наблюдения – гипотеза подтверждена 18
Удвоение гипотезы • Удвоение гипотезы. Быстрый способ оценки b в степенном законе. • Запускаем программу и каждый раз удваиваем размер входящих данных приближается к b ~ 3 Гипотеза. Время работы примерно a * Nb где b = логарифму НО!Мы не можем определить особенностей логарифма с помощью удв гипотез 19
Удвоение гипотезы • Как оценить a? При этом предполагаем, что b известно. • Запустить программу (для достаточно большого значения N) и определить a. • Гипотеза. Время работы примерно 0, 998 * 10 -10 * N 3 секунд Практически идентично предположению линейной регрессии 20
Экспериментальные алгоритмы Независимые эффекты системы: // • Алгоритм //определяют экспоненту b // • Входные данные //в степенном законе //определяют Эффекты от которых зависит система: //константы • Оборудование: Проц, память, кэш //в степенном • Софт: Компиллятор, интерпертатор, сборщик мусора //законе • Система: ОС, сеть, другие приложения // Минусы: Сложно получить точные измерения Плюсы: Гораздо легче и проще чем другие способы. (т. е. можно запускать много экспериментов) 21
Просыпаемся • Вы измеряете время работы программы T(N) (сек), как функции размера входных данных N. Какая из этих функций лучше всего описывает время работы. • 3. 3 * 10 -4 * N • N 2 • 5. 0 * 10 -9 * N 2 • 6. 25 * 10 -9 * N 2 22
Математические модели для определения времени работы Полное время работы: • Сумма (время выполнения операции x количество операций) • Необходимо анализировать программу чтобы определить набор операций • Время выполнения операции зависит от данного компьютера/компиллятора • Количество операций зависит от алгоритма и выходных данных В принципе точные математические модели доступны 23
Время выполнения базовых операций 24
Время выполнения базовых операций 25
Пример: 1 -сумма • Сколько операций в данном отрезке кода? <- i++ и count++ 26
Пример: 2 -сумма 27
Упрощение вычислений • Мы хотим оценить объем работ, требуемых для вычислений. Даже если вычисления очень сложные. • Можно считать число операций, присваивать им коэффициенты, в зависимости от сложности и тд…. НО! • При вычислениях больше всего времени и сил требуют операции умножения и записи. • Следовательно, мы должны считать число операций умножения и записи. 28
Упрощение 1 • Считаем, что только некоторые базовые операции влияют на время выполнения. 29
Упрощение 2: тильда (~) • Оценим время выполнения (или кол-во затраченной памяти) как функцию входящих данных N • Опустим переменные низких порядков Если N велико, то эти переменные вносят малый вклад • Если N мало, то совсем не вносят • Обозначения: 30
Упрощение 2: тильда (~) • Подсчет времени значительно упрощается • Время выполнения всегда пропорционально N • Опускаем переменные низких порядков Если N велико, то эти переменные вносят малый вклад • Если N мало, то совсем не вносят • 31
Пример: 2 -сумма • Используя 2 прощения оценим как много обращений к массиву происходит в отрезке когда? • Ответ ~ N 2 обращений к массиву • Вывод – можно использовать упрощения 1 и 2 для облегчения подсчета операций 32
Пример: 3 -сумма • Ответ ~ ½ * N 3 обращений к массиву 33
Оценка дискретной суммы • Как оценить дискретную сумму? • A) Изучить курс дискретной математики • Б) Заменить сумму на интеграл и использовать исчисления 34
Математические модели для оценки времени работы • В принципе, возможно создать точные математические модели • На практике, Формулы могут быть сложными • Может потребоваться высшая математика • Точные модели – удел экспертов • • Вывод – будем использовать приблизительные модели 35
Просыпаемся! • Сколько обращений к массиву происходит в следующем фрагменте кода? 36
Общая классификация по степени роста • Считаем основным параметром N • В общем, мы имеем малый набор функций • Их достаточно для описания типичного алгоритма График Логарифмический 37
Общая классификация по степени роста 38
Практическое применение степени роста • Вывод – необходим линейный и N log N алгоритм для того чтобы соответствовать закону Мура 39
Пример бинарного поиска • Рассмотрим мат проблему для которой необходимо построение математической модели. Бинарный поиск. Дан отсортированный по размеру массив (напр целых чисел), нам надо число и необходимо узнать, есть ли число в массиве, и если есть, каков его индекс. Сравниваем значение с средним: • Меньше, идем в лево • Больше, идем в право • Равно – нашли! 40
Бинарный поиск • Ищем число 33 41
Бинарный поиск • Ищем число 33 42
Бинарный поиск • Ищем число 33 43
Бинарный поиск • Ищем число 33 44
Бинарный поиск • Ищем число 34 45
Реализация бинарного поиска Просто реализовать? • Первый алгоритм БП был опубликован в 1946. первый, не содержащий ошибок, в 1962. • В 2006 в методе Arrays. binary. Search() на языке Java был обнаружен баг Если искомое число есть в массиве a[], то a[lo] <= key <= a[hi] 46
Анализ бинарного поиска • Предположение. Бинарный поиск использует до 1+ lg. N сравнений для поиска в любом отсортированном массиве размеров N • Определим T(N) как число сравнений бинарного поиска в отсортированном подмассиве размера <= N • Рекуррентное соотношение для БП. • Примерное док-во. 47
N 2 log N алгоритм для 3 -суммы • Мы можем разработать быстрый алгоритм для 3 -суммы • Он основан на сортировке. Шаг 1: Отсортировать N(различных) чисел • Шаг 2: Для каждой пары чисел a[i] и a[j] производим БП элемента –(a[i] + a[j]) • • Анализ. Степень роста N 2 log N. Шаг 1. N 2 сама сортировка • Шаг 2. N 2 log N – сорт + БП • 48
Сравним программы • Гипотеза. Основанный на сортировке N 2 log N алгоритм для 3 -суммы значительно быстрее чем N-кубический алгоритм. • Вывод – чем лучше степень роста, тем быстрее алгоритм работает на практике. 49
Просыпаемся! Чему равно максимальное число обращений к массиву в алгоритме бинарного поиска в отсортированном массиве длины N • Постоянно • Логарифмично • Линейно • N log N (Linearithmic) 50
Типы анализа алгоритмов • Лучший случай. Оценка нижней границы затрат Определяется самыми простыми вх данными • Задача для всех вх данных • • Худший случай. Оценка верхней границы затрат Определяется самыми сложными вх данными • Гарантирует устойчивость к любым данным • • Время работы – среднее между Лучшим и худшим случаями • Среднестатистический случай. Случайные вх данные Необходима модель для «случайных» данных • Позволяет предположить время исполнения • 51
Типы анализа алгоритмов • Лучший случай. Оценка нижней границы затрат • Худший случай. Оценка верхней границы затрат • Среднестатистический случай. «Ожидаемые» затраты Данные могут не соответствовать модели ввода? • Необходимо понять структуру вх данных, чтобы эффективно обработать их. • Подход 1. Смоделировать худший случай • Подход 2. Рандомизировать, на основе вероятностей 52
Теория алгоритмов Цели • Оценить «сложность» задачи • Разработать «оптимальный» алгоритм Подход • Не рассматривать детали, а анализировать суть • Изъять непостоянство из вх данных, концентрируясь на худшем случае Оптимальный алгоритм • Производительность гарантирована для любых вх данных (без учета деталей) • Ни один другой алгоритм не может работать лучше 53
Часто используемые обозначения в теории алгоритмов 54
Теория алгоритмов: пример 1 Цели • Оценить «сложность» задачи • Разработать «оптимальный» алгоритм • Прим. 1 -сумма «есть ли 0 в массиве? » Верхняя граница. Конкретный алгоритм • Прим. Алгоритм грубой силы: Просмотр каждого элемента в массиве • Время работы оптимального алгоритма 1 -суммы O(N) Нижняя граница. Доказывает, что ни один алгоритм не сделает это лучше. • Прим. Просмотр всех N значений (любая непросмотренная м. б. равна 0) • Время работы оптимального алгоритма для 1 -суммы Ω(N) Оптимальный алгоритм. • Нижняя и верхняя границы совпадают (без учета деталей) • Прим. Алгоритм грубой силы для 1 -суммы оптимален: время работы Θ(N) 55
Теория алгоритмов: пример 2 Прим. 3 -сумма Верхняя граница. Конкретный алгоритм • Прим. Алгоритм грубой силы для 3 -суммы. Время работы O(N 3) Верхняя граница. Улучшенный алгоритм O(N 2 log. N) Нижняя граница. • Прим. Просмотр всех N значений 3 -суммы • Время работы оптимального алгоритма для 1 -суммы Ω(N) Между верхней и нижней границей есть разрыв, в нем находится опт алгоритм Открытая проблема • Каков оптимальный алгоритм для 3 -суммы? • Есть ли квадратичный алгоритм для нижней границы 3 -суммы? Мы не знаем насколько сложно решить проблему 3 -суммы! 56
Подход к дизайну алгоритмов Начало • Разработать алгоритм • Найти нижнюю границу Есть разрыв? • Уменьшить верхнюю границу (найти новый алгоритм) • Поднять нижнюю границу (более сложно доказать что это нужно) 57
Обозначения 58
Просыпаемся! • Какая из следующих функций O(N 3)? 59
Память Мы рассмотрели время работы, перейдем к затратам памяти 32 -битные машины. Мы считаем что это машины с 4 -байтными указателями. 64 -битные машины. Мы считаем что это машины с 8 -байтными указателями. • Они могут адресовать больше памяти • Указатели используют больше места 60
Стандартное использование памяти для стандартных типов и массивов 61
Тип данных Data 62
Тип данных String 63
Выводы по использованию памяти 64
Просыпаемся! • Сколько памяти (в байтах) использует взвешенный Quick. Union. UF состоящий из массива в N элементов? • Hint: 2 integer arrays size of N 65
Решение • Weighted. Quick. Union. UF for N 66
Финальные выводы Эмпирический анализ • Запускаем программу для оценки времени работы • Анализируем степенной закон и формулируем гипотезы для времени работы • Модели позволяют делать предположения Математический анализ • Анализируем алгоритмы и считаем частоту операций • Используем ~ для упрощения анализа • Модели позволяют описывать поведение Научный подход • Мат модели независимы от системы. Применимы к несуществующим компьютерам • Эмпирический анализ необходим для оценки мат модели и предположений 67