
Сортировка.pptx
- Количество слайдов: 84
СОРТИРОВКА
ЗАДАЧА СОРТИРОВКИ Пример: Таблица с данными
ЗАДАЧА СОРТИРОВКИ Пример: Таблица с данными. Сортировка по «ключу» в по алфавиту Фамилия Имя VK Twitter Skype Ruslan Bazhenov ruslanbazhenov - - Алихан Костоев id 101450780 - - Екатерина Казакова katusha_a - - Коля Ильиных sip_that_tea_honey Kerolain. PR mizukage 007 Олечка Морохина id 47869004 Ola_lay - Танюша Пестренина id 67695996 - - Юлик Роман id 84773263 - - Юлия Маркеева blacksnow 1 - sacrifice 999 Ярослав Leroidescargot id 22789372 - leroidescargot Ruslan Bazhenov ruslanbazhenov - - Задача сортировки – перегруппировать набор элементов в некотором порядке в соответствии со значением ключа.
ПРИМЕР СОРТИРОВКИ #1 • Задача – сортировка вещественных данных • Прим. 1. Сортировка вещественных чисел в порядке убывания
ПРИМЕР СОРТИРОВКИ #2 • Задача – сортировка строковых данных • Прим. 2. Сортировка строк в алфавитном порядке
ЛИНЕЙНО УПОРЯДОЧЕННОЕ МНОЖЕСТВО частично упорядоченное множество, в котором для любых двух элементов a и b имеет место a ≤ b или a ≥ b. Л. У. М. - это логическое условие (true или false) вида ≤. Свойства: • Антисимметрия: если v ≤ w и w ≤ v, тогда если v=w • Транзитивность: если v ≤ w и w ≤ x, тогда v ≤ x • Совокупность: либо v ≤ w , либо w ≤ v, либо они равны (v=w) Примеры: • Стандартная последовательность целых чисел • Хронологическая последовательность дат • Алфавит
НЕ ЯВЛЯЕТСЯ ЛИНЕЙНО УПОРЯДОЧЕННЫМ МНОЖЕСТВОМ
ФУНКЦИЯ СРАВНЕНИЯ • Рассмотрим функцию сравнения 2 ух объектов • Использование: v. compare. To(w); • Результаты выполнения: • -1 если меньше • 0 если равно • +1 если больше • Исключение в случае несовместимости типов (или один из элементов null) • Большинство классов имеет такую функцию и её нежно реализовывать только в своих классах • Большинство классов имеют свойство IComparable, позволяющее создавать универсальные функции (сл. слайд)
ФУНКЦИИ-ПОМОЩНИКИ (HELPER FUNCTIONS) • Добавим 2 часто встречающиеся в сортировке функции • Меньше. Less. Элемент v меньше чем w? • Перестановка. Exchange. В Массиве a[] меняем местами элементы с индексами i и j
ПРОВЕРКА МАССИВА НА ОТСОРТИРОВАННОСТЬ
СОРТИРОВКА С ВЫБОРОМ • Дано - неотсортированный массив • За i-ую итерацию алгоритм находит индекс (номер) min самого маленького элемента • Меняет местами a[i] и a[min]. Индекс i проходит по всему массиву, начиная с 1 ого элемента
ПРИМЕР. ШАГ 1 • Начинаем с 1 элемента и, проходя массив слева направо, находим индекс наименьшего элемента
ПРИМЕР. ШАГ 2 • Поменяли местами i и min, отсекли часть наблюдаемой области • Слева образуется отсортированный массив, его не трогаем.
ПРИМЕР. ШАГ 3.
ПРИМЕР. ШАГ 4.
ПРИМЕР. ШАГ 5.
ПРИМЕР. ШАГ N.
ПРИМЕР. МАССИВ ОТСОРТИРОВАН.
СОРТИРОВКА С ВЫБОРОМ • Алгоритм. Указатель ищет справа-налево • Свойства: • Элементы слева он Указателя (в т. ч. сам Указатель) находятся в порядке убывания • Все элементы справа от Указателя больше его и больше элементов слева от указателя
ВНУТРЕННИЙ ЦИКЛ ДЛЯ СОРТИРОВКИ С ВЫБОРОМ Реализуем описанные свойства: • Движение указателя вправо • Определение индекса минимального элемента • Перестановка элементов
РЕАЛИЗАЦИЯ АЛГОРИТМА СОРТИРОВКИ С ВЫБОРОМ
СОРТИРОВКА С ВЫБОРОМ: МАТ АНАЛИЗ • Предположение. Сортировка с выбором производит (N-1)+ … + 1 + 0 ~ N 2/2 сравнений и N перестановок • Время работы не зависит от входных данных, оно всегда квадратично • Перемещение данных минимально. Линейное число перестановок • Даже если массив частично отсортирован, алгоритм проходит и переставляет каждый элемент!
ПРОСЫПАЕМСЯ! Число сравнений для уже отсортированного входного массива алгоритма сортировки с выбором… • Линейно • Квадратично • Логарифмично • Экспоненциально
СОРТИРОВКА С ВСТАВКОЙ • Дано - неотсортированный массив •
СОРТИРОВКА С ВСТАВКОЙ • Дано - неотсортированный массив • За i-ую итерацию алгоритм производит перестановку a[i] с каждым элементом, который находится слева от a[i] и больше a[i] • Элементы проходятся слева-направо
ПРИМЕР. ШАГ 1 • Начинаем с 1 элемента. Анализируем только область слева от i (в данном случае 1 карту)
ПРИМЕР. ШАГ 1
ПРИМЕР. ШАГ 2 • Увеличиваем i на 1. Элементы уже отсортированы
ПРИМЕР. ШАГ 3. 1 • Теперь не отсортированы. Двигаем j налево. И меняем i-ый элемент с каждым б. Ольшим эл-том
ПРИМЕР. ШАГ 3. 2 • Меняем 5 и 10
ПРИМЕР. ШАГ 3. 3 • Меняем 5 и 7. По логике – проходим массив дальше, пока не упремся в начало или не найдем меньший элемент
ПРИМЕР. ШАГ N.
СОРТИРОВКА С ВСТАВКОЙ Алгоритм. Указатель проходит слева-направо Свойства: • Элементы слева от Указателя (включая Указатель) находятся в порядке возрастания • Элементы справа от Указателя – непроверенные элементы
ВНУТРЕННИЙ ЦИКЛ СОРТИРОВКИ С ВСТАВКОЙ • Реализуем свойства алгоритма: • Смещение Указателя направо: • Движение справа-налево, перестановка a[i] с каждым б. Ольшим элементом слева:
РЕАЛИЗАЦИЯ СОРТИРОВКИ С ВСТАВКОЙ
СОРТИРОВКА С ВСТАВКОЙ: МАТ АНАЛИЗ • Предположение. Для сортировки случайно-сортированного массива, сортировка с вставкой использует в среднем ~ N 2/4 сравнений и ~ N 2/4 перестановок. • Доказательство. Каждый элемент смещается примерно на полпути назад.
СОРТИРОВКА С ВСТАВКОЙ ДЛЯ БОЛЬШОГО ЧИСЛА ЭЛЕМЕНТОВ
СОРТИРОВКА С ВСТАВКОЙ • Сортировка с вставкой в 2 раза быстрее сортировки с выбором. • Сортировка с вставкой зависит от входных данных (того как отсортирован вх. массив) • Лучший случай. Массив в порядке возрастания, алгоритм произведет N-1 сравнение и 0 перестановок АБВГДЕЁЖЗИ • Худший случай. Массив в порядке убывания (нет повторяющихся элементов), алгоритм произведет ~ N 2/2 сравнений и ~ N 2/2 перестановок ИЗЖЁЕДГВБА
СОРТИРОВКА С ВСТАВКОЙ: ЧАСТИЧНОСОРТИРОВАННЫЙ МАССИВ • Инверсия – это пара элементов, расположенных в неправильном порядке Отсорт: A E E L M O P R S T X; Неотсорт: A E E L M O T R X P S Инверсий 6 шт. T-R; T-P; T-S; R-P; X-S • Массив является частично-отсортированным, если число инверсий ≤ c*N • Прим. 1. Массив из 10 элементов соединяется с отсортированным массивом из N элементов • Прим. 2. Массив из N элементов имеет 10 неверно-расположенных элементов. • Предположение. Для частично-отсортированных массивов, сортировка с вставкой работает за линейное время. • Док-во. Число перестановок равно числу инверсий (Число сравнений = число перестановок + (N-1))
ПРОСЫПАЕМСЯ Число сравнений для уже отсортированного массива для метода сортировки с вставкой… • Постоянно • Логарифмично • Линейно • Квадратично
СОРТИРОВКА ШЕЛЛА • Идея. Сортировка с вставкой – элемент смещается на 1 шаг (меняется местами с соседом) за раз. Можно перемещать элементы на большее число позиций за раз, с помощью h-сортировки массива • h-сортированный массив - это массив имеющий отсортированный подмассив, элементы которого расположены друг от друга на расстоянии h. (на рис. 4 отсортированных h-массива с шагом h=4) • Сортировка Шелла. h-сортировнный массив с уменьшающимся значением h.
СОРТИРОВКА ШЕЛЛА • Задача – реализовать h-сортировку и постепенно уменьшать значения h. • Как реализовать h-сортировку? h-сорт-ка – это сортировка со вставкой с шагом длины h. То есть каждый элемент сравнивается не с ближайшим соседом слева, а с тем, что слева на h шагов. Но увеличение рассматриваемого массива происходит на 1 шаг, а не на h. • Почему используем сортировку с вставкой? • Большие h = маленькие подмассивы • Маленькие h = почти-отсортированне подмассивы
СОРТИРОВКА ШЕЛЛА: ДЛЯ 7 -> 3 -> 1
СОРТИРОВКА ШЕЛЛА • Предположение. g-отсортированный массив остается g-отсортированным после h-сортировки
СОРТИРОВКА ШЕЛЛА. КАКОЙ ИНКРЕМЕНТ ИСПОЛЬЗОВАТЬ? • Степень двойки. 1, 2, 4, 8, 16, 32, … • Нет. • Степень двойки минус 1. 1, 3, 7, 15, 31, 63, … • Возможно. • 3 x + 1. 1, 4, 13, 40, 121, 364, … • Ок, это легко подсчитать. • Седжвик. 1, 5, 19, 41, 109, 209, 505, 929, 2161, 3905 … • Хорошо, но тяжело получить эмпирическим путем.
РЕАЛИЗАЦИЯ СОРТИРОВКИ ШЕЛЛА
СОРТИРОВКА ШЕЛЛА
СОРТИРОВКА ШЕЛЛА: АНАЛИЗ • Предположение. В худшем случае число сравнений в сортировке Шелла с 3 x+1 инкрементом пропорционально O(N 3/2) • На практике, непонятно как точно рассчитать число сравнений для массива N с инкрементом M. Точная модель не была ещё обнаружена/описана.
ПОЧЕМУ МЫ РАССМАТРИВАЕМ СОРТИРОВКУ ШЕЛЛА? Потому что, это пример того, как небольшое улучшение значительно увеличивает производительность Плюсы в применении: • Быстрый алгоритм для не очень больших массивов • Небольшой объем кода Алгоритм изучен не до конца, например открытым остается вопрос о лучшей величине инкремента
ПРОСЫПАЕМСЯ! Число сравнений для уже отсортированного массива для метода сортировки Шелла при инкременте 3 x+1… • Постоянно • Логарифмично • Линейно • N*log. N
SHUFFLING AKA ТАСОВАНИЕ
КАК ПЕРЕТАСОВАТЬ МАССИВ? • Цель – перестроить массив, чтобы в результате получилась случайная последовательность. • «Сортировка перетасовкой» • Сгенерировать случайное действительное число для каждого элемента массива • Отсортировать массив
ТАСОВАНИЕ КАРТ • Сортировка с тасованием должна всегда создавать массив случайных чисел, которые не должны повторяться
УЛУЧШЕНИЕ СОРТИРОВКИ ПЕРЕТАСОВКОЙ Новая цель. Перетасовать массив случайным образом за линейное время. «Сортировка Кнута» • Дан массив, не важно, отсортированный или нет. • За i-ую итерацию, выбираем случайное целое число r между 0 и i. • Меняем a[i] и a[r] местами.
СОРТИРОВКА КНУТА. ШАГ 1.
СОРТИРОВКА КНУТА. ШАГ 2. • i увеличивается на 1, r – случайное число от 0 до 1, в данном случае 0.
СОРТИРОВКА КНУТА. ШАГ N.
СОРТИРОВКА КНУТА. БЫЛО/СТАЛО
СОРТИРОВКА КНУТА. • Это ЛИНЕЙНЫЙ алгоритм перетасовки! • Программная реализация:
ПРИМЕРЫ СОРТИРОВОК ИЗ ЖИЗНИ • Онлайн покер «Texas hold’em poker»
ПРИМЕРЫ СОРТИРОВОК ИЗ ЖИЗНИ Баги алгоритма перетасовки для онлайн покера: • Случайное число никогда не достигает 52 => 52 ая карта всегда остается на месте. • Перетасовка происходит не равномерно • Random() использует 32 -разрядный seed => 232 возможных варианта раздачи (математически макс число раздач 52 карт = 52! >> 232) • Seed = число миллисекунд после полуночи => 84. 5 миллиона возможных перетасовок Вывод – случайные раздачи не такие уж случайные! В действительности – узнав 5 карт и зная время на сервере синхронизации, можно предсказать все последующие карты в реальном времени!!!
ПРОСЫПАЕМСЯ! • Каково максимальное число раздач 52 карт?
ВЫПУКЛАЯ ОБОЛОЧКА • Область применения – вычислительная геометрия. • Выпуклая оболочка, для множества N точек, это наименьшее выпуклое множество, содержащее в себе эти N точек. • Выпуклое множество – множество, в котором любые 2 точки можно соединить отрезком, не выходящим за пределы множества Выпуклое Не выпуклое
ВЫПУКЛАЯ ОБОЛОЧКА Про простому – есть множество точек на плоскости, надо построить вокруг них забор наименьшей длины! Аналогичные определения: • ВО – наименьшая площадь выпуклого многоугольника, содержащего все точки • ВО – Выпуклый полигон, чьи вершины являются точками множества
ВЫПУКЛАЯ ОБОЛОЧКА • Результатом поиска выпуклой оболочки является последовательность вершин в порядке следования против часовой стрелке.
ВЫПУКЛАЯ ОБОЛОЧКА: В ЖИЗНИ • Забиваем гвозди в доску и проводим резинку вокруг них.
ВЫПУКЛАЯ ОБОЛОЧКА: ПЛАНИРОВАНИЕ МАРШРУТА ПЕРЕДВИЖЕНИЯ • Планирование маршрута передвижения робота. Задача – найти кратчайший путь из точки s в точку t, избегая многогранника-препятствия. • Факт – самый короткий путь это либо прямая из s в t, либо одна из 2 ух линий выпуклой оболочки.
ВЫПУКЛАЯ ОБОЛОЧКА: УДАЛЕННЫЕ ТОЧКИ • Задача наиболее удаленных точек. Дано N точек на плоскости, необходимо найти пары точек с наибольшим Евклидовым расстоянием между ними. • [Евклидово расстояние – корень из суммы квадратов разностей координат] • Факт. Наиболее удаленная пара точек, это экстремумы/extreme points выпуклой оболочки
ВЫПУКЛАЯ ОБОЛОЧКА: ГЕОМЕТРИЧЕСКИЕ СВОЙСТВА • Факт. Пересечь выпуклую оболочку можно только совершая движения против часовой стрелки • Факт. Вершины выпуклой оболочки возникают в порядке возрастания угла относительно точки p с наименьшей y-координатой
АЛГОРИТМ ГРЭХЕМА • Выбрать точку p с наименьшей y-координатой • Отсортировать точки по углу по отношению к p • Считаем что точки упорядочены. Отсеиваем их если они не упорядочены против часовой стрелки.
АЛГОРИТМ ГРЭХЕМА. ШАГ 1 • Выбрать точку p с наименьшей y-координатой • Отсортировать точки по углу по отношению к p • Считаем что точки упорядочены. Отсеиваем их если они не упорядочены против часовой стрелки.
АЛГОРИТМ ГРЭХЕМА. ШАГ 1 • Сортируем точки по углу по отношению у p
АЛГОРИТМ ГРЭХЕМА. ШАГ 2 • Соединяем 0 и 1
АЛГОРИТМ ГРЭХЕМА. ШАГ 4 И 5 • Соединяем 1 и 2, а затем 2 и 3, предполагая что они могут быть на выпуклой оболочке
АЛГОРИТМ ГРЭХЕМА. ШАГ 6 • Соединение 3 и 4 происходит не против часовой стрелки (в контексте 2 -> 3 -> 4), это указывает на то, что 3 не является частью выпуклой оболочки.
АЛГОРИТМ ГРЭХЕМА. ШАГ 7 • Соединение 1 -> 2 -> 4 так же расположено по часовой стрелке, значит 2 не может быть на выпуклой оболочке
АЛГОРИТМ ГРЭХЕМА. ШАГ 8 • Соединение 1 -> 4 -> 5 так же расположено по часовой стрелке, значит 4 не может быть на выпуклой оболочке
АЛГОРИТМ ГРЭХЕМА. ШАГ N • И т. д. проверяя тройки точек на соответствие правилу «против часовой стрелки» , выстраиваем выпуклую оболочку.
АЛГОРИТМ ГРЭХЕМА: ПРОБЛЕМЫ РЕАЛИЗАЦИИ • Как найти p по наименьшей y-координате? • Определить линейно упорядоченное множеств по координате y или отсортировать уже известными методами • Как отсортировать точки по углу по отношению к p? • Определить ЛУП для каждой точки p • Как определить что p 1 -> p 2 -> p 3 проходятся против часовой стрелки? • Вычислительная геометрия (2 следующих слайда) • Как сортировать эффективно? • Использовать сортировку слиянием N*log N раз • Обрабатывать вырождения (3 или более точек на линии) • Требует обработки, не сложной. Частично рассмотрим на следующих лекциях
РЕАЛИЗАЦИЯ «ПРОТИВ ЧАСОВОЙ СТРЕЛКИ» ПЧС: ) ПЧС. Дано 3 точки a, b и c. Как определить что проход a -> b -> c пчс? Или находится ли точка c слева от луча a->b? Вывод – геометрию считать тяжело, так как: • Приходится работать с вырожденными случаями • Рассчитывать отклонения с высокой точностью
РЕАЛИЗАЦИЯ «ПРОТИВ ЧАСОВОЙ СТРЕЛКИ» • ПЧС. Дано 3 точки a, b и c. Как определить что проход a -> b -> c пчс? • Определитель (или векторное произведение) равен удвоенной площади плоского треугольника с знаком + или -. • Если эта величина >0, тога a->b->c расположены по часовой стрелке • Если эта величина <0, тога a->b->c расположены против часовой стрелке • Если эта величина =0, тога a->b->c расположены на прямой линии
ТИП ДАННЫХ «ТОЧКА НА ПЛОСКОСТИ»
РЕАЛИЗАЦИЯ АЛГОРИТМА ГРЕХЕМА Упрощение. Любые 3 точки не находятся на одной линии. Выпуклая оболочка (hull) записывается в стек! Stack. peek() –возвращает верхний Элемент, не удаляя его. Время работы. N*log N для сортировки Линейно для остальных операций
ПРОСЫПАЕМСЯ! Максимальное число вершин на выпуклой оболочке для множества из N точек… • Постоянно • Логарифмично • Линейно • N*log. N
Сортировка.pptx