Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по SD.doc
Скачиваний:
22
Добавлен:
21.09.2019
Размер:
1.19 Mб
Скачать

Сд типа хеш-файл.

Осуществляется отображение n:1. Хеширование является реализацией вышерассмотренной идеи. Хеширование задается функцией:

Function h (key.Tk): 0..N;

При создании файла каждый элемент отмечается как пустой. Запись данных в файл производится следующим образом. Вычисляется значение функции h. Если элемент с вычисленным номером пуст, то данные сохраняются в этом элементе. В противном случае ищется первый справа пустой элемент. Если дошли до конца файла, то возвращаемся назад и продолжаем поиск. Записываем в первый пустой элемент.

Чтение из файла производится по ключу аналогично. Вычисляется значение функции h. Если элемент пуст, то нужного элемента в файле нет. В противном случае ключ этого элемента сравнивается с заданным и в случае совпадения – ключ найден. Если значения сравниваемых ключей различны, то начинаем последовательный просмотр следующих элементов до тех пор, пока не найдется первый пустой элемент или элемент с заданным ключом.

= k mod N – функция хеширования (N – простое число)

[k mod (10000/100)]

h(k) = B + m[k mod (10 n/10 l)], где B и m – константы, n > l.

В качестве хеш-функции может быть использован полином. В таком случае ключ – значение данного полинома. Вначале вычисляется полином, а затем берется по модулю относительно переменной N.

Внешняя сортировка.

Внешняя сортировка необходима, когда число сортируемых записей превышает объем основной памяти. Структура данных при данной сортировке должна быть такой, чтобы сравнительно медленные периферийные запоминающие устройства могли справиться с потребностями алгоритма сортировки. По этой причине большинство методов внутренней сортировки бесполезны для внешней сортировки.

Основная идея внешней сортировки заключается в том, что мы делим весь сортируемый файл на несколько множеств, затем отдельно осуществляем сортировку каждого из них, сохранив их при этом в отдельных файлах., а затем проводим процедуру слияния этих файлов. Слияние означает объединение двух или более упорядоченных последовательностей в одну упорядоченную последовательность. Слияние использует очень простые СД, которые можно пройти последовательным образом. Такой процесс – внутренняя сортировка с последующим внешним слиянием и является основной идеей алгоритма внешней сортировки.

Рассмотрим алгоритм слияния (x, y, z – ключи в файлах):

Имеем: x1  x2  …  xn (1 файл); y1  y2  …  ym (2 файл); z1  z2  …  zn+m (3 файл).

  1. i=1, j=1, k=1;

  2. найти наименьшее;

если x i < y j, то идти к п.3 иначе к п.5;

  1. вывести x i ; z k  x i ; i=i+1; k=k+1;

если i  n, то идти к п.2;

  1. вывести y j … y m , т.е. z k … z n+m  y j … y m ;

конец алгоритма.

  1. вывести y j ; z k  y j ; k=k+1; j=j+1;

если j  m, то идти к п.2;

  1. вывести x i … x n , т.е. z k … z n+m  x i … x n ;

конец алгоритма.

Алгоритм прямого слияния.

Этот алгоритм является одним из простейших.

фаза разделения

фаза слияния

b(1) b(2) b(k)

a a a a

2 4 2k

проход 1 проход 2 проход k

c(1)

c(2)

c(k)

Серия – упорядоченная последовательность. Серия может быть различной длины.

Алгоритм:

  1. Последовательность а разбивается на две половины b и c. Затем осуществляется слияние частей b и c, при этом серия размерностью 1 становится серией размерностью 2.

  2. Полученная последовательность снова обрабатывается последовательностью 1 и 2. Получается серия размерностью 4.

  3. Повторяем шаги, получая серии 8, … до тех пор, пока не будет упорядочена вся последовательность.

Рассмотренный алгоритм еще называют трехленточным (каждый файл последовательного доступа называют лентой).

a = {50, 3, 7, 60, 80, 90, 13, 15}

Поскольку на каждом проходе размерность серии удваивается, то сортировка заканчивается, когда p  n, где р – размер серии, а n – размер исходного файла.

Количество проходов: k = [log 2 n]. По определению при каждом проходе все множество из n элементов копируется ровно 1 раз, следовательно общее число пересылок М = n[log 2 n]. Число сравнений С еще меньше, чем М, т.к. при копировании остатка последовательности сравнения не производятся. Поскольку сортировка слиянием использует ВЗУ, то временные затраты на операцию пересылки на несколько порядков превышают временные затраты на операции сравнения.

Улучшение характеристик сортировки можно обеспечить увеличением файлов на фазе разделения и фазе слияния. Обозначим количество файлов – N. Тогда слияние r серий при 1 проходе дает r/N – количество серий, а на k-том проходе r/Nk. Тогда количество проходов будет k = [log N n], а количество пересылок М = n[log N n].

Например, при N=4:

Если N – большое, то можно использовать улучшенные сортировки (деревом):

38

80

  • 1

10

70

  • 2

100

200

  • 3

50

60

  • 4

38

38

38

10

10

50

100

200

50

60

Вообще можно считать, что имеется N/2 входов и столько же выходов, и они меняются местами после каждого отдельного прохода.