Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Структурные элементы данных алгоритмы поиска и сортировки. Учебное пособие для СПО
.pdf
51
Для создания данной формы использовались те же компоненты, что и для
формы последовательного поиска.
2. Написать функции получения хеш-адреса для рассмотренных выше методов деления, середины квадрата, свертывания и умножения. В качестве теста
для константного ключа K = 45678 с использованием каждой из запрограммированных хеш-функций получить хеш-адрес и вывести в соответствующие поля
формы. Хеш-адрес должен быть в диапазоне от 0 до 999.
ВНИМАНИЕ! В программируемых хеш-функциях при вычислении хеш-
адресов запрещено использовать преобразование исходных числовых ключей
в строку и работать с ней строковыми функциями. Для всех вычислений необходимо использовать только операции и функции работы с числовыми данными.
Контрольные вопросы:
1. Когда возникает коллизия при хешировании?
2. Какие хеш-функции используются для формирования хеш-адресов?
3. Каким критериям должен удовлетворять делитель m в методе деления?
2.4.2. Минимализация количества коллизий
Выполнить анализ разработанных хеш-функций (2.4.1) по критерию минимизации количества коллизий (рис. 2.8).
Рис. 2.8. Анализ функций хеширования

52
Для этого необходимо:
1) удалить (или закомментировать) тестовую часть из задания 2.4.1;
2) сгенерировать массив М из 1 000 случайных чисел, значения которых
находятся в диапазоне от 0 до 100 000;
3) используя метод цепочек, определить наиболее эффективную функцию
хеширования следующим способом: последовательно применяя каждую из разработанных хеш-функций (2.4.1), заполнять массив цепочек (массив Mas) ключами из массива М, подсчитывая количество коллизий (k1, k2, k3, k4);
4) увеличить счетчик лучшей функции (t1, t2, t3 или t4) на 1;
5) выполнить шаги 3, 4 и 5 n раз (n ≥ 100) (количество итераций задается
на форме);
6) вывести счетчики t1, t2, t3, t4 для каждой функции хеширования.
Примечания:
1. В C# цепочки могут быть реализованы с помощью массива коллекций
List. В других языках программирования с этой же целью может использовать-
ся контейнерный класс List.
2. Массив М содержит значения в интервале от 0 до 100 000. Ввиду этого
в методе середины квадрата после возведения ключа в квадрат значение может
выйти за диапазон целых значений. Следовательно, нужно использовать тип
данных «Длинное целое».
3. В каждой итерации может победить не одна, а сразу несколько функ-
ций хеширования, если у них количество коллизий ki одновременно равно минимальному количеству.
Контрольные вопросы:
1. По какому критерию будут оцениваться рассматриваемые хеш-функции?
2. В чем заключается метод середины квадрата?
3. В чем заключается метод свертывания?
2.4.3. Метод открытой адресации
Используя разработанную программу (2.4.1–2.4.2), написать программу
оценки временных характеристик поиска ключей для метода открытой адресации (рис. 2.9). Для этого необходимо:
1) используя наилучшую по эффективности функцию хеширования, из
массива М1 заполнить 10 000 случайных ключей соответствующую структуру
хранения согласно методу открытой адресации (массив МОА), причем значения
ключей должны находиться в интервале от 0 до 10 000;

53
2) для 10 000 случайных ключей (массив М2) определить время их поиска
методом открытой адресации, причем значения ключей должны находиться
в интервале от 0 до 20 000;
3) для метода открытой адресации вывести время поиска (t), среднее чис-
ло сравнений (Sср) и количество найденных ключей (K).
Рис. 2.9. Метод открытой адресации
Контрольные вопросы:
1. В чем заключается метод открытой адресации?
2. Раскройте основные недостатки разрешения коллизий методом откры-
той адресации.
2.4.4. Метод цепочек
Продолжаем исследовать методы разрешения коллизий (рис. 2.10). Задача — сравнение реализованного в практическом задании 2.4.3 метода открытой
адресации с методом цепочек. Поэтому все входные массивы (М1 и М2) должны
быть одни и те же и содержать одинаковые данные. Для этого необходимо:

54
1) используя функцию хеширования из массива М1 заполнить 10 000 слу-
чайных ключей соответствующую структуру хранения согласно методу цепочек (массив МС), причем значения ключей должны находиться в интервале от 0
до 10 000;
2) для 10 000 случайных ключей (массив М2) определить время их поиска
методом открытой адресации, причем значения ключей должны находиться
в интервале от 0 до 20 000;
3) для метода цепочек вывести время поиска (t), среднее число сравнений
(Sср) и количество найденных ключей (K).
Рис. 2.10. Метод цепочек
ВНИМАНИЕ! В окончательном варианте программы вы должны запол-
нить массив М1 случайными значениями в интервале от 1 до 10 000. Затем, используя одну и ту же функцию хеширования, из массива М1 перенести данные
в массивы МОА и МС. После этого вы заполняете массив М2 случайными значениями в интервале от 1 до 20 000. Используя ту же функцию хеширования,
осуществляете поиск ключей из массива М2 сначала в МОА, затем в МС, снимая
показатели t, Sср и K.
Окончательный вариант возможных результатов работы программы при-
веден на рис. 2.11.

55
Рис. 2.11
Контрольные вопросы:
1. В чем заключается метод цепочек?
2. Раскройте основные достоинства разрешения коллизий методом цепочек.
2.5. ЗАДАНИЯ ПО ТЕМЕ «КЛАССИЧЕСКИЕ АЛГОРИТМЫ
ВНУТРЕННЕЙ СОРТИРОВКИ»
2.5.1. Функционал программы
1. Разработать интерфейс программного комплекса практических заданий
№ 2.5.1–2.5.6. Пример формы приведен на рис. 2.12. Рисунок демонстрирует
только функционал разрабатываемой программы. Ваш вариант должен предоставлять неменьшие возможности. Расположение компонент, состав компонент,
оформление частей формы в вашем варианте могут быть другими.

56
Рис. 2.12. Форма «Алгоритмы внутренней сортировки»
Для отображения табличных данных в C# используется компонент
DataGridView.
После размещения на форме система создает переменную с именем
dataGridView1. С помощью этого имени можно программно оперировать мето-
дами и свойствами этого элемента управления. Например, для задания числа
строк и столбцов в методе активации формы можно использовать следующий код:
dataGridView1.RowCount = 7; // число строк;
dataGridView1.ColumnCount = 6; // число столбцов.
Вставка значения в первый столбец нулевой строки осуществляется командой:
dataGridView1.Rows[0].Cells[1].Value = «Обмен».
Управление столбцами данного компонента осуществляется с помощью
диалогового окна Edit Columns (рис. 2.13), которое можно открыть с помощью
контекстного меню или свойства Columns.
Рис. 2.13. Окно Edit Columns

57
Большинство свойств этого окна интуитивно понятны. Например, свойство ColumnType позволяет задать тип столбца, а свойство DataGridView-
CheckBoxColumn — столбец типа CheckBox, т. е. флаговую кнопку, с помо-
щью которой на форме можно будет включить или отключить сортировку того
или иного метода. Установить флажок для одного из полей этого столбца можно с помощью кода:
dataGridView1.Rows[0].Cells[0].Value = true.
Еще одно новшество на рис. 2.12 — кнопка с рисунком. На самом деле
используется уже известный нам компонент Button, для которого установлено
свойство Image.
Контрольные вопросы:
1. Какой компонент используется в С# для отображения табличных
данных?
2. Каким образом можно добавить на кнопку рисунок?
3. Как обратиться к отдельной ячейке dataGridView?
2.5.2. Метод прямого обмена
1. Используя разработанную программу (2.5.1), запрограммировать алгоритм внутренней сортировки методом прямого обмена. В таблицу на форме вывести количество сравнений, количество перестановок и время сортировки, а
также результат проверки того, стал ли массив после выполнения алгоритма отсортированным. Подобрать размер сортируемого массива таким образом, чтобы
время сортировки было не менее ста единиц. К сравнениям должны относиться
только сравнения элементов массива между собой. Одна перестановка — это
перестановка двух элементов массива.
2. Запрограммировать алгоритм внутренней сортировки методом прямого
выбора.
3. Выполнить сравнение времени сортировки методом прямого обмена
и методом прямого выбора.
Контрольные вопросы:
1. Какова сложность алгоритма сортировки прямым обменом?
2. Каково среднее, минимальное и максимальное число сравнений для ал-
горитма сортировки прямым обменом?
3. Каково среднее, минимальное и максимальное число перестановок для
алгоритма сортировки прямым обменом?
4. Какова сложность алгоритма сортировки прямым выбором?

58
5. Каково среднее, минимальное и максимальное число сравнений для ал-
горитма сортировки прямым выбором?
6. Каково среднее, минимальное и максимальное число перестановок для
алгоритма сортировки прямым выбором?
7. За счет чего алгоритм сортировки прямым выбором выполняет сорти-
ровку в среднем быстрее, чем алгоритм сортировки прямым обменом?
2.5.3. Метод прямого включения
1. Используя разработанную программу (2.5.1; 2.5.2), запрограммировать
алгоритм сортировки методом прямого включения.
2. Выполнить сравнение времени сортировки методом прямого обмена,
методом прямого выбора и методом прямого включения.
Примерный результат работы программы приведен на рис. 2.14.
Рис. 2.14. Результат сравнения классических алгоритмов сортировки
Контрольные вопросы:
1. Какова сложность алгоритма сортировки прямого включения?
2. Каково среднее, минимальное и максимальное число сравнений для ал-
горитма сортировки прямым включением?
3. Каково среднее, минимальное и максимальное число перестановок для
алгоритма сортировки прямым включением?
4. За счет чего алгоритм сортировки прямым включением выполняет сор-
тировку в среднем быстрее, чем алгоритм сортировки прямым обменом и сортировки прямым выбором?

59
2.6. ЗАДАНИЯ ПО ТЕМЕ «ЭФФЕКТИВНЫЕ АЛГОРИТМЫ
ВНУТРЕННЕЙ СОРТИРОВКИ»
2.6.1. Алгоритм быстрой сортировки
1. Используя разработанную программу (2.5.1–2.5.3), запрограммировать
алгоритм быстрой сортировки. В таблицу на форме вывести количество сравнений, количество перестановок и время сортировки. Подобрать размер сортируемого массива таким образом, чтобы время сортировки было не менее ста
единиц. К сравнениям должны относиться только сравнения элементов массива
между собой. Одна перестановка — это перестановка двух элементов массива.
2. Выполнить сравнение времени сортировки методами прямого включения и быстрой сортировки.
Контрольные вопросы:
1. Какова сложность алгоритма быстрой сортировки?
2. Что такое центральный элемент массива?
3. Перечислите недостатки быстрой сортировки.
2.6.2. Алгоритм сортировки Шелла
Используя разработанную программу (2.5.1–2.6.1), запрограммировать алгоритм сортировки Шелла. В таблицу на форме вывести количество сравнений,
количество перестановок и время сортировки. Подобрать размер сортируемого
массива таким образом, чтобы время сортировки было не менее ста единиц.
2. Выполнить сравнение времени быстрой сортировки и сортировки
Шелла.
Контрольные вопросы:
1. Какая сортировка лежит в основе сортировки Шелла?
2. Каков алгоритм вычисления шага по Вирту?
3. Чему равен первый шаг сравнения при n = 25?
2.6.3. Алгоритм линейной сортировки
1. Используя разработанную программу (2.5.1–2.6.2), запрограммировать
алгоритм внутренней сортировки подсчетом (линейная сортировка). В таблицу
на форме вывести количество сравнений, количество присвоений и время сортировки. Подобрать размер сортируемого массива таким образом, чтобы время
сортировки было не менее ста единиц. К сравнениям должны относиться только сравнения элементов массива между собой. Присвоение — это занесение
значения либо в массив B, либо в массив А.

60
2. Вычислить время выполнения сортировки массива с помощью встро-
енной функции сортировки. На форму вывести время сортировки. Подобрать
размер сортируемого массива таким образом, чтобы время сортировки было не
менее ста единиц.
3. Выполнить сравнение времени линейной сортировки, быстрой сорти-
ровки, сортировки Шелла и встроенной сортировки.
Примерный результат работы программы приведен на рис. 2.15.
Рис. 2.15. Результат сравнения эффективных алгоритмов сортировки
Контрольные вопросы:
1. Какова сложность алгоритма линейной сортировки?
2. Какова сложность третьего шага алгоритма линейной сортировки?
3. Какое ограничение накладывается на использование алгоритма линей-
ной сортировки?
2.7. ЗАДАНИЯ ПО ТЕМЕ «ОЧЕРЕДИ С ПРИОРИТЕТАМИ»
2.7.1. Основные операции
1. Разработать интерфейс программного комплекса практических заданий
2.7.1–2.7.3. Пример формы приведен на рис. 2.16. Рисунок демонстрирует толь-
ко функционал разрабатываемой программы. Ваш вариант должен предоставлять неменьшие возможности. Расположение компонент, состав компонент,
оформление частей формы в вашем варианте могут быть другими.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
