23
Лекция 2 Абстрактные типы данных. Алгоритмы сортировки Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://mkurnosov.net/teaching

Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Embed Size (px)

Citation preview

Page 1: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Лекция 2 Абстрактные типы данных.

Алгоритмы сортировки

Курносов Михаил Георгиевич

к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет

телекоммуникаций и информатики

http://mkurnosov.net/teaching

Page 2: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Контроль

2

1. Что такое вычислительная сложность алгоритма

(computational complexity)?

2. T(n) = 3n3 + 2n2, O(3n3 + 2n2) = …. ?

3. T(n) = n + logn, O(n + logn) = …. ?

4. T(n) = nlogn + n2, O(nlogn + n2 ) = …. ?

5. T(n) = 2n + n6 – 1000n3, O(2n + n6 – 1000n3) = …. ?

6. T(n) = n6 + n!, O(n6 + n!) = …. ?

7. Какой асимтотической вычислительной сложностью обладает

алгоритм сортировки методом “пузырька”?

8. Какой асимтотической вычислительной сложностью обладает

алгоритм вычисления факториала числа?

Page 3: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Абстрактные типы данных

3

Абстрактный тип данных (АТД, Abstract Data Type) –это тип данных, который предоставляет набор функцийдля работы с его элементами

Клиентские программы не имеют доступа к внутренней реализации типа данных (реализация скрыта – инкапсулирована)

Тип данных переменной (Data Type) –множество значений, которые она может принимать(int, char, double, float)

Page 4: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Абстрактный тип данных “множество” (Set)

4

Набор операций определенных над элементами абстрактного типа данных “множество” (Set):

MakeNull(a) – делает множество a пустым

Size(a) – возвращает количество элементов во множестве a(мощность множества)

Union(a, b, c) – объединяет множеств a и b в множество с

Intersect(a, b, c) – строит пересечение множеств a и b, результат помещается в множество с

Minus(a, b, c)

Add(a, x) – добавляет элемент x к множеству a

Find(a, x) – определяет принадлежит ли элемент xмножеству a

Page 5: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Операция Описание Вычислительнаясложность

Сложность по памяти

Get(a, i) Возвращает i-й

элемент массива aO(1) O(1)

Set(a, i, x) Присваивает i-у

элементу массива aзначение x

O(1) O(1)

Size(a) Возвращает количество элементов в массиве a

O(1) O(1)

Sort(a)Упорядочивает

элементы массива апо не убыванию

O(n2), O(nlogn), O(n + r)

O(1), O(logn),

O(n), O(n + r)

Search(a, x)Отыскивает позицию

элемента x в массиве aO(n), O(logn)

Абстрактный тип данных массив (Array)

5

Набор операций определенных над элементами абстрактного типа данных массив (Array):

Page 6: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

#define NELEMS 1024

typedef int elem_t;

elem_t array_get(elem_t *a, int i){

return a[i];}

void array_set(elem_t *a, int i, elem_t x){

a[i] = x;}

int array_size(elem_t *a){

return NELEMS;}

Реализация АТД массив (Array)

6

Page 7: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Алгоритмы сортировки (Sorting)

7

Внутренние методы сортировки (Internal sort) –сортируемые элементы полностью размещеныв оперативной памяти компьютера

Внешняя сортировка (External sort) – элементы размещены на внешней памяти (жесткий диск, USB-флеш)

Алгоритм сортировки не использующий дополнительной памяти (кроме сортируемого массива) называется алгоритмом сортировки на месте (In place)

Page 8: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Алгоритмы сортировки (Sorting)

8

Алгоритм сортировки не меняющий порядок следования равных элементов называется устойчивым (stable)

(Жираф, 800), (Слон, 1500), (Лиса, 40), (Волк, 90), (Кит, 3000), (Барсук, 40)

Вариант сортировки 1:(Барсук, 40), (Лиса, 40), (Волк, 90), (Жираф, 800), (Слон, 1500),

(Кит, 3000) – порядок не соблюден

Вариант сортировки 2:(Лиса, 40), (Барсук, 40), (Волк, 90), (Жираф, 800), (Слон, 1500),

(Кит, 3000) – порядок соблюден

Page 9: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Алгоритмы сортировки (Sorting)

9

Алгоритмы на основе сравнений (Comparison sort): Bubble Sort, Selection Sort, Insertion Sort, Shell Sort, QuickSort, MergeSort, HeapSort и др.

Алгоритмы не основанные на сравнениях: Counting Sort, Radix Sort – используют структура ключа

Утверждение. Любой алгоритм сортировки, основанный на сравнениях, имеет асимптотическую вычислительною сложность (nlogn)

[*] Donald Knuth. The Art of Computer Programming, Volume 3: Sorting andSearching, Second Edition. Addison-Wesley, 1997 (Section 5.3.1: Minimum-Comparison Sorting, pp. 180–197).

Page 10: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Вычислительная сложность сортировки

10

АлгоритмЛучший случай

Средний случай

Худший случай

Память Свойства

Пузырьковаясортировка (Bubble sort)

O(n) O(n2) O(n2) O(1)Устойчивый, “на месте”

Сортировка вставками (Insertion Sort)

O(n) O(n2) O(n2) O(1)Устойчивый,“на месте”,

online

Сортировка выбором (Selection Sort)

O(n2) O(n2) O(n2)O(1)

Неустойчивый, “на месте”

Сортировка Шелла (Shell Sort)

O(n) O(n(logn)2),O(n3\2)

O(n3\2)O(1)

Неустойчивый, “на месте”

Быстрая сортировка(Quick Sort)

O(nlogn) O(nlogn) O(n2) O(logn)Устойчивость

зависит от реализации

Сортировка слиянием(Merge sort)

O(nlogn) O(nlogn) O(nlogn) O(n)Зависит от

реализации

Пирамидальная сортировка (Heap sort)

O(nlogn) O(nlogn) O(nlogn) O(1)“На месте”,

неустойчивый

Page 11: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

“Пузырьковая” сортировка (Bubble Sort)

11

function BubbleSort(v[0:n - 1], n)

swapped = True

while swapped do

swapped = False

for i = 1 to n - 1 do

if v[i - 1] > v[i] then

swap(v[i - 1], v[i])

swapped = True

end if

end for

end while

end function

9

5

54

23

45

2

4

4

42

34“Легкие” элемент перемещаются

(всплывают) в начало массива

TBubbleSort = O(n2)

Page 12: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка вставками (Insertion Sort)

12

function InsertionSort(v[1:n], n)

for i = 1 to n do

j = i

while j > 0 and v[j - 1] > v[j] do

swap(v[j - 1], v[j])

j = j - 1

end while

end for

end function Элемент v[j] перемещается в требуемую позицию уже упорядоченного массива

v[1] ≤ v[2] ≤ … ≤ v[j – 1] --- куда вставить v[j]?

4 15 2 35 88 4 17 23 62 13

j = 2

TInsertionSort = O(n2)

Page 13: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Быстрая сортировка (Quick Sort)

13

1. Из элементов v[1], v[2], …, v[n] выбирается опорный элемент (pivot element)

Опорный элемент желательно выбирать так, чтобы его значение было близко к среднему значению всех элементов

Вопрос о выборе опорного элемента открыт(первый/последний, средний из трех, случайный и т.д.)

2. Массив разбивается на 2 части: элементы массива переставляются так, чтобы элементы расположенные левее опорного были не больше (<=), а расположенные правее –не меньше него (>=). На этом шаге определяется граница разбиения массива.

3. Шаги 1 и 2 рекурсивно повторяются для левой и правой частей

Page 14: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Быстрая сортировка (Quick Sort)

14

function QuickSort(v[1:n], n, l, r)

if l < r then

k = Partition(v, n, l, r) // Разбиваем

QuickSort(v, n, l, k - 1) // Левая часть

QuickSort(v, n, k + 1, r) // Правая часть

end if

end function

QuickSort(1, n)

QuickSort(l, k – 1) QuickSort(k + 1, r)

Худший случай: TQuickSort = O(n2) Средний случай: TQuickSort = O(nlogn)

Page 15: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Быстрая сортировка (Quick Sort)

15

function Partition(v[1:n], n, l, r)

pivot_idx = r /* Выбрали индекс опорного элемента */

swap(v[pivot_idx], v[r])

pivot = v[r]

i = l – 1

for j = l to r – 1 do

if v[j] <= pivot then

i = i + 1

swap(v[i], v[j])

end if

end for

swap(v[i + 1], v[r])

return i + 1

end function

2 8 7 1 3 5 6 4

l = 1i = 0

r = npivot = 4

2 1 7 8 3 5 6 4

j = 1: swap(v[1], v[1])

j = 4: swap(v[2], v[4])

j = 5: swap(v[3], v[5])

2 1 3 8 7 5 6 4

swap(v[4], v[8])

2 1 3 4 7 5 6 8

return 4

Page 16: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка слиянием (Merge Sort)

1616

function MergeSort(a[0:n - 1], n)

if n > 1 then

k = n / 2

Copy(a[0, k - 1], b[0, k - 1]) // a -> b

Copy(a[k, n - 1], c[0, k - 1]) // a -> c

MergeSort(b) // Сортируем левую часть

MergeSort(c) // Сортируем правую часть

Merge(b, c, a) // Сливаем части

end if

end function

Вычислительная сложность сортировки слиянием в худшем случае (worst case)

TMergeSort = O(nlogn)

Доказательство оценки сложности см. [Levitin, С. 169]

Page 17: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка слиянием (Mergesort)

1717[*] Левитин А.В. Алгоритмы: введение в разработку и анализ [Levitin, С. 171]

MergeSort

Merge

MergeSort

MergeSort MergeSort MergeSort

Merge

MergeSort MergeSort

MergeMerge

MergeMerge

Page 18: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка слиянием (Mergesort)

1818

function Merge(b[0:p-1], c[0:q-1], a[0:n-1], p, q, n)// p + q <= ni = j = k = 0while i < p and j < q do

if b[i] ≤ c[j] thena[k] = b[i]i = i + 1

elsea[k] = c[j]j = j + 1

end ifk = k + 1

end whileif i = p then

Copy(c[j, q - 1], a[k, p + q - 1])else

Copy(b[i, p - 1], a[k, p + q - 1])end if

end function

Page 19: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка подсчетом (Counting Sort)

19

Сортировка подсчетом (Counting Sort) –алгоритм сортировки не использующий операцию сравнения элементов (non-comparision sort)

Применим к массивам, сортируемые элементы которых принимают неотрицательные целочисленные значения и не превосходят значения k

АлгоритмХудший случай

Память Свойства

Сортировка подсчетом

(Counting Sort)O(n + k) O(k) Устойчивый

Page 20: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка подсчетом (Counting Sort)

20

function CountingSort(v[0:n - 1], n, k)

for i = 0 to k – 1 do

c[i] = 0

end for

for i = 0 to n – 1 do

c[v[i]] = c[v[i]] + 1

end for

for i = 1 to k – 1 do

c[i] = c[i] + c[i - 1]

end for

for i = n - 1 to 0 do

c[v[i]] = c[v[i]] - 1

b[c[v[i]]] = v[i]

end for

2 11 7 1 3 5 6 3

n = 8, k = 11

0 1 1 2 0 1 1 1 0 0 0 1

c[0:k]:

0 1 2 4 4 5 6 7 7 7 7 8

c[0:k]:

b[0:n-1]:

Входной массив v[0:n–1] должен содержать целые числа от 0 до k – 1 (включительно)

1 2 3 3 5 6 7 11

Page 21: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Сортировка подсчетом (Counting Sort)

21

function CountingSort(v[0:n - 1], n, k)

for i = 0 to k – 1 do

c[i] = 0

end for

for i = 0 to n – 1 do

c[v[i]] = c[v[i]] + 1

end for

for i = 1 to k – 1 do

c[i] = c[i] + c[i - 1]

end for

for i = n - 1 to 0 do

c[v[i]] = c[v[i]] - 1

b[c[v[i]]] = v[i]

end for

2 11 7 1 3 5 6 3

n = 8, k = 11

0 1 1 2 0 1 1 1 0 0 0 1

c[0:k]:

0 1 2 4 4 5 6 7 7 7 7 8

c[0:k]:

b[0:n-1]:

TCountingSort = O(n + k)

1 2 3 3 5 6 7 11

Page 22: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Домашнее чтение

22

[AHU, C. 228-247]: Глава 8. Сортировка – разделы 8.1 – 8.4 (простые схемы сортировки, QuickSort, HeapSort)

[Levitin, С. 169]: Сортировка слиянием

Page 23: Лекция 2: Абстрактные типы данных. Алгоритмы сортировки

Задание 1. Алгоритмы сортировки

23

Реализовать три алгоритма сортировки (по вариантам) и экспериментально исследовать их эффективность

Deadline: 10 марта 2014 г., 23:59 NSK (понедельник)

Внимание! Attention! Achtung! 關注! Atención!На выполнение задания отведено 3 недели —это всего 2 встречи на лабораторных работах (3 и 10 марта) и, соответственно, всего две возможности защитить отчет в срок!