Алгоритмы и структуры данных весна 2014 лекция 3
TRANSCRIPT
![Page 1: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/1.jpg)
Алгоритмы и структуры данных
Сортировки
![Page 2: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/2.jpg)
Алгоритмы сортировки
Сортировка – процесс упорядочивания элементов массива
Многие программы используют алгоритмы сортировки. Часто время их работы определяется временем сортировки
Данные часто упорядочены каким либо
Многие задачи существенно быстрее решаются на предварительно упорядоченных данных
2
![Page 3: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/3.jpg)
3
1. Простые сортировки
2. Предел скорости
3. Ускорение
4. Хорошие сортировки
5. Особые свойства
6. Поразрядная сортировка
7. Сравнение
![Page 4: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/4.jpg)
Сортировка 1 и 2х элементов
void sort_1(int *a) {
return;
}
void sort_2(int *a) {
if (a[1] < a[0]) {
swap(a[1], a[0]);
}
}
4
![Page 5: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/5.jpg)
void sort_3(int *a) {
if (a[1] < a[0]) {
if (a[2] < a[1]) {
// 2 1 0
} else {
if (a[2] < a[0]) {
// 1 2 0
} else {
// 1 0 2
}
}
} else {
if (a[2] < a[0]) {
// 2 0 1
} else {
if (a[2] < a[1]) {
// 0 2 1
} else {
// 0 1 2
}
}
}
}
Сортировка 3х элементов
5
![Page 6: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/6.jpg)
Избыточное сравнение
6
![Page 7: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/7.jpg)
Прострые сортировки
Существует множество алгоритмов сортировка
Сортировка выбором - Selection Sort
Сортировка вставками - Insertion Sort
Пузырьковая сортировка - Bubble Sort
7
![Page 8: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/8.jpg)
Сортировка выбором
Разделим массив на две части: левую - упорядоченную и правую –неупорядоченную
Будем гарантировать, что элементы в правой части больше чем в левой
Выберем наименьший элемент в правой части и переставим его в её начало
После каждого выбора и перестановки, будем смещать границу между частями массива на 1 вправо
Выбор каждого нового элемента требует прохода по правой части
Для сортировки массива из N элементов требуется N-1 проход
8
![Page 9: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/9.jpg)
Сортировка выбором
0 23 78 45 8 32 56
1 8 78 45 23 32 56
2 8 23 45 78 32 56
3 8 23 32 78 45 56
4 8 23 32 45 78 56
5 8 23 32 45 56 78
Ord
ered
Unord
ered
9
![Page 10: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/10.jpg)
Сортировка выбором
void selection_sort(int *a, int n) {
for (int i = 0; i < n - 1; ++i) {
int min_index = i;
for (int j = i + 1; j < n; ++j) {
if (a[j] < a[min_index]) min_index = j;
}
swap(a[i], a[min_index]);
}
}
void swap(int &a, int &b ) {
int tmp = a;
a = b;
b = tmp;
}
10
![Page 11: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/11.jpg)
Сортировка выбором: Анализ
В общем случае алгоритм сортировки состоит из сравнения ключей и перестановки элементов
Время работы алгоритма пропорционально количеству сравнений и количеству перестановок
Внешний цикл совершает n-1 итерацию
В каждой итерации 1 перестановка
В 1й итерации n-1 сравнение, во 2й – n-2, … в n-1й – 1
Ровно 𝒏(𝒏 − 𝟏)/𝟐 сравнений
Ровно 𝒏 − 𝟏 перемещений
11
![Page 12: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/12.jpg)
Сортировка выбором: Анализ
Количество операций не зависит от состава массива
Сложность в лучшем и в худшем случае совпадает: 𝑶(𝒏𝟐)
12
![Page 13: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/13.jpg)
Сортировка вставками
Сортировка вставками – простой алгоритм часто применяемый на малых объёмах данных
Самый популярный метод сортировки у игроков в покер
Массив делится на две части, упорядоченную - левую и неупорядоченную - правую
На каждой итерации выбираем элемент из правой части и вставляем его на подходящее место в левой части
Массив из n элементов требует n-1 итерацию
13
![Page 14: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/14.jpg)
Сортировка вставками
23 78 45 8 32 56
23 78 45 8 32 56
23 45 78 8 32 56
8 23 45 78 32 56
8 23 32 45 78 56
8 23 32 45 56 78
Ord
ered
Unord
ered
14
![Page 15: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/15.jpg)
Сортировка вставками
void insertion_sort(int *a, int n) {
for (int i = 1; i < n; ++i) {
int tmp = a[i];
for (int j = i; j > 0 && tmp < a[j-1]; --j) {
a[j] = a[j-1];
}
a[j] = tmp;
}
}
15
![Page 16: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/16.jpg)
Сортировка вставками: Анализ
Время работы алгоритма зависит не только от размера массива, но и от порядка элементов
Лучший случай: O(n) Массив упорядочен по возрастанию
Внутренний цикл сделает 0 итераций
Количество копирований: 2*(n-1) O(n)
Количество сравнений: (n-1) O(n)
Худший случай: O(n2) Массив упорядочен в порядке убывания:
Внутренний цикл работает i-1 итерацию, для i = 2,3, …, n
Количество копирований: 2*(n-1)+(1+2+...+n-1)= 2*(n-1)+ n*(n-1)/2 O(n2)
Количество сравнений: (1+2+...+n-1)= n*(n-1)/2 O(n2)
В среднем: O(n2)
16
![Page 17: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/17.jpg)
Сортировка пузырьком
Сортировка пузырьком – частный случай сортировки выбором
Массив делится на две части, упорядоченную - левую и неупорядоченную - правую
На каждой итерации проходим правую часть сравнивая текущий элемент с соседом слева
меняем элементы местами если сосед больше
Иначе, уменьшаем индекс текущего на 1
Наименьший элемент всплывает к границе левой части
Останавливаемся если не было ни одного обмена
Массив из n элементов требует максимум n-1 итерацию
17
![Page 18: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/18.jpg)
Сортировка пузырьком
18
![Page 19: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/19.jpg)
Сортировка пузырьком: Анализ
Лучший случай
1 проход, N-1 сравнение, 0 обменов => 𝑶(𝑵)
Худший случай
N-1 проход, N(N-1)/2 сравнений, N-1 обменов => 𝑶(𝑵𝟐)
19
![Page 20: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/20.jpg)
Сортировка пузырьком
20
![Page 21: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/21.jpg)
Предел скорости
Оценка сложности
21
![Page 22: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/22.jpg)
Теоретико-числовая оценка сложности
Количество перестановок N элементов: N!
1 сравнение = 1 бит информации
Для записи номера перестановки нужно
𝑙𝑜𝑔2 𝑁! ≅ 𝑁 𝑙𝑜𝑔 𝑁 бит
22
![Page 23: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/23.jpg)
Сортировка вставками. n(log(n)) ?
Будем искать позицию вставки в упорядоченную часть массива бинарным поиском
𝑶 𝒏 𝐥𝐨𝐠 𝒏 - операций сравнения
𝑶(𝒏𝟐) – операций перемещения
Используем memmove для уменьшения константы 𝑪𝟐
𝑻 𝒏 ≤ 𝑪𝟏 𝒏 𝒍𝒐𝒈(𝒏) + 𝑪𝟐 𝒏^𝟐
23
![Page 24: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/24.jpg)
Сортировка вставками. n(log(n)) ?
void memmove(char *dst, char *src, int size);
void insertionSortFast(int *a, int n) {
for (int i = 1; i < n; ++i) {
int new_pos = binary_search(a, i, a[i]);
if (new_pos < i) {
int tmp = a[i];
memmove(&a[new_pos + 1], &a[new_pos],
(i - new_pos)*sizeof(int));
a[new_pos] = tmp;
}
}
}
24
![Page 25: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/25.jpg)
Сортировка вставками. n(log(n)) ?
Будем искать позицию вставки за время 𝑶(𝒍𝒐𝒈(𝒊 − 𝒌))
𝑶 𝒏 𝐥𝐨𝐠 𝒏 , 𝜽(𝒏) - операций сравнения
𝑶 𝒏𝟐 , 𝜽 𝟏 - операций перемещения
25
![Page 26: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/26.jpg)
Хорошие сортировки
Пирамидальная сортировка - Heap Sort
Сортировка слиянием - Merge Sort
Быстрая сортировка - Quick Sort
26
![Page 27: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/27.jpg)
Пирамидальная сортировка
N вставок в кучу: N • O(log(N))
N Извлечение минимума из кучи: N • O(log(n))
Построение кучи из N элементов: O(2N•log(N))
27
![Page 28: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/28.jpg)
Пирамидальная сортировка .
void heap_insert(int *a, int n, int x)
{
a[n+1] = x;
for (int i = n+1; i > 1;) {
if (a[i] > a[i/2]) {
swap(a[i], a[i/2]);
i = i/2;
} else {
break;
}
}
}
28
![Page 29: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/29.jpg)
Пирамидальная сортировка ..
void heap_pop(int *a, int n) {
swap(a[n],a[1]);
for (int i = 1; 2*i < n;) {
i *= 2;
if (i+1 < n && a[i] < a[i+1]) {
i += 1;
}
if (a[i/2] < a[i]) {
swap(a[i/2], a[i]);
}
}
}
29
![Page 30: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/30.jpg)
Пирамидальная сортировка ..!
void heap_sort(int *data, int n) {
int *buff = new int[n+1];
for (int i = 0; i < n; ++i) {
heap_insert(buff, i, data[i]);
}
for (int i = 0; i < n; ++i) {
data[n-1-i] = buff[1];
heap_pop(buff, n - i);
}
delete [] buff;
}
30
![Page 31: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/31.jpg)
Пирамидальная сортировка
Построить пирамиду за линейное время: O(N)
N раз достать максимальный элемент: O(N•log(N))
Не использовать дополнительную память
31
![Page 32: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/32.jpg)
Пирамида за линейное время
Для каждого внутреннего элемента восстановить порядок
По 2 сравнения на уровень дерева
N/2 • 2
32
![Page 33: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/33.jpg)
Пирамида за линейное время
33
![Page 34: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/34.jpg)
Пирамида за линейное время
void heap_make(int *a, int n) {
for (int i = n/2; i >= 1; --i) {
for (int j = i; j <= n/2;) {
int k = j*2;
if (k+1 <= n and a[k] < a[k+1]) {
++k;
}
if (a[j] < a[k]) {
swap(a[k],a[j]);
j = k;
} else {
break;
}
}
}
}
34
![Page 35: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/35.jpg)
Пирамида за линейное время
void heap_sort_fast(int *data, int n)
{
heap_make(data - 1, n);
for (int i = 0; i < n; ++i) {
heap_pop(data - 1, n - i);
}
}
35
![Page 36: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/36.jpg)
Пирамидальная сортировкакак эволюция сортировки выбором
Heap Sorted
36
![Page 37: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/37.jpg)
Сортировка Хоара: QuickSort
Разделим массив на 2 части, так что элементы в левой меньше чем в правой
Применим эту процедуру к левой и правой частям рекурсивно
37
![Page 38: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/38.jpg)
QuickSort: Split
Установим 2 указателя: i в – начало массива, j – в конец
Будем помнить под каким указателем лежит «пивот»
Если a[j] > a[i], поменяем элементы массива под I, j
Сместим на 1 указатель, не указывающий на «пивот»
Продолжим пока i != j
38
![Page 39: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/39.jpg)
QuickSort: Split
39
![Page 40: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/40.jpg)
Сортировка Хоара
void quick_sort(int *a, int n) {
int i = 0;
int j = n - 1;
bool side = 0;
while (i != j) {
if (a[i] > a[j]) {
swap(a[i], a[j]);
side = !side;
}
if (side) {
++i;
} else{
--j;
}
}
if (i > 1) quick_sort(a, i);
if (n > i+1) quick_sort(a + (i+1), n - (i+1));
}
40
![Page 41: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/41.jpg)
Quicksort: анализ
Предположим, что split делит массив в соотношении 1:1
𝑻 𝒏 ≤ 𝒄𝟏 + 𝒄𝟐 𝒏 + 𝑻𝒏
𝟐+ 𝑻
𝒏
𝟐=
= 𝒌=𝟎𝒍𝒐𝒈𝟐𝒏{𝒄𝟏𝟐
𝒌 + 𝒄𝟐𝒏} = 𝒄𝟏𝒏 + 𝒄𝟐𝒏 𝒍𝒐𝒈 𝒏
𝑻 𝒏 = 𝑶 𝒏 𝒍𝒐𝒈 𝒏
41
![Page 42: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/42.jpg)
Quicksort: анализ
Упорядоченный массив делится в соотношении 1:n-1
𝑻 𝒏 = с𝟏 + 𝒄𝟐𝒏 + 𝑻 𝒏 − 𝟏 =𝟏
𝟐𝒄𝟐𝒏
𝟐 + 𝒄𝟏𝒏 = 𝑶 𝒏𝟐
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
* * * * * * * * * * * * * * * * * * * *
42
![Page 43: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/43.jpg)
Quicksort: выбор пивота
1й элемент
Серединный элемент
Медиана трёх
Случайный элемент
Медиана
Медиана по трём случайным
…
43
![Page 44: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/44.jpg)
Quicksort-killer
Последовательность, приводящая к времени: 𝑻(𝒏) =𝑶(𝒏𝟐)
[1,2,3,…n] первый элемент
Для любого предопределённого порядка выбора пивота, существует killer-последовательность
http://www.cs.dartmouth.edu/~doug/mdmspe.pdf44
![Page 45: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/45.jpg)
Свойства сортировок
Локальная сортировка сортировка не требует дополнительной памяти
Стабильная сортировка сохраняет порядок следования равных элементов
45
![Page 46: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/46.jpg)
Стабильность сортировки
Постоянство порядка элементов с неразличимыми ключами
Сортировка двузначных чисел по старшему разряду
[21,22,23,24,25,19,18,17,16] => [19,18,17,16,21,22,23,24,25]
Любую сортировку можно сделать стабильной, за O(n) дополнительной памяти
Algorithm insertion select heap quick merge
stable Yep Yep No Possible ???
46
![Page 47: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/47.jpg)
Локальность сортировки
Отсутствие необходимости во внешней памяти
Тривиальные сортировки локальны
Cкорость – плата за локальность
http://akira.ruc.dk/~keld/teaching/algoritmedesign_f04/Artikler/04/Huang88.pdf <= inplace merge
Algorithm insertion select heap quick merge
Inplace 𝑂(𝑛2) 𝑂(𝑛2) 𝑂(𝑛 log(𝑛)) 𝑂(𝑛 log(𝑛))?? 𝑂 𝑛 log 𝑛 ??
𝑂(log(𝑛)) 𝑂(𝑛 log(𝑛))
𝑂(𝑛) 𝑂(𝑛 log(𝑛))
47
![Page 48: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/48.jpg)
Порядковые статистики
K-й порядковой статистикой называется элемент, который окажется на k-й позиции после сортировки массива
48
![Page 49: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/49.jpg)
Рандомизованная медиана
Медиана RandSelect(A[1, N], k); k = N/2
Случайно выберем элемент из A: A[j]
Разобьём A на 2 части: меньше/больше A[j]
Пусть позиция A[j] в разделённом массиве: k
k < j ?
Найдём: RandSelect(A[1, j], k)
Иначе: RandSelect(A[j+1, N], k-j)
49
![Page 50: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/50.jpg)
Quicksort: медиана за линейное время
Медиана SELECT(A[1,N], k); k = N/2
Разобьём массив на пятёрки
Отсортируем каждую пятёрку
Найдём медиану середин пятёрок
Разобьём массив на 2 группы: меньше/больше медианы пятёрок
Пусть индекс медианы в массиве j
j > k ?
найдём: SECLECT(A[1, j], k)
иначе: SELECT(A[j+1, N], k-j)
50
![Page 51: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/51.jpg)
Медиана за линейное время
51
![Page 52: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/52.jpg)
Медиана за линейное время: анализ
• Разобьём массив на пятёрки
• Отсортируем каждую пятёрку 𝒄𝟏𝑵
• Найдём медиану середин пятёрок 𝑻(𝑵/𝟓)
• Разобьём массив на 2 группы <> медианы медиан: 𝒄𝟐𝑵• найдём: SECLECT(A[1, j], k) => 𝑻(𝒋)
• иначе: SELECT(A[j+1, N], k-j) => 𝑻 𝑵 − 𝒋 ; 𝟎. 𝟑𝑵 ≤ 𝒋 ≤ 𝟎. 𝟕𝑵;
• 𝑻 𝑵 ≤ 𝑻𝑵
𝟓+ 𝒄𝑵 + 𝑻 𝟎. 𝟕𝑵 ; => 𝑻(𝑵) = 𝑶(𝑵);
52
![Page 53: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/53.jpg)
Вопросы?
?
??
![Page 54: Алгоритмы и структуры данных весна 2014 лекция 3](https://reader034.vdocuments.mx/reader034/viewer/2022052619/555e19bfd8b42a9e188b58bb/html5/thumbnails/54.jpg)
Спасибо за внимание!
Иванов Георгий
Поиск.mail.ru