ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция №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