1. - Кафедра вычислительных систем

реклама
ПРОГРАММИРОВАНИЕ/
ЯЗЫКИ ПРОГРАММИРОВАНИЯ
Лекция №7
Алгоритмы внешней сортировки
(весенний семестр 2012 г.)
Доцент Кафедры вычислительных систем, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Сортировка данных
 Сортировка – процесс перестановки элементов
некоторого множества в определенном порядке.
 Цель сортировки – упрощение поиска данных в
этом множестве.
 Задача сортировки данных часто возникает при
разработке программного обеспечения.
 Алгоритмы сортировки можно разделить на:
 алгоритмы внутренней сортировки;
 алгоритмы внешней сортировки.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
2
Алгоритмы внешней и внутренней
сортировки
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
3
Алгоритмы внутренней сортировки
Алгоритмы внутренней сортировки (сортировки массивов)
предназначены для работы с данными, которые полностью
помещаются в оперативную память вычислительной
машины, выполняющей данную операцию.
Оперативная
память
характеризуется
произвольным доступом к ее элементам.
К алгоритмам внутренней сортировки
требования экономичности по памяти.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
быстрым
предъявляются
4
Алгоритмы внешней сортировки
Алгоритмы внешней сортировки (сортировки файлов)
предназначены для работы с данными, объем которых не
позволяет полностью разместить их в оперативную память
вычислительной машины, выполняющей данную операцию.
Такие данные располагаются на внешних запоминающих
устройствах, таких как диски и магнитные ленты.
Внешняя память характеризуется последовательным
доступом к ее элементам. В каждый момент времени
имеется непосредственный доступ только к одному
элементу.
Основной метод сортировки – слияние.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
5
Оценка алгоритмов сортировки
При оценке эффективности
алгоритма учитывается:
внутреннего
С – количество операций сравнения
М – количество операций пересылки данных.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
6
Внешние запоминающие устройства
(накопители)
Энергонезависимая память, обладающая более низкой (по
сравнению с оперативной) пропускной способностью.
Виды накопителей:
Накопители на магнитных лентах (НМЛ, Tape)
Накопители на жестких магнитных дисках (НЖМД, HDD)
Накопители на гибких магнитных дисках (НГМД)
Накопители на оптических дисках (НОД, CD-ROM)
Флеш-память (Flash)
Твердотельные накопители (SSD)
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
7
Накопители на жестких
магнитных дисках
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
8
Терминология
Фаза – операция однократной обработки всего
набора данных
Проход
(этап)
–
наименьший
процесс,
повторение которого образует процесс сортировки.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
9
Двухфазный алгоритм сортировки
простым слиянием
Пусть выполняется сортировка последователь-ности
a, состоящей из n элементов.
1. Параметр k устанавливается в значение 1: k = 1.
2. Последовательность a разбивается на две половины: b
и c.
3. Последовательности b и c сливаются обратно в a
путем объединения фрагментов, состоящих из k
элементов, в упорядоченные фрагменты, состоящие из
2∙k элементов.
4. k = k ∙ 2
5. ЕСЛИ k >= n, то алгоритм ЗАВЕРШЕН;
ИНАЧЕ перейти на ШАГ 2.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
10
Алгоритм сортировки простым
слиянием (пример)
a = 44 55 12 42 94 18 06 67
n=8
1. k = 1.
2. b = 44 55 12 42, c = 94 18 06 67
3. a = 44 94 ' 18 55 ' 06 12 ' 42 67
4. k = 2
2. b = 44 94 ' 18 55, c = 06 12 ' 42 67
3. a = 06 12 44 94 ' 18 42 55 67
4. k = 4
2. b = 06 12 44 94 , c = 18 42 55 67
3. a = 06 12 18 42 44 55 67 94
4. (k = 8) == n. КОНЕЦ
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
11
Анализ двухфазного алгоритма
сортировки слиянием
Фазы алгоритма:
 разбиение последовательности пополам;
 слияние двух последовательностей в одну.
Алгоритм требует использования трех
"магнитных лент" или файлов. Поэтому
называется трехленточным.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
12
Оценка двухфазного алгоритма
сортировки простым слиянием
Количество проходов:
 зависит от параметра k ≥ n, который удваивается после
каждого прохода;
 общее число проходов: log2n.
Число M пересылок данных:
 проход состоит из двух фаз, на каждой из которых
выполняется копирование каждого элемента из a;
 на одном проходе обрабатывается 2n элементов;
 общее число пересылок M = 2n∙[log2n];
Число C сравнений по ключу:
 сопоставимо с M;
 время сравнения значительно ниже времени
пересылки.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
13
Однофазный алгоритм сортировки
простым слиянием
Пусть выполняется сортировка последовательности a, состоящей из n элементов.
1. Параметр k устанавливается в значение 1: k = 1.
2. Вторая половина a перемещается в b.
3. Фрагменты последовательностей a и b, состоящие
из k элементов попарно распределяются в
последовательности c и d.
4. Имена последовательностей меняются местами:
c ↔ a, d ↔ b
5. ЕСЛИ k > n/2, слить a и b в а, ВЫХОД;
ИНАЧЕ k = k ∙ 2, перейти на ШАГ 3.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
14
Однофазный алгоритм сортировки
простым слиянием (пример)
a = 44 55 12 42 94 18 06 67
n=8
1. k = 2.
2. a = 44 55 12 42, b = 94 18 06 67
3. c = 44 94 ' 06 12, d = 18 55 ' 42 67
4. a = 44 94 ' 06 12, b = 18 55 ' 42 67
5. k = 4
3. c = 18 44 55 94 ', d = 06 12 42 67 '
4. a = 18 44 55 94 ', b = 06 12 42 67 '
5. k = n/2
a = 06 12 18 42 44 55 67 94
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
15
Анализ однофазного алгоритма
сортировки простым слиянием
Однофазный
алгоритм
простого
слияния,
получается из двухфазного варианта путем
объединения фазы разбиения последовательности
пополам и фазы слияния двух последовательностей в
одну.
Это достигается за счет использования четырех
"магнитных лент" или файлов. Поэтому данный
алгоритм называется четырехленточным.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
16
Оценка однофазного алгоритма
сортировки простым слиянием
Количество проходов:
 зависит от параметра k ≥ n, который удваивается после
каждого прохода;
 общее число проходов: log2n.
Число M пересылок данных:
 проход состоит из одной фазы предусматривающей
копирование каждого элемента из a;
 на одном проходе обрабатывается n элементов;
 общее число пересылок M = n∙[log2n];
Число C сравнений по ключу:
 сопоставимо с M;
 время сравнения значительно ниже времени
пересылки.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
17
Недостатки алгоритма
простого слияния
 Не учитывается тот факт, что последовательность
может быть частично отсортирована.
 На
k-м
проходе
выполняется
слияние
подпоследовательностей длина которых не превышает
2k, однако возможно существование более длинных
подпоследовательностей.
 Возможно
слияние
подпоследовательностей
длины 2k ≤ m1 ≤ n и 2k ≤ m2 ≤ n, что позволит
уменьшить количество проходов и, следовательно,
ускорить процесс сортировки.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
18
Упорядоченная
подпоследовательность – Серия
Следуя терминологии, принятой в [1] будем
называть упорядоченную подпоследовательность
максимальной длины серией.
Серией назовем подпоследовательность ai, ai+1, …
ai+j, такую, что:
ak ≤ ak + 1, k = i, i+1, … (i + j – 1)
ai – 1 > ai
ai + j > ai+j+1
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
19
Естественность поведения
алгоритма сортировки
Одной из характеристик алгоритмов
является естественность поведения.
сортировки
Естественность поведения — эффективность метода
при обработке уже упорядоченных или частично
упорядоченных данных. Алгоритм ведёт себя
естественно, если учитывает эту характеристику
входной последовательности и работает лучше.
Алгоритм сортировки слиянием, учитывающий
наличие серий во входной последовательности
называется естественным.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
20
Свойство слияния двух
последовательностей
Если последовательность c образована путем
слияния двух последовательностей a и b, содержащих
ma и mb серий соответственно,
то количество mс серий в c удовлетворяет условию:
mc ≤ max(ma, mb).
Если серии распределены по последовательностям a
и b равномерно (ma ≈ mb), то после слияния количество
серий уменьшается в двое.
Таким образом количество пересылок данных в
худшем случае будет равно n∙[log2n].
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
21
Алгоритм естественной
сортировки слиянием
Пусть входная последовательность расположена в
файле c.
Проход состоит из двух фаз:
1. Распределение
серий
из
c
поровну
во
вспомогательные последовательности a и b.
2. Слияние серий из a и b в с.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
22
Алгоритм естественной
сортировки слиянием (пример)
c = 17 31' 5 59' 13 41 43 67' 11 23 29 47' 3 7 71' 2 19 57' 37 61
Проход 1, фаза 1. Распределение:
а = 17 31' 13 41 43 67' 3 7 71' 37 61
b = 5 59' 11 23 29 47' 2 19 57
Проход 1, фаза 2. Слияние:
c = 5 17 31 59' 11 13 23 29 41 43 47 67' 2 3 7 19 57 71' 37 61
Проход 2, фаза 1. Распределение:
а = 5 17 31 59' 2 3 7 19 57 71
b = 11 13 23 29 41 43 47 67' 37 61
Проход 2, фаза 2. Слияние:
c = 5 11 13 17 23 29 31 41 43 47 59 67' 2 3 7 19 37 57 61 71
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
23
Алгоритм естественной
сортировки слиянием (пример) (2)
c = 5 11 13 17 23 29 31 41 43 47 59 67' 2 3 7 19 37 57 61 71
Проход 3, фаза 1. Распределение:
а = 5 11 13 17 23 29 31 41 43 47 59 67
b = 2 3 7 19 37 57 61 71
Проход 3, фаза 2. Слияние:
c = 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 57 59 67 71
Для упорядочения последовательности требуется 3 прохода
сортировки естественным слиянием.
Для сортировки этой же последовательности алгоритмом
простого слияния понадобиться 5 проходов.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
24
Реализация алгоритма сортировки
Файл
mergefile.c
mergefile.h
natsort.c
randgen.c
textgen.c
checksort.c
Описание
Основные операции с бинарным файлом
последовательности
Описание структуры file и прототипы
функций из mergefile.c
Реализация алгоритма естественной
сортировки слиянием
Случайная
генерация
последовательности указанной длины
Генерация
бинарного
файла
последовательности по текстовому.
Проверка корректности результатов
сортировки.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
25
Реализация алгоритма сортировки
(фаза распределения – natmegre.c)
int distribute(struct file *in, struct
file *out1, struct file *out2)
{
while( !fend(in) ){
copyrun(in,out1);
if( !fend(in) )
copyrun(in,out2);
}
}
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
26
Функция copyrun
void copyrun(struct file *in, struct
file *out)
{
int cond = 0;
loadfirst(in);
while( condition(in) > 0 ){
save(in,out);
load(in);
}
}
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
27
Реализация алгоритма сортировки
(фаза распределения – natmegre.c)
uint merge(struct file *out, struct file *in1,
struct file *in2)
{
uint l = 0;
while( !fend(in1) && !fend(in2) ){
mergerun(out,in1,in2);
l++;
}
while( !fend(in1) ){
copyrun(in1,out);
l++;
}
while( !fend(in2) ){
copyrun(in2,out);
l++;
}
}
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
28
Функция mergerun
void mergerun(struct file *out, struct file *in1,
struct file *in2)
{
int eor = 0, cmp;
loadfirst(in1); loadfirst(in2);
do{
cmp = compare(in1,in2);
if( cmp == 0 ){ save(in1,out); load(in1); }
else
if( cmp == 1 ){ save(in2,out); load(in2);}
if( condition(in1)<=0 ){
copyrun(in2,out);
eor = 1;
} else if( condition(in2) <= 0){
copyrun(in1,out);
eor = 1;
}
}while( !eor );
} © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
29
Функция сортировки алгоритмом
естественного слияния
void naturalmerge(char *fname)
{
. . .
while( l != 1 ){
reset(&main);
rewrite(&tmp1);
rewrite(&tmp2);
distribute(&main,&tmp1,&tmp2);
reset(&tmp1);
reset(&tmp2);
rewrite(&main);
l = merge(&main,&tmp1,&tmp2);
}
}
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
30
Недостатки алгоритма естественной
сортировки слиянием
 Затраты
на
последовательную
пропорциональны числу проходов.
сортировку
 На каждом проходе выполняется изменение всего
множества данных во внешней памяти (например, на
жестком диске).
 Для уменьшения числа проходов и, следовательно,
временных затрат на сортировку можно использовать
при распределении и слиянии более двух лент
(файлов).
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
31
Алгоритм сбалансированного
многопутевого слияния
Алгоритм сбалансированного многопутевого слияния
основан на алгоритме естественного слияния и имеет
следующие особенности:
1. Для сортировки используется N лент (файлов),
доступных для хранения промежуточных результатов.
(значение N предполагается четным: N % 2 = 0).
2. Алгоритм имеет одну фазу (алгоритм естественного
слияния – 2).
3. Серии распределяются по первым N/2 файлам, далее
производится их слияние на вторые N/2 файлов.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
32
Анализ алгоритма сбалансированного
многопутевого слияния (пример)
Входная последовательность:
89157834519254683174523879345
1
2
3
4 5
6 7 8 9 10
Распределение по сериям
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
11
12
33
Анализ алгоритма сбалансированного
многопутевого слияния (проход №1)
1
1:
2:
3:
2
1
3
4
5
6
7 8
9
10
11
12
4 7 10
2
3
5
6
8 11
9
12
4:
5:
6:
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
34
Анализ алгоритма сбалансированного
многопутевого слияния (проход №2)
1
1:
2
1
2:
3:
4:
5:
3
5
6
7 8
9
10
11
12
4 7 10
2
3
1
4
5
6
8 11
9
1,22, 3 3
12
1010, 11
11, 1212
4 4,55, 6 6
6: 7 7,88, 99
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
35
Анализ алгоритма сбалансированного
многопутевого слияния (проход №2)
1
2
1:
2:
3
4
5
6
7 8
9
10
11
12
1, 2, 1,
3 2, 3, 4, 5,4,6,5,7,68, 9 7, 8, 9
10, 11, 12
3:
4:
5:
1
1,22, 3 3
1010, 11
11, 1212
4 4,55, 6 6
6: 7 7,88, 99
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
36
Анализ алгоритма сбалансированного
многопутевого слияния (проход №3)
1
1:
2:
2
3
4
5
6
7 8
9
10
11
12
1, 2, 1,
3 2, 3, 4, 5,4,6,5,7,68, 9 7, 8, 9
10, 11, 12
3:
4:
5:
1, 1,
2, 2,
3, 3,
4, 4,
5, 5,
6, 6,
7, 7,
8, 8,
9 9, 10, 11, 1210, 11, 12
6:
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
37
Анализ алгоритма сбалансированного
многопутевого слияния
 Пусть во входном файле имеетcя r серий, для
сортировки используется N файлов, Nh = N/2.
 Серии поровну распределяются по Nh файлам.
Следовательно в каждом из них образуется r/Nh серий.
 При слияния файлов первые серии в каждом из них
объединяются в одну, тоже самое происходит со вторыми,
третьими, … Nh -ми сериями. В итоге количество серий
будет сокращено с r до r/Nh.
 Таким образом, каждый проход уменьшает число серий
в Nh раз.
 Число проходов не превышает logNh n
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
38
Реализация алгоритма сбалансированного
многопутевого слияния
 Файл представляется в программе через структуру
struct file, описанную ранее.
 Для управления набором из N файлов необходимо
использовать массив: struct file tapes[N];
 N-файловый набор F разбивается пополам(F1 и F2):
 F1 содержит промежуточный результат (серии
равномерно распределены по файлам)
 Серии из F1 сливаются в F2.
 Переключение ролей: F1 ↔ F2.
 Для переключения требуется отображение файлов
на их роли на данном проходе алгоритма.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
39
Отображение файлов
Отображение
реализуется
с
помощью
целочисленного массива:
int map[N]; // (N % 2) == 0
Массив map содержит индексы элементов массива
tapes (struct file tapes[N]) .
Первая половина map: map[0]...map[N/2–1]
содержит индексы файлов, из которых производится
слияние.
Вторая половина map: map[N/2]...map[N-1]
хранит индексы файлов в которые производится.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
40
Анализ алгоритма сбалансированного
многопутевого слияния (проход №1)
1
1:
2:
3:
2
1
3
4
5
6
7 8
9
10
11
12
4 7 10
2
3
5
6
8 11
9
12
4:
5:
6:
k1
k2
map 1 2 3 4 5 6
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
41
Анализ алгоритма сбалансированного
многопутевого слияния (проход №2)
1
1:
2
1
2:
3:
4:
5:
4
5
6
7 8
9
10
11
12
4 7 10
2
3
1
3
5
6
8 11
9
1,22, 3 3
4 4,55, 6 6
12
1010, 11
11, 1212
k1
k2
6: 7 7,88, 99
map 1 2 3 4 5 6
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
42
Анализ алгоритма сбалансированного
многопутевого слияния (проход №2)
1
2
1:
2:
3
4
5
6
7 8
9
10
11
12
1, 2, 1,
3 2, 3, 4, 5,4,6,5,7,68, 9 7, 8, 9
10, 11, 12
3:
4:
5:
1
1,22, 3 3
4 4,55, 6 6
1010, 11
11, 1212
k1
k2
6: 7 7,88, 99
map 4 5 6 1 2 3
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
43
Анализ алгоритма сбалансированного
многопутевого слияния (проход №3)
1
1:
2:
2
3
4
5
6
7 8
9
10
11
12
1, 2, 1,
3 2, 3, 4, 5,4,6,5,7,68, 9 7, 8, 9
10, 11, 12
3:
4:
5:
6:
1, 1,
2, 2,
3, 3,
4, 4,
5, 5,
6, 6,
7, 7,
8, 8,
9 9, 10, 11, 1210, 11, 12
k1
k2
map 1 2 3 4 5 6
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
44
Анализ алгоритма сбалансированного
многопутевого слияния (проход №3)
1
2
3
4
5
6
7 8
9
10
11
12
1:
2:
3:
4:
5:
6:
1, 1,
2, 2,
3, 3,
4, 4,
5, 5,
6, 6,
7, 7,
8, 8,
9 9, 10, 11, 1210, 11, 12
k1
k2
map 4 5 6 1 2 6
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
45
Процедура слияния серий из N файлов
1. k - номер выходного файла (изначально k = N/2)
2. Проверяется пустота каждого файла tapes[map[i]],
i = 0 . . . k1-1. Если i-й файл пуст, тo:
map[i] = map[k1-1], k1=k1-1.
3. Определяется наименьший элемент среди входных
файлов v=min(tapes[map[i]] , i = 0 . . . k1)
4. write(v, tapes[map[k])
5. k = k+1, если k ≥ N k = N/2
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
46
Литература
1. Вирт Н. Алгоритмы и структуры данных: Пер. с англ. - М.:
Мир, - 360 с., ил.
2. Кнут, Д.Э. Искусство программирования. Том 1. Основные
алгоритмы. – Вильямс, 2010. – (Серия: Искусство
программирования). – ISBN 978-5-8459-0080-7.
© Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
47
Скачать