86a3d51ae75481e41fcfb3b4afc5414e.ppt
- Количество слайдов: 77
Нижегородский Государственный Университет им. Н. И. Лобачевского Оптимизация программ Алгоритмическая оптимизация Мееров И. Б. Зимняя школа ITLab-2010 1 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
Содержание 1. Введение 2. Оценка текущего положения дел. Измерение времени 3. Рекурсия как метод программирования 4. Алгоритмическая оптимизация 5. Алгоритмическая оптимизация на примерах 6. Источники информации 2 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
1. Введение 3 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
1. Введение § Алгоритмическая оптимизация – выбор хорошего в некотором смысле алгоритма для конкретной задачи § Принципиальный момент: алгоритмическая оптимизация дает наибольший прирост производительности по сравнению с другими вариантами (к примеру, программной) § Никакая оптимизация под современные архитектуры не позволит исправить ошибок, допущенных при выборе подходящего алгоритма 4 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел. Измерение времени 5 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. . . § Сравнение алгоритмов – теория сложности § Теория сложности игнорирует константы. Для получения реальной картины и выбора путей дальнейшей (не алгоритмической) оптимизации необходимо оценить полученную реализацию Вопросы: § Как оценить полученную реализацию? § На чем основывать дальнейшую оптимизацию по скорости? Ответ: На измерении времени работы программы 6 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. . . § § 7 Небольшое примечание: Ранее говорили о том, что измерение времени плохой способ понять качество алгоритма. Теперь, тем не менее, возвращаемся к измерению времени. Вопрос: Почему? Ответ: Речь не идет о сравнении алгоритмов. Речь идет о понимании качества реализации и поиске путей по улучшению реализации. Про второе мы поговорим далее в разделе «Программная оптимизация» . Про первое поговорим сейчас. © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Постановка эксперимента § Как правильно поставить эксперимент? § Перечень желательных действий: – Отключить антивирус. Выгрузить прочие посторонние программы. – Желательно убедиться, что компьютер отключен от локальной сети. Если отключить нельзя, проследить, чтобы на нем никто не считал (пример: Центр разработок одной из крупных компаний в НН. Как устроено у них в некоторых командах). – Не запускать параллельно с тестируемой программой другие программы. – ВСЕ ЭТО НЕ ЯВЛЯЕТСЯ ГЛАВНЫМ! 8 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Серия экспериментов § По многим причинам (особенности архитектуры, организации ОС. . . ) из единичного замера нельзя сделать адекватные выводы § Выход: серия экспериментов по замеру времени Вопрос: § Получена серия. Что считать результатом? 9 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Обработка серии. . . Вариант 1: § Сложить и усреднить. Вариант плох тем, что большие выбросы могут оказать слишком сильное влияние. 10 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Обработка серии… Вариант 2: § Упорядочить по возрастанию времени, отбросить 1015% результатов с каждой стороны. § Сложить и усреднить. 11 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Обработка серии Вариант 3: § Взять минимальное время. 12 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Программирование. . . Как измерять время? § Получить время перед началом вычислений. § Получить время после окончания вычислений. § Вычесть из второго времени первое. Вопрос: Как получать текущее время? 13 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Программирование. . . 3 способа получения текущего времени в C: § Функция clock() § API функции § Ассемблерные вставки Темы для обсуждения: 1) Проблема разрешающей способности функций измерения времени. 2) Проблема измерения малых времен (сделать 1000 раз – все равно результат будет искажен). 3) Какой из способов лучше? 14 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Программирование. . . Способ 1: clock_t clock( void ); (<time. h>) clock_t start, finish; double d; unsigned long i = 6000000; start = clock(); while (i--) ; finish = clock(); d = (double)(finish - start)/CLOCKS_PER_SEC; printf("%2. 1 lf secondsn", d); Открываем пример на функцию clock() из встроенного help. 15 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Программирование. . . Способ 2: __declspec(naked) __int 64 rdtsc() { __asm { rdtsc ret } } Убирает пролог и эпилог функции В процессоре есть спец. датчик, который отсчитывает такты, начиная с некоторого момента. Можно запрашивать значение этого датчика – команда rdtsc. 16 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
2. Оценка текущего положения дел Измерение времени. Программирование. . . Способ 2: __int 64 start, finish; start = rdtsc(); // Some calculations finish = rdtsc(); printf("%f", (finish - start)/(double)CPU_clock); § При этом нужно знать тактовую частоту процессора. § Ее можно определить динамически. Открываем пример ExamplesExample 1. Time measure 17 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия как метод программирования 18 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Определение рекурсии § Под рекурсией понимается метод программирования, связанный с последовательным разбиением задачи на подзадачи меньшего размера до тех пор, пока подзадачи не станут элементарными. 19 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Поддержка в ЯПВУ. Прямая и косвенная § Поддержка в ЯПВУ: вызов функцией самой себя. § Если функция вызывает себя непосредственно прямая рекурсия. – double Test(double a) { if (a < 0) exit; Test(a-1); } § Если функция вызывает себя через другую функцию – косвенная рекурсия. double Test(double a) { if (a < 0) exit; Re. Test(a-1); } double Re. Test(double r) { Test(r-1); } 20 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Как мыслить рекурсивно? § Обычный порядок мысли: есть сложная задача, разбиваем ее на простые, последовательно выполняем одну за другой. § Рекурсивный порядок мысли: есть сложная задача, разбиваем ее на задачи меньшего размера, каждую из них разбиваем тем же способом и т. д. , пока задачи не станут простыми. 21 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Пример из жизни § Задача: нужно выкопать траншею. § Обычный порядок мысли: последовательно копаем от начала до конца. § Рекурсивный порядок мысли: сначала копаем левую половину, потом правую. При этом при раскопках левой половины вновь копаем ее левую половину, потом правую. . . 22 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Что нужно формализовать? § Что нужно формализовать, чтобы представить алгоритм рекурсивно? – В чем заключается шаг рекурсии. – Условия выхода из рекурсии. § Пример: факториал числа. N! = N * (N-1)! – шаг рекурсии. 0! = 1 – условие выхода из рекурсии. 23 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Пример: факториал числа double Factorial(double N) { if (N <= 0) return 1; return N * Factorial(N-1); } § Анализ: – double – избегаем переполнения; – Временная сложность ? 24 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Пример: факториал числа double Factorial(double N) { if (N <= 0) return 1; return N * Factorial(N-1); } § Анализ: – double – избегаем переполнения; – Временная сложность: O(N); 25 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Пример: наибольший общий делитель § Задача: найти GCD(A, B), A <= B. § Алгоритм Евклида и его модификация (Эйлер): – если B mod A = 0, GCD(A, B) = A – иначе GCD(A, B) = GCD(B mod A, A) unsigned long GCD(unsigned long a, unsigned long b) { if ((b % a) == 0) return a; else return GCD(b % a, a); } § Анализ: – Временная сложность: ? 26 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Пример: наибольший общий делитель § Задача: найти GCD(A, B), A <= B. § Алгоритм Евклида и его модификация (Эйлер): – если B mod A = 0, GCD(A, B) = A – иначе GCD(A, B) = GCD(B mod A, A) unsigned long GCD(unsigned long a, unsigned long b) { if ((b % a) == 0) return a; else return GCD(b % a, a); } § Анализ: – Временная сложность: O(log. A) – теорема: при каждом втором вызове меньший параметр уменьшается по крайней мере в 2 раза. 27 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Как это работает? § При рекурсивном вызове функции в системный стек сохраняются не только адрес возврата и формальные параметры, но и локальные переменные, объявленные в функции. § При возврате из рекурсии происходит восстановление из стека значений локальных переменных (и формальных параметров). 28 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Когда это не работает? Типовые ошибки: § Отсутствие условия выхода, неправильное условие выхода. § Переполнение стека «глубины рекурсии» . из-за слишком § Переполнение переменных. из-за обилия 29 стека © ННГУ ВМК 2006 большой локальных Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Когда это работает, но этим не нужно пользоваться? § Один из важнейших моментов для понимания принципов применения рекурсии: В случае, когда нерекурсивная версия алгоритма может быть реализована с обозримыми трудозатратами, как правило, нужно использовать именно ее. § Рекурсия – «пожиратель ресурсов» . Порождает большие накладные расходы. § Рассмотренные примеры – случаи необоснованного применения рекурсии. Существуют простые нерекурсивные версии. 30 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
3. Рекурсия Когда есть смысл ее применения? § Когда рекурсивная реализация проста и естественна, а нерекурсивная чрезмерно сложна для последующего понимания, отладки и модификации. § Если говорить об оптимизации, как правило, удаление рекурсии приводит к приросту производительности (пример чуть позже – сортировка Хоара). 31 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
4. Практика: реализация факториала 2 -мя способами, измерение времени § Задание для самостоятельной работы: – Реализовать вычисление факториала числа 2 способами – рекурсивно и нерекурсивно. – Измерить время работы. § Указание: – При измерении времени вычислять факториал 1000 -10000 раз в зависимости от мощности ПК. - rdtsc() for (1 -1000) factorial(); - rdtsc() 32 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
5. Алгоритмическая оптимизация § Алгоритмическая оптимизация – выбор хорошего в некотором смысле алгоритма для конкретной задачи. § Как это делать? – Анализируем задачу. – Ищем (литература, Интернет, изобретаем сами) алгоритмы ее решения. – Сравниваем эти алгоритмы по тем критериями, которые для нас имеют смысл. – Выбираем лучший алгоритм. – Думаем, нельзя ли улучшить и его. 33 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . Задача: Дано прямоугольное поле размера m x n. В каждой ячейке лежит определенное кол-во денег. Буратино начинает свой путь в ячейке (1, 1) и за 1 шаг способен двигаться на 1 клетку вправо, либо на 1 клетку вниз. Требуется найти наибольшее кол-во денег, которое может собрать Буратино на пути из (1, 1) в (m, n) и соответствующий путь. 34 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . A 11 A 1 n Am 1 Amn m n Алгоритм 1. Полный перебор всех путей. 35 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Перебор: – сгенерировать все пути; – для каждого найти сумму денег; – из сумм найти максимум. § 1 -я разумная модификация: сгенерировав путь, сразу считать сумму и сравнивать с максимумом. § Вопрос: какова сложность такого алгоритма? 36 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Вопрос: какова сложность такого алгоритма? § Чтобы ответить на вопрос, нужно понять, как будет устроен перебор (остальное просто). § Вопрос: Как устроить перебор? 37 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Вопрос: какова сложность такого алгоритма? § Чтобы ответить на вопрос, нужно понять, как будет устроен перебор (остальное просто). § Вопрос: Как устроить перебор? § Ответ: Сначала нужно понять, что мы перебираем. Нужна модель пути. § Вопрос: как моделировать путь? 38 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Вопрос: как моделировать путь? § Ответ: пусть 0 – движение вправо, 1 – вниз. Очевидно, все пути имеют длину n+m-2. Тогда путь – последовательность нулей и единиц длины n+m-2, причем сумма элементов последовательности равна m-1. § Сколько таких путей? § Таких путей 39 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Вернемся к вопросу о сложности. § Имеем экспоненциальную сложность (вычисление суммы не влияет на асимптотику). § Вопрос: Нельзя ли улучшить алгоритм? 40 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Наводящие соображения: m n Мы многократно считаем одно и то же, с упорством, достойным восхищения, перемалывая неперспективные пути. 41 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино. . . § Алгоритм 2: Пусть S(i, j) – максимальное кол-во денег, которое можно собрать на пути (1, 1) – (i, j). Очевидно, работает следующая модель: Для упрощения работы можно завести матрицу S на 1 больших размерностей и обнулить «лишние» элементы. 42 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача о Буратино § Таким образом, алгоритм 2 просто заполняет по порядку вспомогательную матрицу. § Сложность O(m x n). § Примененный подход называется «метод Беллмана» или динамическое программирование. § Главный принцип: любой участок оптимального пути является оптимальным. § Суть метода в том, чтобы по возможности устранить дублирование вычислений. § В итоге от экспоненциального алгоритма перешли к полиномиальному. 43 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Задача для самостоятельного решения Лабиринт и мудрецы § В начале лабиринта находится одна единственная дверь § Пройдя через нее, мудрец оказывается перед двумя дверьми, на следующем уровне – перед тремя, затем перед четырьмя и т. д. § По правилам состязаний мудрец в каждый момент времени может идти только через одну из двух ближайших дверей § За проход через каждую дверь мудрец платит фиксированный штраф от 1 до 50 тугриков. Победителем считается мудрец, заплативший наименьший штраф § Схема лабиринта из 500 уровней с указанием штрафов предоставлена кандидатам за день до соревнований Вооружившись компьютером, помогите мудрецу одержать победу 44 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте. . . S F Лабиринт задан матрицей размера m x n. В некоторых ячейках лабиринта установлены препятствия. Требуется найти кратчайший путь из ячейки S в ячейку F. 45 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте. . . § Структура данных – двумерный массив. § Элементы массива – нули и единицы. Единицы соответствуют препятствиям. § Вопрос: как будем решать задачу? 46 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте. . . Алгоритм 1. Полный перебор всех путей (очень долго). Начиная с точки «старт» , реализуем рекурсивные вызовы в 4 -х направлениях, проверяя перед вызовом следующие условия: – отсутствие препятствия; если препятствие, то вызов не осуществляем – первый ли раз мы в этой ячейке; если уже были, то вызов не осуществляем – не финиш ли это если финиш – длину пути сравниваем с текущим минимумом. При необходимости запоминаем длину и сам путь. 47 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте. . . Алгоритм 1. Ограничение перебора. Отсечение 1. Подумаем над оптимизацией. Очевидно, если уже найден путь длины l, можно не рассматривать пути длины не менее l. Это соображение позволяет поставить 1 проверку в начале рекурсивной функции и существенно уменьшить глубину рекурсии. 48 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте. . . Алгоритм 1. Ограничение перебора. Отсечение 2. Подумаем над оптимизацией. Находясь в точке (i, j) мы можем найти минимальный путь к финишу без учета препятствий (катеты прямоугольного треугольника). Если текущая длина + длина мин. пути ≥ l, то текущий путь можно не рассматривать. Это соображение заменяет первое и еще лучше сокращает кол-во перебираемых вариантов. 49 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте. . . Алгоритм 1. Ограничение перебора. Отсечение 3. Подумаем над оптимизацией. Для предыдущих отсечений важно быстро находить достаточно хороший путь. Это можно сделать введя приоритеты для направлений. «Жадная стратегия» реализуется так: Находясь в точке (i, j) мы сначала располагаем рекурсивные вызовы в приоритетных направлениях, а потом в не приоритетных (в зависимости от положения Start и Finish). 50 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте… Алгоритм 2. Волновой алгоритм. Перебор все равно остается перебором. Подумаем над оптимизацией. Будем метить начальную ячейку 1 -ей. Всех допустимых соседей – 2 -кой. . . В итоге мы отметим «финиш» и сразу завершим рекурсию. 51 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте – волна. . . 1 1 S 1 1 F 52 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте – волна. . . 2 1 S 1 2 2 2 F 53 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте – волна. . . 2 1 2 3 1 S 1 2 2 1 2 3 3 F 54 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте – волна. . . 2 1 2 3 4 1 S 1 2 3 2 1 2 3 4 3 2 4 3 4 4 F 55 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте – волна. . . 2 2 3 4 5 6 7 8 9 10 11 12 1 S 1 2 3 4 5 6 7 8 9 10 11 2 3 4 6 7 8 10 11 12 3 2 4 5 7 8 9 10 11 12 13 4 5 6 7 8 9 10 11 12 13 14 15 6 7 8 9 10 12 13 14 15 16 7 8 9 10 11 12 13 14 15 16 8 7 8 9 10 11 12 13 14 15 16 9 8 9 10 12 13 14 15 16 F 10 56 1 9 10 11 13 14 15 16 12 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск кратчайшего пути в лабиринте – волна. . . 2 2 3 4 5 6 7 8 9 10 11 12 1 S 1 2 3 4 5 6 7 8 9 10 11 2 3 4 6 7 8 10 11 12 3 2 4 5 7 8 9 10 11 12 13 4 5 6 7 8 9 10 11 12 13 14 15 6 7 8 9 10 12 13 14 15 16 7 8 9 10 11 12 13 14 15 16 17 9 8 9 10 12 13 14 15 16 17: F 10 57 1 9 10 11 13 14 15 16 17 12 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск элемента в массиве. . . Постановка задачи: § Пусть дан массив A из n элементов. § Требуется найти позицию, в которой расположен элемент key, или определить, что его нет. § Для определенности считаем, что все элементы в массиве разные. 58 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск элемента в массиве. . . § При заданных условиях лучший алгоритм – полный перебор всех элементов. § Оценки сложности: – Лучший случай: O(1) – В среднем: O(N) – Худший случай: O(N) § Нетрудно показать, что ничего лучшего не придумать. § Однако, ситуация резко меняется при наличии дополнительной информации. 59 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск элемента в массиве. . . § Пусть массив упорядочен по возрастанию элементов. § Вопрос: Как использовать эту информацию? § Ответ: Если A[i] < key, то все элементы A[j], j<i также меньше, чем key. § Отсюда вытекает простой алгоритм «бинарного поиска» . 60 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск элемента в массиве. . . § Бинарный поиск: § start=1; finish=N. § Пока start < finish – middle = (start+finish) / 2; – Если A[middle] == key: • start = middle; • finish = middle; – Иначе Если A[middle] < key: start = middle+1; – Иначе: finish = middle-1; § В конце проверяем A[start]. 61 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Поиск элемента в массиве § Оценка сложности: § В лучшем случае: O(1) § В худшем случае: – алгоритм заканчивает работу через k шагов; – в этот момент отрезок поиска имеет длину N/2 K; – работа заканчивается, когда длина = 1. Отсюда k = log. N. O(log. N). § В среднем: нужно привлекать ТВ (за кадром). 62 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки Содержание подраздела: § Постановка задачи. § Классы алгоритмов сортировки. § Сортировка подсчетом. § Сортировка выбором. § Сортировка вставками. § Сортировка пузырьком. § Сортировка слиянием. § Сортировка Хоара ( «быстрая сортировка» ). § Применяем алгоритмы. § Резюме. § Задание для практики. 63 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Постановка задачи: § Пусть дан массив A из N элементов. § Требуется упорядочить элементы массива по возрастанию элементов. 64 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Классы алгоритмов Сортировки Используют сравнения «Пузырьковые» О(n 2) Не используют сравнения O(n) Быстрые О( ) Для частных случаев Работают в общем случае Теоретический минимум! (Теорема) 65 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка подсчетом § Пусть элементы массива – целые числа от 0 до M, где M << N. § Заводим вспомогательный массив B из M+1 элемента. § Инициализируем массив нулями. § В цикле проходим по массиву A и на каждой итерации выполняем: B[A[i]]++; § В результате B[i] – сколько раз встречается в A элемент i. § После этого проходим по массиву B и B[i] раз выводим число i (i = 0. . m). § Оценка: O(N) + O(M) = O(N). 66 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Поразрядная сортировка § Упорядочение данных методом поразрядной сортировки (на примере набора значений) § Разложить значения по стекам (номер стека - младшая цифра) § Собрать значения из стеков (от старшего стека) § Разложить значения по стекам (номер стека - старшая цифра) § Собрать значения из стеков (от младшего стека) 67 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка выбором § Суть алгоритма: находим минимум, ставим на 1 место. Далее находим минимум из оставшихся, ставим на 2 место. . . § A = I + A*, где I – итог, всегда содержит элементы, стоящие на своих местах. 1 2 5 6 12 11 13 10 7 34 21 15 12 12 61 43 I A* § § Оценка O(N 2). Хорошо сортирует упорядоченные массивы. Удовлетворительно случайные. Очень плохо упорядоченные в обратном порядке. 68 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка вставками § A = I + A*, где I – итог, всегда содержит упорядоченные относительно друга элементы, не обязательно стоящие на своих местах. § Изначально Итог состоит из 1 элемента. § Далее каждый элемент оставшейся части двигается по Итогу, пока не перестанет нарушать условие упорядоченности Итога. § Оценка O(N 2). § Алгоритм несколько улучшается, если искать место бинарным поиском. § В целом работает медленно. 69 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка пузырьком § Массив просматривается, соседние элементы сравниваются. При необходимости меняются местами. § Работа прекращается, когда за 1 проход не выполнено ни одного обмена. 8 2 4 5 3 10 2 4 5 3 8 10 Погружение 1 проход § Пузырек: аналогия с пузырьком в стакане воды. § Погружение – быстро. § Всплытие – медленно. § Модификация: чередовать направления – существенно лучше! § Сложность О(N) в лучшем случае, О(N 2) в худшем, в среднем. 1 2 4 5 3 10 1 2 4 3 5 10 1 2 3 4 5 10 Всплытие k проходов Основное применение – почти отсортированные массивы. 70 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка слиянием 8 2 2 2 8 4 3 3 4 4 5 3 10 6 3 4 4 5 6 6 4 11 4 6 11 6 10 11 71 § Вспомогательная процедура – слияние 2 -х отсортированных массивов в 1 – O(N). § Сложность O(Nlog. N). § Хороший быстрый алгоритм. § Обычно реализуют рекурсивно. § + Малая глубина рекурсии – log. N. § + Время не зависит от входа. § – Временный массив. © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка Хоара. . . § Стратегия «разделяй и властвуй» . § Выбирает «ведущий элемент» – 1 -ый элемент. § Разбрасывает элементы массива так, что слева те, кто меньше ведущего, справа – не меньше ведущего. Теперь ведущий на своем месте (сложность O(N)). Размер несортированной части сократился на 1. § Вызывает себя для левой и правой части. § Анализ: – Сложность O(Nlog. N). В худшем случае O(N 2). – + Один из самых популярных и быстрых алгоритмов. – – В неудачных случаях (много одинаковых элементов, массив упорядочен) входит в глубокую рекурсию, возможно переполнение, O(N 2). 72 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Сортировка Хоара. . . Борьба с минусами: § Выбор ведущего элемента: – 1 -ый, последний – плохо. – Среднее арифметическое – долго. – Идея: брать случайно. «Не может всегда не везти» . § Убираем рекурсию. Идея: кладем в стек границы частей массива так, чтобы больший участок попадал в стек первым. На практике приносит выигрыш в 20%-30%. § Итог: один из лучших алгоритмов. Главный недостаток – плохо, если много одинаковых значений. 73 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах Алгоритмы сортировки. Резюме Некоторые общие замечания: § Устранение рекурсии часто не является тривиальным, но дает хороший выигрыш. § Рекомендуется при малых размерах массивов останавливать дробление и сортировать выбором. Существенный прирост производительности. § Сортировка применяется для последующего быстрого поиска. При этом сортируют 1 раз, после чего стремятся поддерживать массив в упорядоченном состоянии. 74 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
7. Использованные источники При создании презентации активно использовались материалы книги Род Стивенс. Delphi. Готовые алгоритмы. – М. : ДМК Пресс; СПб: Питер, 2004. Литература: Кормен, Лейзерсон, построение и анализ. 75 Ривест. © ННГУ ВМК 2006 Алгоритмы: Линёв А. В. , Мееров И. Б. , Сысоев А. В.
Вопросы § ? ? ? 76 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
6. Алгоритмическая оптимизация на примерах. Практика. Алгоритмы сортировки Задание: § Реализовать сортировку методом пузырька и методом Хоара § В методе Хоара рассмотреть 2 варианта реализации: – рекурсивный – итеративный § Измерить производительность реализованных алгоритмов 77 © ННГУ ВМК 2006 Линёв А. В. , Мееров И. Б. , Сысоев А. В.
86a3d51ae75481e41fcfb3b4afc5414e.ppt