Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Структурные элементы данных алгоритмы поиска и сортировки. Учебное пособие для СПО
.pdf
41
пируется в конец файла A. Процесс завершается, когда в файле A остается только одна серия.
Запишем алгоритм сортировки естественным слиянием:
1. Разбить исходный файл А по сериям в файлы В и С.
2. Прочитать начальные элементы каждого файла. Если один из файлов
пустой, перейти к п. 6.
3. Сравнить два элемента и записать минимальный в выходной файл, а на
его место прочитать следующий элемент.
4. Если конец серии не достигнут, перейти к п. 3.
5. Если достигнут конец серии, переписать элементы другого файла до
окончания серии и перейти к п. 2.
6. Если в другом файле имеются серии (хотя бы одна), переписать эле-
менты этих серий в выходной файл. На шаг 1.
В отличие от предыдущего алгоритма в рассмотренном необходимо об-
наружить конец серии.
Это можно сделать следующим способом. Ключ прочитанной записи
сравнивается с ключом следующей записи. Если значение ключа следующей
записи меньше, то серия закончена.
Рассмотрим сортировку естественным слиянием на примере (рис. 1.21).
Пусть задан файл A:
A — 17 31
05 59
13 41 43 76
11 23 29 47
03 07 71
02 19 57
37 61
B — 17 31
13 41 43 76
03 07 71
37 61
C —
05 59
11 23 29 47
02 19 57
A —
05 17 31 59
11 13 23 29 41 43 47 76
02 03 07 19 57 71
37 61
B — 05 17 31 59
02 03 07 19 57 71
C — 11 13 23 29 41 43 47 76
37 61
A — 05 11 13 17 23 29 31 41 43 47 59 76
02 03 07 19 37 57 61 71
B — 05 11 13 17 23 29 31 41 43 47 59 76
C — 02 03 07 19 37 57 61 71
A — 02 03 05 07 11 13 17 19 23 29 31 37 41 43 47 57 59 61 71 76
Рис. 1.21. Сортировка естественным слиянием
На основе рассмотренного выше алгоритма легко получить алгоритм од-
нофазной сортировки естественным слиянием с четырьмя файлами.

42
1.9.4. Сортировка методом поглощения
В рассмотренных выше алгоритмах внешней сортировки совсем не используется преимущество современных компьютеров — наличие довольно
большой оперативной памяти.
Ниже будет рассмотрен алгоритм внешней сортировки, в котором мы
можем использовать внутреннюю память компьютера.
Тогда в память из конца файла считываем первую порцию данных, упорядочиваем и записываем на то же место в исходный файл А.
Далее для всех последующих частей файла А справа налево выполняем
следующие действия: считываем очередную порцию данных в оперативную
память, сортируем, сливаем с уже отсортированной частью файла А (отсортированная часть файла поглощает очередную порцию еще не отсортированных
данных), записывая результат на место поглощаемой части и далее до конца
файла.
Таким образом, еще не упорядоченная часть файла как бы поглощается
часть за частью.
Если при слиянии взяты все записи поглощаемой части, поглощение завершается. Слияние также завершается, если исчерпана ранее упорядоченная
часть. Поглощение ею очередной части произошло.
А
—
34
78
54
32
01
67
23
29
87
23
56
12
04
67
22
ОП
—
04 22 67
А
—
34
78
54
32
01
67
23
29
87
23
56
12
04 22 67
ОП
—
12 23 56
А
—
34
78
54
32
01
67
23
29
87
04 12 22 23 56 67
ОП
—
23 29 87
А
—
34
78
54
32
01
67
04 12 22 23 23 29 56 67 87
ОП
—
01 32 67
А
—
34
78
54
01 04 12 22 23 23 29 32 56 67 67 87
ОП
—
34 54 78
А
—
01 04 12 22 23 23 29 32 34 54 56 67 67 78 87
Рис. 1.22. Сортировка методом поглощения
Рассмотрим пример сортировки методом поглощения (рис. 1.22). Пусть
в основной памяти одновременно можно обработать три элемента.

43
2. ПРАКТИЧЕСКАЯ ЧАСТЬ
2.1. ЗАДАНИЕ ПО ТЕМЕ «СРЕДА РАЗРАБОТКИ VISUAL STUDIO»
Заданы стороны прямоугольного параллелепипеда a, b и c (рис. 2.1).
Рассчитать площадь поверхности прямоугольного параллелепипеда:
S = 2 × (ab + bc + ac)
и его объем
V = abс.
Рис. 2.1. Прямоугольный параллелепипед
2.2. ЗАДАНИЯ ПО ТЕМЕ «ПОСЛЕДОВАТЕЛЬНЫЙ ПОИСК»
2.2.1. Неоптимальный последовательный поиск
1. Разработать интерфейс программного комплекса практических заданий
2.2.1–2.2.3. Пример формы приведен на рис. 2.2. Рисунок демонстрирует только
функционал разрабатываемой программы. Ваш вариант должен предоставлять
неменьшие возможности. Расположение компонент, состав компонент, оформление частей формы в вашем варианте могут быть другими.

44
Рис. 2.2. Форма «Последовательный поиск»
2. Запрограммировать алгоритм неоптимального последовательного по-
иска (алгоритм А) для неупорядоченного массива.
Массив из 1 000 000–10 000 000 элементов задавать с помощью датчика
случайных чисел (в методе Form1_Load). В случае высокого быстродействия
используемого компьютера для снятия временных характеристик поиск следует
осуществлять многократно — 100–10 000 раз либо увеличить размерность исходного массива. Подобрать размер массива и, если требуется, количество зацикливаний таким образом, чтобы минимальное время поиска было не менее
100 тиков.
На форме предусмотреть поле для ввода искомого ключа. Выводить результат поиска (индекс найденного элемента / поиск неудачен), а также время
поиска ключа.
Для задания неупорядоченного массива датчиком случайных чисел можно использовать следующий код:
Random rnd = new Random();
for (int i = 0; i < n; i++) mas[i] = rnd.Next(0, n).
Для вычисления времени выполнения блока кода можно использовать
следующий подход:
int StartTime = Environment.TickCount;
{
Блок кода
}

45
int ResultTime = Environment.TickCount - StartTime;
textBox1.Text = ResultTime.ToString().
Контрольные вопросы:
1. Дайте определение понятия «поиск».
2. Каково среднее количество сравнений при поиске в неупорядоченном
массиве, если поиск неудачен?
3. Каково среднее количество сравнений при поиске в неупорядоченном
массиве, если поиск удачен?
2.2.2. Оптимальный последовательный поиск
1. Используя разработанную программу (2.2.1), запрограммировать алгоритм оптимального последовательного поиска (алгоритм В) для неупорядоченного массива.
2. Выполнить сравнение времени поиска алгоритмов неоптимального последовательного поиска (алгоритм А) и оптимального последовательного поиска (алгоритм В) для неупорядоченного массива.
Примерный результат работы программы приведен на рис. 2.3.
Рис. 2.3
Контрольные вопросы:
1. В чем оптимальность оптимального последовательного поиска по сравнению с неоптимальным поиском?
2. Какое из сравнений, присутствующих в цикле неоптимального последовательного поиска, отсутствует в цикле оптимального последовательного поиска и на основании чего его можно убрать из цикла?

46
2.2.3. Последовательный поиск в упорядоченном массиве.
Сравнение алгоритмов последовательного поиска
1. Используя разработанную программу (2.2.1–2.2.2), запрограммировать
алгоритм оптимального последовательного поиска для упорядоченного массива
(алгоритм С).
2. Сравнить работу алгоритмов оптимального поиска в неупорядоченном
массиве (алгоритм В) и алгоритм оптимального поиска в упорядоченном массиве (алгоритм С) для упорядоченного массива.
Рис. 2.4
Упорядоченный массив из 1 000 000–10 000 000 элементов задавать с по-
мощью датчика случайных чисел (в методе Form1_Load). В случае высокого
быстродействия используемого компьютера для снятия временных характеристик поиск следует осуществлять многократно — 100–10 000 раз либо увеличить размерность исходного массива. Подобрать размер массива и, если требуется, количество зацикливаний таким образом, чтобы минимальное время поиска было не менее 100 тиков.
ВНИМАНИЕ! Алгоритм В в программном комплексе используется два-
жды: в левой части — для сравнения с алгоритмом А при поиске в неупорядоченном массиве (2.2.2), в правой — для сравнения с алгоритмом С при поиске в
упорядоченном массиве (2.2.3).

47
Контрольные вопросы:
1. В чем отличие алгоритма оптимального последовательного поиска
в неупорядоченном массиве от алгоритма оптимального последовательного поиска в упорядоченном массиве?
2. Задан упорядоченный массив и ключ поиска K, значение которого присутствует в массиве. Какой алгоритм (алгоритм В или алгоритм С) быстрее
найдет этот ключ?
3. Задан упорядоченный массив и ключ поиска K, значение которого отсутствует в массиве. Какой алгоритм (алгоритм В или алгоритм С) быстрее не
найдет этот ключ?
2.3. ЗАДАНИЯ ПО ТЕМЕ «БИНАРНЫЙ ПОИСК»
2.3.1. Алгоритм неоптимального бинарного поиска
1. Разработать интерфейс программного комплекса заданий 2.3.1–2.3.3.
Пример формы приведен на рис. 2.5. Рисунок демонстрирует только функционал разрабатываемой программы. Ваш вариант должен предоставлять неменьшие возможности. Расположение компонент, состав компонент, оформление
частей формы в вашем варианте могут быть другими.
Для создания данной формы использовались те же компоненты, что и для
формы последовательного поиска.
2. Написать программу оценки временных характеристик работы алгоритмов неоптимального бинарного поиска (алгоритм А).
Упорядоченный массив из 1 000 000–100 000 000 элементов задавать
с помощью датчика случайных чисел (в методе Form1_Load). Для снятия временных характеристик поиск следует осуществлять многократно — 10 000–
10 00 000 раз. Необходимо подобрать количество зацикливаний таким образом,
чтобы минимальное время поиска было не менее 100 тиков.
На форме предусмотреть поле для ввода искомого ключа. Выводить ре-
зультат поиска (индекс найденного элемента / поиск неудачен), а также время
поиска ключа.

48
Рис. 2.5. Форма «Бинарный поиск»
Контрольные вопросы:
1. Каково среднее число сравнений для алгоритма неоптимального бинарного поиска, если поиск удачен?
2. Каково число сравнений для алгоритма неоптимального бинарного поиска, если поиск неудачен?
2.3.2. Алгоритм оптимального бинарного поиска
1. Используя разработанную программу (2.3.1), запрограммировать алгоритм оптимального бинарного поиска (алгоритм В) и алгоритм интерполяционного бинарного поиска (алгоритм С).
2. Выполнить сравнение времени поиска алгоритмов оптимального бинарного поиска и интерполяционного бинарного поиска с запрограммированным ранее алгоритмом А.
Контрольные вопросы:
1. В чем принципиальное отличие алгоритма неоптимального бинарного
поиска от алгоритма оптимального бинарного поиска?
2. В чем оптимальность оптимального бинарного поиска?

49
3. В чем принципиальное отличие алгоритма интерполяционного бинар-
ного поиска от классического алгоритма бинарного поиска?
2.3.3. Алгоритм «последовательного» бинарного поиска
1. Используя разработанную программу (2.3.1–2.3.3), запрограммировать
алгоритм «последовательного» бинарного поиска.
2. Добавить в программу алгоритм последовательного поиска в упорядоченном массиве, взяв код этого алгоритма (2.2.3).
3. Выполнить сравнение времени поиска алгоритма «последовательного»
бинарного поиска (алгоритм D) и последовательного поиска в упорядоченном
массиве с запрограммированными ранее алгоритмами. Возможный результат
работы комплекса программ приведен на рис. 2.6.
Рис. 2.6
Приведенные на рис. 2.6 результаты были получены при размерности
массива 100 000 000 элементов, причем для получения ненулевых результатов
каждый алгоритм (А, В, С и D) был зациклен 1 000 000 раз. Очевидно, что, если
и последовательный поиск был бы зациклен миллион раз, ждать результата

50
пришлось бы недопустимо долго. Поэтому в программе последовательный
поиск был зациклен только 100 раз, а вот полученное время было умножено на
10 000. В своей программе вы должны подобрать эти константы самостоятельно в зависимости от быстродействия вашего компьютера.
Контрольные вопросы:
1. В чем особенности алгоритма «последовательного» бинарного поиска?
2. На основе многократных экспериментов сделать вывод о том, какой из
алгоритмов бинарного поиска наиболее эффективен.
2.4. ЗАДАНИЯ ПО ТЕМЕ «ПОИСК МЕТОДОМ ХЕШИРОВАНИЯ»
2.4.1. Функции хеширования
1. Разработать интерфейс программного комплекса практических заданий
2.4.1–2.4.4. Пример формы приведен на рис. 2.7. Рисунок демонстрирует только
функционал разрабатываемой программы. Ваш вариант должен предоставлять
неменьшие возможности. Расположение компонент, состав компонент, оформление частей формы в вашем варианте могут быть другими.
Рис. 2.7. Форма «Поиск методом хеширования»
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
