Uploaded by tkachenko_ad

Структуры и алгоритмы обработки данных на ЭВМ. Методические указания к лабораторным работам.

advertisement
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
Кубанский государственный технологический университет
(КубГТУ)
Армавирский механико-технологический институт
Кафедра внутризаводского электрооборудования и автоматики
СТРУКТУРЫ И АЛГОРИТМЫ
ОБРАБОТКИ ДАННЫХ НА ЭВМ
Методические указания к лабораторным работам
для студентов всех форм обучения специальности
230105 - Программное обеспечение вычислительной техники
и автоматизированных систем
Армавир
2005
Составитель канд. техн. наук, доцент А. Д. Ткаченко
УДК 631. 371.621.00
Структуры и алгоритмы обработки данных на ЭВМ. Методические указания к лабораторным работам для студентов специальности
230105 - «Программное обеспечение вычислительной техники и автоматизированных систем». /Сост.: А.Д. Ткаченко; ГОУ ВПО Кубан. гос. технол.
ун-т. Армавирский механико-технологический институт. Каф. внутризаводского электрооборудования и автоматики. - Армавир: Изд. АМТИ,
2005, - 62 с.
Составлены в соответствии с рабочей программой курса «Структуры
и алгоритмы обработки данных на ЭВМ» для студентов специальности
230105. Методические указания содержат задания к лабораторным работам
№ 1-11, краткий справочный материал по алгоритмам, примеры программ,
образец оформления лабораторной работы.
Табл. 5 Библиогр.: назв. 6
Печатается по решению Методической комиссии Армавирского механико-технологического института (филиала) ГОУ ВПО «Кубанский государственный технологический университет»
Рецензенты: главный инженер АЭМЗ С.Г. Ерошенко,
канд. техн. наук, доц. А.И. Шарнов
2
Содержание
Введение
3
1 Лабораторная работа. Системы кодирования и способы представления в памяти ЭВМ простейших структур данных
5
2 Лабораторная работа. Рекурсивные алгоритмы
9
3 Лабораторная работа. Алгоритмы операций со списками
13
4 Лабораторная работа. Исследование алгоритмов поиска
17
5 Лабораторная работа. Алгоритм поиска в строке Рабина-Карпа
23
6 Лабораторная работа. Алгоритм поиска в строке на конечных автоматах
27
7 Лабораторная работа. Операции с бинарными деревьями
30
8 Лабораторная работа. Анализ алгоритмов сортировки массивов
35
9 Лабораторная работа. Улучшенные алгоритмы сортировки
38
10 Лабораторная работа. Алгоритмы поиска на графах
46
11 Лабораторная работа. Алгоритмы оптимального выбора на графе. 50
Список литературы
53
Приложение А. Образец оформления отчета
54
Приложение Б. Программа демонстрации представления графа в
памяти компьютера и поиска на графе
3
55
Введение
Цель лабораторных работ - закрепление теоретического материала
по структурам данных и алгоритмам их обработки, приобретение практических навыков разработки эффективных алгоритмов и структур данных,
их исследование.
При подготовке к лабораторной работе студент обязан изучить соответствующий данной работе лекционный материал, разобрать примеры
программ в разделе «Краткий справочный материал», ознакомиться с содержанием работы, разработать схему алгоритма для данного задания и
подготовить ответы на вопросы к защите.
В начале лабораторного занятия проводится собеседование, по результатам которого преподаватель оценивает готовность студента выполнять лабораторную работу. В течение занятия после завершения своего задания студент показывает преподавателю результаты работы на персональном компьютере. О выполненной лабораторной работе составляется
отчет каждым студентом индивидуально. Отчет должен содержать задание, цель работы, математическую постановку задания с кратким описанием применяемых алгоритмов обработки и структур данных, листинг программы, результаты моделирования и выводы. Образец оформления отчета приведен в приложении А. Оформленный отчет студент обязан защитить не позднее следующей лабораторной работы.
4
1 Лабораторная работа. Системы кодирования и способы
представления в памяти ЭВМ простейших структур данных
Цель работы: Изучение систем кодирования и простейших структур
данных. Исследование способов представления в памяти ЭВМ простейших структур данных.
Задание:
1. Исследовать способы представления в памяти ЭВМ
простейших
структур данных: символьные, строковые, вещественные, целые типы данных. Данные разместить в оперативной памяти в заданном порядке преподавателем. Для вывода дампа памяти использовать программу Lr_01_d1 и
модуль Timer. Дамп памяти и назначение байтов представить в таблице
1.1. Варианты задания приведены в таблице 1.3.
2. Исследовать зависимость времени вычисления выражения (фрагмента
программы) от типа данных (целые, вещественные) и сопроцессора. Для
измерения времени вычисления выражения использовать программу
Lr_01_t1 и модуль Timer. Результаты измерения представить в таблице 1.2.
Варианты задания приведены в таблице 1.4.
Подготовка к работе
Изучить соответствующий данной лабораторной работе лекционный
материал. Разобрать программу Lr_01_d1 для вывода и анализа дампа памяти, программу Lr_01_t1 и модуль Time для измерения времени выполнения заданного алгоритма. Подготовить ответы на вопросы к защите. Литература: [1].
5
Содержание отчета
Задание 1:
- постановка задачи;
- краткое описание метода исследования;
- главный модуль программы с комментариями;
- дамп памяти (Таблица 1.1);
- назначение байтов дампа памяти (Таблица 1.1);
- выводы.
Таблица 1.1-Дамп памяти
№
пп
Содержимое байта в 10-ой, 2-ой,
16-ой системах счисления и коде
ASCII
Адрес байта
Сегмент
Смещение
10-я
2-я
16-я
Назначение
байта
Символ
1.
…
Задание 2:
- постановка задачи;
- краткое описание метода исследования;
- главный модуль программы с комментариями,
- результаты моделирования в таблице 1.2,
- анализ результатов, выводы.
Таблица 1.2-Время вычисления выражения
Вычисляемое
выражение
Время вычисления выражения, сек.
Сопроцессор
Сопроцессор не
используется
используется
Тип данных
6
Программное обеспечение
1. Среда программирования Паскаль.
2. Программа Lr_01_d1 для вывода дампа памяти.
3. Программа Lr_01_t1 для измерения времени выполнения фрагмента
программы.
4. Модуль Timer содержит подпрограммы: Start - запоминает значение
таймера перед выполнением фрагмента, значение берет в момент обновленья системного счетчика; Finish - вычисляет разницу между показаниями
таймера перед и после выполнением фрагмента программы; Report - выводит на печать измеренный интервал в секундах и сообщения через переменную Msg; Bit - выводит значения переменной в десятичной, двоичной и
шестнадцатеричной системах счисления; ProgS - выводит структуру памяти программы.
Вопросы к защите
1. Понятие типа данных и абстракции данных.
2. Базовые типы данных, их представление в памяти.
3. Представление вещественных данных в памяти машины.
4. Представление записи, массива и строки в памяти машины.
5. Статические типы данных.
6. Опишите трехуровневую структуру данных типа запись на языке высокого уровня.
7. Как влияет тип данных на время выполнения арифметических операций?
8. В каких случаях применение сопроцессора эффективно?
7
Таблица 1.3-Варианты задания 1
Вариант
Строка
Символ
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
МИР!
МИР
ФАЙ!
ФАЙ
БИТ!
БИТ
ГАЙ!
ГАЙ
ГТУ!
ГТУ
МТИ!
МТИ
КУШ!
А
Б
В
Г
Д
Е
Ж
З
И
К
Л
М
Н
Вещественные числа Целые числа
+0.40625
-0.40625
+2.21875
-2.21875
-0.53125
+0.53125
-4.28125
+4.28125
-0.87500
+0.87500
-6.75000
+6.75000
-0.25000
1.75000
1.75000
0.62500
0.62500
3.56250
3.56250
0.53125
0.53125
5.37500
5.37500
0.31250
0.31250
7.03125
+34
-43
-66
+11
+10
-40
+4
-28
-20
+5
-72
+27
-12
Таблица 1.4-Варианты задания 2
Вариант
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Выражение 1
Выражение 2
Выражения 3
x*x
x/x
x*x
x/x
x*x
x/x
x*x
x/x
x*x
x/x
x*x
x/x
x*x
x+x
x-x
x+x
x-x
x+x
x-x
x+x
x-x
x+x
x-x
x+x
x-x
x+x
x-cos(x)
x-exp(x)
x-tan(x)
x-sin(x)
x*cos(x)
x *exp(x)
X*tan(x)
X*sin(x)
x/cos(x)
x/exp(x)
x/tan(x)
x/sin(x)
x+cos(x)
8
2 Лабораторная работа. Рекурсивные алгоритмы
Цель работы: приобретение навыка разработки программ реализующих рекурсивные алгоритмы.
Задание: написать программу, которая реализует рекурсивный алгоритм решения поставленной задачи (варианты заданий приведены ниже).
Подготовка к работе
Изучить соответствующий данной лабораторной работе лекционный
материал и краткий теоретический материал методических указаний. Разобрать работу рекурсивного алгоритма на примере программы fib.pas,
formula.pas, revers.pas. Подготовить ответы на вопросы к защите. Литература: [2, 3].
Краткий теоретический материал
Рекурсия – это, когда какое либо понятие определяют с использованием этого же понятия. Многие алгоритмы по своей природе рекурсивны:
решая некоторую задачу, они вызывают самих себя для решения ее подзадач. С начало задача разбивается на подзадачи меньшего размера. Затем
эти подзадачи решаются с помощью рекурсивного вызова - или непосредственно, если размер подзадачи достаточно мал. После непосредственного
решения подзадачи прекращается рекурсивный вызов. Решение подзадач
комбинируются, и получается решение исходной задачи.
Процедуры и функции, которые могут обращаться к самой себе, называют рекурсивными. При рекурсивном обращении параметры и локальные
переменные сохраняются в стеке памяти.
Пример рекурсии: перевертывание строки "тут огород". При перевертывании, т.е. выводе в обратном порядке получим "дорого тут". Описание
рекурсивного алгоритма перевертывания строки.
9
Пусть S - строка,
RS = Revers(S) - перевернутая строка,
если S - одиночный символ, то Revers(S) = S,
если S - состоит из символа C и следующей за ней группы символов GK,
то RS есть объединение (конкатенация):
Revers(S) = Revers(GK) + C = Revers(K) + G + C = K+G+C
Содержание отчета
1. Задание.
2. Математическая постановка задачи:
- входные и выходные данные, их тип, структура;
- математические и логические зависимости.
3. Краткое описание алгоритма решения задачи.
5. Листинг программы с комментариями.
6. Результаты тестирования программы.
Программное обеспечение
1. Среда программирования Паскаль.
2. Программы, демонстрирующие работу рекурсивных алгоритмов:
Hilbert.pas
- изображение кривых Гильберта,
Serpinsk.pas - изображение кривых Серпинского,
fib.pas
- вычисление чисел Фибоначчи,
formula.pas
- вычисление формулы,
revers.pas
- печать последовательности целых положительных чисел
в обратном прядке.
Варианты заданий:
1. Написать рекурсивную функцию вывода не пустой строки в обратном
порядке, которая заканчивается точкой.
10
2. Написать рекурсивную функцию вывода не пустой строки в обратном
порядке, которая заканчивается символом "*".
3. Написать рекурсивную процедуру вывода не пустой строки в обратном
порядке, которая заканчивается символом ";".
4. Написать рекурсивную процедуру вывода не пустой строки в обратном
порядке, которая заканчивается символом "/".
5. Написать рекурсивную логическую функцию simm(s,i,j), проверяющую,
является ли симметричной часть символьного массива s, начинающаяся
i-ым и кончающаяся j-ым ее элементами.
6. Написать рекурсивную логическую функцию simm(s,i,j), проверяющую,
является ли симметричной часть символьного массива s, начинающаяся
i-ым и кончающаяся j-ым ее элементами.
7. Написать рекурсивную процедуру simm(s,i,j), проверяющую, является
ли симметричной часть символьного массива s, начинающаяся i-ым и кончающаяся j-ым ее элементами.
8. Написать рекурсивную процедуру simm(s,i,j), проверяющую, является
ли симметричной часть символьного массива s, начинающаяся i-ым и кончающаяся j-ым ее элементами.
9. Написать рекурсивную функцию digits без параметров, которая подсчитывает количество цифр в тексте, заданном во входной стороке (за текстом
следует точка.
10.Написать рекурсивную функцию digits без параметров, которая подсчитывает количество цифр в тексте, заданном во входной сороке (за текстом
следует точка).
11.Написать рекурсивную процедуру digits, которая подсчитывает количество цифр в тексте, заданном во входной строке (за текстом следует символ "*").
11
12.Написать рекурсивную процедуру digits, которая подсчитывает количество цифр в тексте, заданном во входной строке (за текстом следует символ "*").
13.Написать рекурсивную функцию без параметров, которая подсчитывает
количество слов в предложении, заданном во входном файле (текст предложения заканчивается точкой, слова разделены одним пробелом).
14.Написать рекурсивную функцию без параметров, которая подсчитывает
количество слов в предложении, заданном во входном файле (текст предложения заканчивается точкой, слова разделены одним пробелом).
15.Написать рекурсивную процедуру, которая подсчитывает количество
слов в предложении, заданном во входном файле (текст предложения заканчивается точкой, слова разделены одним пробелом).
Вопросы для защиты
1.
Что называют итерацией?
2.
Что называют рекурсией?
3.
Для чего используется стек при обращении функции самой к себе?
4.
Дайте рекурсивное определение операции сложения как процесса, со-
стоящего в последовательном добавлении единицы.
5.
Дайте рекурсивное определение операции умножения, выраженной
через сложение.
6.
Дайте рекурсивное определение операции возведения в степень, выра-
зив ее в терминах операции умножения.
7.
Дайте рекурсивное определение строки.
8.
Дайте рекурсивное определение булевского выражения.
12
3 Лабораторная работа. Алгоритмы операций со списками
Цель работы: закрепление знаний алгоритмов, создающих списки и
выполняющие операции над списками; приобретение навыка разработки
программ, имеющих структуры данных в виде списков.
Задание: написать процедуры, выполняющие операции над списком,
варианты операций заданы ниже. Структура данных, процедуры создания
и вывода списка определены программой lr_02_La.
Подготовка к работе
Изучить алгоритмы создания одно- и двунаправленных, линейных и
кольцевых списков, поиска, замены, вставки и удаления элементов в списках. Подготовить ответы на вопросы к защите. Литература: [2, 3].
Содержание отчета
1.
Задание.
2.
Математическая постановка задачи: входные и выходные данные,
описание структуры данных (название структуры, структура элемента, типы данных), спецификация.
3.
Краткое описание алгоритмов используемых операций над элемента-
ми списка.
4.
Листинг фрагментов программы: блоки описания типа переменных,
констант, переменных; разработанные процедуры, выполняющие операции
над списком с комментариями.
5.
Результаты тестирования, выводы.
13
Программное обеспечение
1 Среда программирования Паскаль.
2 Программы:
Lr_02_La - операции с линейным однонаправленным списком;
Lr_02_Lb - операции с линейным двунаправленным списком;
Lr_02_Ra - операции с кольцевым однонаправленным списком;
Lr_02_Rb - операции с кольцевым двунаправленным списком.
Варианты заданий
1. Определение среднее арифметическое элементов не пустого списка L.
2. Замена в списке L всех вхождений Е1 на Е2.
3. Определение максимального элемента непустого списка L.
4. Проверка упорядоченности списка L по возрастанию.
5. Нахождение суммы последнего и предпоследнего элементов списка L.
6. Построение по списку L двух новых: списка L1 - из положительных
элементов, списка L2 - из остальных элементов списка L.
7. Вставка перед последним элементом списка L двух новых элементов
Е1, Е2.
8. Вставка новых элементов Е1, Е2 после первого элемента непустого
списка L.
9. Вставка в список L нового элемента Е1 за каждым вхождением элемента Е.
10.Вставка в список L нового элемента Е1 перед первым вхождением элемента Е.
11.Вставка в непустой список L пару новых элементов Е1 и Е2 перед его
последним элементом.
12.Вставка в непустой, упорядоченный по не убыванию список L, новый
элемент Е так, чтобы сохранилась упорядоченность.
14
13.Удаление из непустого списка L второго и третьего элементов,
если
такие есть.
14.Удаление из списка L за каждым вхождением элемента Е одного элемента, если такой есть и он отличен от Е.
15.Удаление из списка L первого отрицательного элемента, если такой
есть, и одного следующего за ним.
Вопросы для защиты
1. Что называют списком, стеком, очередью, деком, особенности их
структур?
2. Какие виды списков существуют?
3. Основные операции над списком, стеком, очередью, деком. Программная реализация операций.
4. Что такое указатель?
5. Какие динамические структуры вы знаете, их особенность?
6. Какой тип данных необходим для организации динамических объектов?
7. Как связаны элементы в динамической структуре?
8. Для чего введены двусвязанные списки?
9. В чем разница в операциях, производимых над одно- и двусвязанными
списками?
10.Поясните алгоритм создания динамических структур данных: односвязанный список, двусвязанный список, линейный и кольцевой списки.
11.Поясните алгоритм проверки на пустоту динамических структур данных: список, стек, очередь, дек.
12.Поясните алгоритм удаления из динамического списка первого, последнего и произвольного элемента.
13.Поясните алгоритм вставки нового элемента в начало, конец и в произвольное место динамического списка.
15
14. Напишите алгоритм вывода данных динамического линейного однона-
правленного списка.
15.Напишите алгоритм преобразования линейного списка в кольцевой
список.
16
4 Лабораторная работа. Исследование алгоритмов поиска
Цель работы: закрепление знаний алгоритмов поиска; приобретение
навыка разработки программ, реализующих алгоритмы поиска, и исследования сложности алгоритмов.
Задание: исследовать временную сложность заданного алгоритма
поиска. Временную сложность исследуемого алгоритма измерить для трех
значений изменяемого параметра. Сравнить по экспериментальным данным эффективность заданного алгоритма поиска с эффективностью алгоритма последовательного поиска в списке.
Варианты исследуемых алгоритмов, структур данных, изменяемых
параметров заданы ниже. Значение параметров, которые неопределенны,
выбрать самостоятельно. Для измерения временной сложности алгоритмов
(среднее время поиска, среднее количество сравнений при поиске) использовать процедуры модуля Timer.
Подготовка к работе
Изучить структуры хеш-таблиц и динамических списков, хешфункции и алгоритмы поиска. Повторить способы и параметры оценки
эффективности алгоритмов. Подготовить ответы на вопросы к защите. Литература: [2, 3].
Содержание отчета
1. Задание.
2. Математическая постановка задачи:
- входные и выходные данные, их тип, структура;
- условие поиска;
- используемые процедуры и функции, их входные и выходные данные,
- метод исследования.
17
- краткое описание исследуемого алгоритма поиска.
4. Листинг программы.
5. Результаты измерения временной сложности алгоритмов.
6. Выводы. На основании полученных результатов ответить на вопросы:
6.1 Как влияет на эффективность исследуемого алгоритма поиска изменяемый параметр?
6.2 Какой алгоритм эффективнее: исследуемый или алгоритма последовательного поиска и почему?
Программное обеспечение
1. Среда программирования Паскаль.
2. Программы Lr_04_LH, Lr_04_LA.
3. Мо дуль Timer, включающий подпрограммы для снятия временных характеристик алгоритмов:
Варианты заданий
1.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из двух прописных символов букв английского алфавита. Изменяемый параметр - а.
2.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из трех прописных символов букв английского алфавита. Изменяемый параметр - n - количество элементов в таблице.
3.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки прописных символов букв английского алфавита. Изменяемый
параметр - количество символов в строке.
18
4.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из двух прописных символов букв алфавита. Изменяемый параметр - P -основание для определения ключа.
5.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из трех прописных символов букв английского алфавита. Изменяемый параметр - закон распределения ключей поиска.
6.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из двух прописных символов букв русского алфавита. Изменяемый параметр - а.
7.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из трех прописных символов букв русского алфавита. Изменяемый параметр - n - количество элементов в таблице.
8.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки прописных символов букв русского алфавита. Изменяемый параметр - количество символов в строке.
9.
Структура данных - хеш-таблица с открытым хешированием. Хеш-
функция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из двух прописных символов букв русского алфавита. Изменяемый параметр - P -основание для определения ключа.
10. Структура данных - хеш-таблица с открытым хешированием. Хешфункция h(k,а)=k mod а, где k-ключ, а - простое число. Элементы таблицы
- строки из двух прописных символов букв русского алфавита. Изменяемый параметр - закон распределения ключей поиска.
19
11. Структура данных - хеш-таблица с открытым хешированием. Хешфункция h(m,k,A)=int(m(k*A mod 1)), где m-количество хеш-значений, kключ, число A=(sqrt(5)-1)/2, int(x) - целая часть х. Элементы таблицы строки из двух прописных символов букв английского алфавита. Изменяемый параметр - m.
12. Структура данных - хеш-таблица с открытым хешированием. Хешфункция h(m,k,A)=int(m(k*A mod 1)), где m-количество хеш-значений, kключ, число A=(sqrt(5)-1)/2, int(x) - целая часть х. Элементы таблицы строки из трех прописных символов букв английского алфавита. Изменяемый параметр - n - количество элементов в таблице.
13. Структура данных - хеш-таблица с открытым хешированием. Хешфункция h(m,k,A)=int(m(k*A mod 1)), где m-количество хеш-значений, kключ, число A=(sqrt(5)-1)/2, int(x) - целая часть х. Элементы таблицы строки прописных символов букв английского алфавита. Изменяемый параметр - m - количество символов в строке.
14. Структура данных - хеш-таблица с открытым хешированием. Хешфункция h(m,k,A)=int(m(k*A mod 1)), где m-количество хеш-значений, kключ, число A=(sqrt(5)-1)/2, int(x) - целая часть х. Элементы таблицы строки из двух прописных символов букв английского алфавита. Изменяемый параметр - P -основание для определения ключа.
15. Структура данных - хеш-таблица с открытым хешированием. Хешфункция h(m,k,A)=int(m(k*A mod 1)), где m-количество хеш-значений, kключ, A - число, int(x) - целая часть х. Элементы таблицы – строки из двух
прописных символов букв английского алфавита. Изменяемый параметр A: A1=(sqrt(5)-1)/2, A2=Pi, A3=Pi^2
Вопросы для защиты
1.
В чем состоит назначение поиска?
2.
Что такое уникальный ключ?
20
3.
В
чем
разница
между
последовательным
и
индексно-
последовательным поиском?
4.
Какой метод, последовательный или индексно-последовательный бо-
лее эффективный и почему?
5.
Основные отличия метода перестановки в начало от метода транспо-
зиции.
6.
Где будут работать быстрее метод перестановки и метод транспози-
ции, в массиве или списке? Почему?
7.
Требуется ли для методов перестановки и транспозиции, упорядочен-
ные массивы и списки?
8.
В чем суть прямой адресации?
9.
Что может храниться в таблице прямой адресации?
10. В каком случае прямая адресация может быть эффективной?
11. Реализация операций поиска, вставки и удаления в таблице прямой
адресации.
12. В чем отличие хеш-таблицы с закрытым хешированием от таблицы
прямой адресации?
13. Для чего нужна хеш-функция?
14. Какой должна быть хеш-функция?
15. Методы построения хеш-функций: метод деления с остатком, метод
умножения.
16. Что такое коллизия? Поясните способ "разрешения" коллизий с помощью цепочек.
17. Поясните различие открытого и закрытого хеширования.
18. Алгоритмы поиска, вставки и удаления в хеш-таблице с открытым
хешированием.
19. Алгоритмы поиска, вставки и удаления в хеш-таблице с закрытым хешированием.
20. Для чего применяется двойное хеширование?
21
21. Предложите алгоритм определения уникального числового ключа для
строк из n символов. Алфавит включает m символов.
22
5 Лабораторная
работа. Алгоритм поиска в строке Рабина-
Карпа
Цель работы: закрепление знаний алгоритмов поиска подстроки в
строке; приобретение навыка разработки процедур реализующих алгоритмы поиска подстроки.
Задание: Написать процедуры поиска подстроки в строке методом
Рабина - Карпа и выполнения заданной операции. Экспериментально
определить наилучшие значения простого числа и основания для вычисления числового представления подстроки в алгоритме. Измерить количество сравнений при поиске подстроки простейшим алгоритмом и алгоритмом Рабина - Карпа. Сравнить полученные результаты, сделать выводы. Варианты операций и подстрок определены ниже.
Подготовка к работе
Изучить соответствующий данной лабораторной работе лекционный
материал. Разобрать работу алгоритма Рабина-Карпа в программе Lr_05_s.
Повторить способы и параметры оценки эффективности алгоритмов. Подготовить ответы на вопросы к защите. Литература: [5].
Содержание отчета
1. Задание.
2. Математическая постановка задачи:
- входные и выходные данные, их тип, структура;
- условие поиска;
- используемые процедуры и функции, их входные и выходные данные.
3. Краткое описание алгоритма Рабина - Карпа.
4. Листинг программы.
23
5. Экспериментально найденное наилучшее значения простого числа и основания.
6. Результаты измерения количества сравнений при поиске подстроки.
7. Выводы.
Программное обеспечение
1. Среда программирования Паскаль.
2. Программа Lr_05_S.
Варианты заданий
1. Длина строки 25 символов. Подстрока из двух символов. Определить
все вхождения подстроки. Каждое вхождение заменить подстрокой WW.
2. Длина строки 25 символов. Подстрока из трех символов.
Определить
все вхождения подстроки. Первое вхождение из трех символов заполнить
пробелами.
3. Длина строки 25 символов. Подстрока из четырех символов. Определить все вхождения подстроки. Каждое вхождение заменить пробелом.
4. Длина строки 30 символов. Подстрока из двух символов. Определить
все вхождения подстроки. Поменять местами первое вхождение с последними символами строки.
5. Длина строки 30 символов. Подстрока из трех символов. Определить
все вхождения подстроки. Последнее вхождение заменить следующими
символами строки.
6. Длина строки 30 символов. Подстрока из четырех символов. Определить все вхождения подстроки. Все четные вхождения заменить подстрокой UUUU.
7. Длина строки 35 символов. Подстрока из двух символов. Определить
все вхождения подстроки. Последнее вхождение заполнить пробелами.
24
8. Длина строки 35 символов. Подстрока из трех символов. Определить
все вхождения подстроки. Перед каждым вхождением заменить символ на
!.
9. Длина строки 35 символов. Подстрока из четырех символов. Определить все вхождения подстроки. Поменять местами последнее вхождение с
первыми символами строки.
10.Длина строки 40 символов. Подстрока из двух символов. Определить
все вхождения подстроки. Первое вхождение заменить предыдущими символами строки.
11.Длина строки 40 символов. Подстрока из трех символов. Определить
все вхождения подстроки. Все нечетные вхождения заменить на "+++".
12.Длина строки 40 символов. Подстрока из четырех символов. Определить все вхождения подстроки. Все вхождения подстроки заменить подстрокой "____".
13.Длина строки 25 символов. Подстрока из двух символов. Определить
все вхождения подстроки. Второе вхождение заполнить символами "_".
14.Длина строки 25 символов. Подстрока из трех символов.
Определить
все вхождения подстроки. После каждого вхождения заменить два первых
символа подстроки пробелами.
15.Длина строки 25 символов. Подстрока из четырех символов. Определить все вхождения подстроки. Поменять местами второе вхождение с последними символами строки.
Вопросы для защиты
1. Строковый тип String.
2. Основные операции над строками.
3. Постановка задачи поиска подстрок.
4. Простейший алгоритм поиска подстроки.
25
5. Зависимость времени работы простейшего алгоритма поиска от длины
строки и подстроки.
6. Какие сравнения символов делает простейший алгоритм поиска подстроки Р=0001 в строке Т=000010001010001?
7. Покажите, что в худшем случае простейший алгоритм найдет первое
вхождение подстроки за время Q((n-m+1)m).
8. Алгоритм поиска подстрок Рабина - Карпа.
9. Сколько холостых срабатываний даст алгоритм Рабина-Карпа, если
q=11, T=3141592653589793?
26
6 Лабораторная работа. Алгоритм поиска в строке на конечном
автомате
Цель работы: Закрепление знаний алгоритмов поиска подстроки в
строке, приобретение навыка разработки процедур реализующих алгоритмы поиска подстроки на конечном автомате.
Задание: Для заданного образца Р построить таблицу и граф переходов автомата для поиска вхождений в строках над алфавитом Е. Написать
программу для поиска всех вхождений образца Р в строке и определения
количества сравнений до каждого вхождения. Сравнить полученные результаты поиска на конечном автомате с теоретическими результатами поиска простейшим способом. Варианты заданий приведены в таблице 6.1.
Подготовка к работе
Изучить соответствующий данной лабораторной работе лекционный
материал. Разобрать работу конечного автомата в программе Lr_06. Повторить способы и параметры оценки эффективности алгоритмов. Подготовить ответы на вопросы к защите. Литература: [5].
Содержание отчета
1. Задание.
2. Математическая постановка задачи:
- входные данные: алфавит, образец;
- выходные данные: вхождения, количество сравнений;
- граф и таблица переходов;
- результат применения автомата.
3. Листинг программы с комментариями.
4. Результаты: количество сравнений и вхождений.
27
5. Выводы.
Программное обеспечение
1. Среда программирования Паскаль.
2. Программы Lr_06.
Таблица 6.1-Варианты заданий
Ва-
Алфавит
ри-
Е
ант
Вари-
Образец Р
ант
Алфавит Е
Образец Р
1.
{a,b,c}
aabacaabc
9.
{u,i,o}
uiuoiuio
2.
{w,v,h}
wwwvhww
10.
{p,a,s}
ppssaappa
3.
{r,k,l}
rkkklrklr
11.
{d,f,g}
1dffgldfg
4.
{n,m,l}
nnmmllml
12.
{h,j,k}
hhjkhhjh
5.
{x,z,t}
xzzztttxzt
13.
{l,z,x}
llzzllzzx
6.
{i,j,k}
ijijkkijj
14.
{x,c,v}
llccvllvv
7.
{q,w,e}
qeeqqqew
15.
{b,n,m}
bnnbmbnb
m
8.
{r,t,y}
rtyyyyrtt
16.
{q,a,z}
azzqqaza
Вопросы для защиты
1. Строковый тип String в языках высокого уровня.
2. Основные операции над строками.
3. Постановка задачи поиска подстрок.
4. Простейший алгоритм поиска подстроки.
5. Зависимость времени работы простейшего алгоритма поиска от длины
строки и подстроки.
6. Пояснить с помощью графа переходов алгоритм поиска образца на автомате.
7. Пояснить с помощью таблицы переходов алгоритм поиска образца на
автомате.
28
9. Пояснить работу программы поиска образца на автомате.
10.Постройте автомат для поиска подстроки Р=aabab и продемонстрируйте его работу на тексте Т=aaababaababa. Нарисуйте схему переходов.
29
7 Лабораторная работа. Операции с бинарными деревьями
Цель работы:
Закрепление знаний нелинейных структур данных и
алгоритмов основных операций с бинарными деревьями. Приобретение
навыка создания программ, выполняющих операции с бинарным деревом:
поиск, вставка, удаление. Исследование сложности алгоритма поиска по
бинарному дереву.
Задание: Написать процедуру для выполнения заданной операции с
бинарным деревом. Экспериментально измерить временную сложность
алгоритма
поиска элемента бинарного дерева, результат сравнить со
сложностью последовательного поиска в списке.
Подготовка к работе
Изучить алгоритмы основных операций с бинарным деревом: обход,
поиск, удаление и вставка элемента, реализованные в
программе
Lr07_bi.pas
Краткий теоретический материал
Алгоритм создание элемента (узла, англ.: node [noud]) дерева с двумя
указателями, ключом и полем с дополнительной информацией.
Make_Node (p)
// алгоритм создания нового элемента с указателем р
1 read(key, rec)
// ввести значение ключа key и информации rec
2 p:=getnode
// получить элемент с указателем p
3 k:=key
// присвоить значение ключа полю k
4 r:=rec
// присвоить значение полю r
5 left[p]:=nil
// присвоить nil полю left
6 right[p]:=nil
// присвоить nil полю right
7 return p
// вернуть указатель на новый элемент
30
Добавление элемента в дерево, сохраняя его свойство упорядоченности. Уловные обозначения: T - дерево, z - указатель на новый элемент, y указатель на родителя нового элемента, root[T] - указатель на корень дерева T, left[x] - указатель на левого сына узла х, right[x] - указатель на правого сына узла х.
Tree_Insert(T, z)
// Алгоритм добавления элемента в дерево
1 y:=nil
2 x:=root[T]
3 while x<>nil do
4
y:=x
5
if key[z]<key[x]
6
then x:=left[x]
7
else x:=right[x]
// цикл поиска узла-родителя нового элемента
// "y"-указатель на родителя нового элемента
8 p[z]:=y
// указатель на родителя нового элемента
9 if y=nil
// если дерево пусто
10 then root[T]:=z
// тогда новый элемент корень дерева
11 else if key[z]<key[y] // иначе, если ключ нового эл-та < ключа "y"
12
then left[y]:=z
// тогда новый элемент-левый сын дерева
13
else right[y]:=z // иначе новый элемент-правый сын дерева
Алгоритм создания дерева.
Make_Tree(root[T])
// Алгоритм создания дерева T с корнем root[T]
1 Make_Node(root[T])
// создание корня дерева T с указателем root[T]
2 while not eof do
// цикл создания дерева
3
Make_Node(z)
// создания элемента с указателем z
4
Tree_Insert(T, z)
// добавление элемента в дерево
5 return root[T]
31
Содержание отчета
1.
Задание.
2.
Математическая постановка задачи:
- входные и выходные данные, их тип, структура;
- математические и логические выражения;
- используемые процедуры и функции, их входные и выходные дан-
ные.
3.
Алгоритм операции (псевдокод, схема), краткое описание
4.
Листинг программы, краткое описание.
5.
Результаты выполнения операции и измерения количества сравнений
при поиске элемента бинарного дерева.
6.
Выводы.
Программное обеспечение
1 Среда программирования Паскаль;
2. Программа Lr07_bi.pas.
3 Модуль Timer.
Варианты заданий
1. Процедура удаления минимального элемента.
2. Процедура удаления максимального элемента.
3. Процедура определения среднего значения элемента дерева.
4. Процедура определения максимальной длины пути дерева.
5. Процедура определения минимальной длины пути дерева.
6. Процедура вывода информации из всех листьев дерева в порядке возрастания.
7. Процедура вывода информации из всех листьев дерева в порядке убывания.
32
8. Процедура вывода информации из всех узлов n-го уровня дерева в порядке возрастания.
9. Процедура вывода информации из всех узлов n-го уровня дерева в порядке убывания.
10.Процедура определения количества узлов дерева, значение информационных полей которых меньше нуля.
11.Процедура определения количества узлов дерева, значение информационных полей которых больше или равно нулю.
12.Процедура вывода списка узлов поддерева, корнем которого является
заданный элемент дерева.
13.Процедура определения списка узлов дерева, которые имеют по одному сыну.
14.Процедура определения списка узлов дерева, которые не имеют сынов.
15.Процедура определения списка узлов дерева, которые не имеют по два
сына.
Вопросы для защиты
1. Какие структуры являются нелинейными?
2. Каковы признаки нелинейных структур?
3. Что такое граф состояния?
4. Что называют деревом?
5. Основные понятия: корень, высота дерева, уровень дерева, листья дерева, степень исхода узла, лес.
6. Какие деревья называют бинарными, m-арными, упорядоченными, сбалансированными?
7. Алгоритм создания дерева в динамической памяти.
8.
Основные операции с деревом: обход дерева, удаление поддерева,
вставка поддерева.
9. Алгоритмы обхода бинарного дерева.
33
10. Алгоритм бинарного поиска.
11. Алгоритм поиска, вставки и удаления элементов бинарного дерева.
12. Можно ли применять бинарный поиск к массивам?
13. Если удалить корень в непустом бинарном дереве, то какой элемент
станет на его место?
34
8 Лабораторная работа. Анализ алгоритмов сортировки массивов
Цель работы: Закрепление знаний алгоритмов сортировки массивов.
Приобретение навыка написания процедур сортировки данных и анализа
алгоритмов.
Задание: Написать процедуру сортировки строк. Измерить параметр,
определяющий временную сложность алгоритма сортировки. Варианты
алгоритмов сортировки и измеряемых параметров сложности приведены
ниже.
Подготовка к работе
Изучить алгоритмы сортировки массивов, реализованных в программе Lr_09.pas: метод прямого включения, метод прямого выбора, метод
прямого обмена, сортировка Шелла и быстрая сортировка.
Содержание отчета
1. Задание.
2. Математическая постановка задачи:
- входные и выходные данные, их тип, структура;
- математические и логические выражения;
- используемые процедуры и функции, их входные и выходные данные.
3. Алгоритм сортировки (псевдокод или схема алгоритма), краткое описание.
4. Анализ алгоритма сортировки.
5. Листинг программы, краткое описание.
6. Результаты оценки временной сложности алгоритма сортировки.
7. Выводы.
35
Программное обеспечение
1. Среда программирования Паскаль;
2. Программа Lr_09.pas.
3. Модуль Timer.
Варианты заданий
1. Сортировка методом прямого включения (вставки). Параметр сложности: количество сравнений.
2. Сортировка методом прямого включения с барьером. Параметр сложности: количество сравнений.
3. Сортировка методом прямого выбора. Параметр сложности: количество
сравнений.
4. Сортировка с помощью прямого обмена. Параметр сложности: количество сравнений.
5. Быстрая сортировка. Параметр сложности: количество сравнений.
6. Сортировка методом Шелла. Параметр сложности: количество сравнений.
7. Сортировка методом прямого включения (вставки). Параметр сложности: количество перестановок.
8. Сортировка методом прямого включения с барьером. Параметр сложности: количество перестановок.
9. Сортировка методом прямого выбора. Параметр временной сложности:
количество перестановок.
10.Сортировка с помощью прямого обмена. Параметр сложности: количество перестановок.
11.Быстрая сортировка строк Параметр сложности: количество перестановок.
12.Сортировка методом Шелла. Параметр сложности: количество перестановок.
36
13.Сортировка методом прямого включения (вставки). Параметр сложности: время сортировки.
14.Сортировка методом прямого включения с барьером. Параметр сложности: время сортировки.
15.Сортировка методом прямого выбора. Параметр сложности: время сортировки.
Вопросы для защиты
1. Что такое сортировка?
2. Понятие внешней и внутренней сортировок.
3. Назовите критерии эффективности алгоритмов сортировки.
4. Алгоритм сортировки методом прямого включения (вставки), его эффективность.
5. Алгоритм сортировки методом прямого включения с барьером, его эффективность.
6. Алгоритм сортировки методом прямого выбора, его эффективность.
7. В чем разница между алгоритмами сортировки прямого включения, выбора и обмена?
8. Алгоритм сортировки с помощью прямого обмена, его эффективность.
9. Быстрая сортировка, ее эффективность.
10.
Алгоритм сортировки методом Шелла, его эффективность.
11.
Алгоритм сортировки слиянием, его эффективность.
12.
Какие факторы могут влиять на эффективность сортировки?
37
9 Лабораторная работа. Улучшенные алгоритмы сортировки
Цель работы:
Закрепление знаний улучшенных алгоритмов сорти-
ровки. Исследование алгоритма сортировки деревом. Приобретение навыка анализа алгоритмов сортировки данных.
Задание: Выполнить сортировку заданным алгоритмом массива данных из 8 элементов с помощью программы Lr_9.pas. Внести изменения в
программу для вывода на печать массива сортируемых данных после каждой перестановки. Пояснить результаты. Показать, как работают процедуры алгоритма сортировки с помощью сортирующего дерева (кучи) путем
отображения изменения состояния данных в виде деревьев. Варианты задания приведены ниже.
Подготовка к работе
Изучить улучшенные алгоритмы сортировки: метод сортирующего
дерева, сортировка Шелла, быстрая сортировка, реализованные в программах Lr_8.pas и Lr_9.pas. Разобрать код программ, выполнить сортировку
данных, сравнить эффективность алгоритмов сортировки.
Содержание отчета
1. Задание.
2. Результаты процесса сортировки программой Lr_9.pas, отображающие
изменения данных после каждой перестановки в массиве.
3. Изменение состояния данных в процессе работы процедур алгоритма
сортировки с помощью кучи. Процесс изменения данных оформить в
виде последовательности деревьев.
4. Выводы.
38
Программное обеспечение
1. Среда программирования Паскаль.
2. Программа Lr_8.pas.
3. Программа Lr_9.pas: процедура Heapify(A,i) - восстанавливает основное свойство сортирующего дерева в массиве А, путем перестановки i-го
элемента; процедура Build-Heap(A) - строит сортирующее дерево из исходного массива А; процедура Heapsort(A) - сортирует массив А.
Варианты заданий
1.
Вывести на печать данные отражающие все перестановки алгоритма
быстрой сортировки. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,3) для массива (10, 24, 20,
18, 17, 19, 13, 12, 14, 26). Состояние данных покажите в виде дерева перед
каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (18,
17, 26, 24, 20, 19, 13, 12, 14, 10).
2.
Вывести на печать данные отражающие все перестановки алгоритма
сортировки слиянием. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,2) для массива (26, 12, 20,
18, 17, 19, 13, 24, 14, 10). Состояние данных покажите в виде дерева перед
каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй перестановок корневого элемента и правого лиса дерева Исходная куча: 26, 24,
39
20, 18, 17, 19, 13, 12, 14, 10.
3.
Вывести на печать данные отражающие все перестановки алгоритма
сортировки Шелла. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма
сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,3) для массива (1, 14, 20, 18,
17, 19, 13, 12, 4, 21). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (18,
17, 21, 14, 20, 19, 13, 12, 4).
4.
Вывести на печать данные отражающие все перестановки алгоритма
быстрой сортировки. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,2) для массива (21, 4, 20, 18,
17, 19, 13, 12, 14, 1). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй перестановок корневого элемента и правого лиса дерева. Исходная куча: 21, 19,
20, 18, 17, 16, 13, 12, 4, 1.
5.
Вывести на печать данные отражающие все перестановки алгоритма
сортировки слиянием. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,3) для массива (5, 10, 15, 6,
8, 10, 4, 3, 2, 31, 7). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
40
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (6,
8, 31, 10, 15, 10, 4, 3, 2, 5).
6.
Вывести на печать данные отражающие все перестановки алгоритма
сортировки Шелла. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,1) для массива (31, 2, 15, 6,
8, 10, 4, 3, 10, 5, 7). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй перестановок корневого элемента и правого лиса дерева. Исходная куча:
31,10,15,6,8,10,4,3,2,5,7.
7.
Вывести на печать данные отражающие все перестановки алгоритма
быстрой сортировки. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,2) для массива (2, 33, 41, 5,
28, 27, 10, 47, 3, 14, 13). Состояние данных покажите в виде дерева перед
каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (5,
28, 47, 33, 41, 27, 10, 2, 3, 14).
8.
Вывести на печать данные отражающие все перестановки алгоритма
сортировки слиянием. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,2) для массива (47, 14, 41, 5,
41
28, 27, 10, 2, 3, 33, 13). Состояние данных покажите в виде дерева перед
каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй перестановок корневого элемента и правого лиса дерева. Исходная куча: 47, 33,
41, 5, 28, 27, 10, 2, 3, 14, 13.
9.
Вывести на печать данные отражающие все перестановки алгоритма
сортировки Шелла. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма
сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,3) для массива (13, 40, 30,
15, 28, 27, 10, 2, 3, 14, 45). Состояние данных покажите в виде дерева перед
каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (28,
27, 45, 30, 15, 10, 2, 3, 14, 13).
10. Вывести на печать данные отражающие все перестановки алгоритма
быстрой сортировки. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,) для массива (45, 14, 30, 15,
28, 27, 10, 2, 3, 40, 13). Состояние данных покажите в виде дерева перед
каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй перестановок корневого элемента и правого лиса дерева. Исходная куча: 45,
40, 30, 15, 28, 27, 10, 2, 3, 14, 13.
11. Вывести на печать данные отражающие все перестановки алгоритма
сортировки слиянием. Пояснить результаты. Покажите в виде последова-
42
тельности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,) для массива (31, 2, 11, 6, 8,
10, 6, 3, 16, 5, 7). Состояние данных покажите в виде дерева перед каждым
рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (31,
16, 11, 6, 8, 10, 6, 3, 2, 5, 7).
12. Вывести на печать данные отражающие все перестановки алгоритма
сортировки Шелла. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма
сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,3) для массива (31, 7, 11, 6,
8, 10, 6, 3, 2, 5, 16). Состояние данных покажите в видедерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй перестановок корневого элемента и правого лиса дерева. Исходная куча: 31, 16,
11, 6, 8, 10, 6, 3, 2, 5, 7.
13. Вывести на печать данные отражающие все перестановки алгоритма
быстрой сортировки. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,2) для массива ( 4, 10, 16, 6,
8, 12, 11, 3, 17, 7, 2). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (8,
12, 10, 16, 6, 11, 3, 4, 7, 2).
43
14. Вывести на печать данные отражающие все перестановки алгоритма
сортировки слиянием. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,3) для массива (17, 2, 16, 6,
8, 12, 11, 3 4, 7, 10). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Heapsort(A) после первой и второй простановок корневого элемента и правого лиса дерева. Исходная куча: 17, 10,
16, 6, 8, 12, 11, 3, 4, 7, 2.
15. Вывести на печать данные отражающие все перестановки алгоритма
сортировки Шелла. Пояснить результаты. Покажите в виде последовательности деревьев процесс преобразования данных процедурами алгоритма
сортировки с помощью «кучи»:
- покажите, как работает процедура Heapify(A,1) для массива (7, 11, 21, 9,
5, 12, 11, 3, 4, 27, 2). Состояние данных покажите в виде дерева перед каждым рекурсивным обращением;
- покажите состояние данных в виде дерева перед каждым вызовом процедуры Heapify(A,i) в процедуре Build-Heap(A) для исходного массива (5,
12, 11, 21, 9, 11, 3, 4, 7, 2).
Вопросы для защиты
1. Поясните алгоритм сортировки с помощью дерева.
2. Поясните алгоритм сортировки Шелла.
3. Поясните алгоритм быстрой сортировки.
4. Пусть сортирующее дерево имеет высоту h. Сколько элементов может в
ней быть?
5. Докажите, что сортирующее дерево из n элементов имеет высоту
44
log
n.
6. Докажите, что при выполнении основного свойства сортирующего дерева корневая вершина любого поддерева является наибольшей в этом
поддереве.
7. Где может находиться наименьший элемент сортирующего дерева, если
все элементы различны?
8. Пусть массив отсортирован в обратном порядке. Является ли такой массив сортирующим деревом?
9. Является ли сортирующим деревом массив {23, 17, 14, 6, 13, 10, 1, 5, 7,
12}?
45
10 Лабораторная работа. Алгоритмы поиска на графах
Цель работы: Закрепление теоретических знаний представления графов в памяти компьютера, алгоритмов поиска на графах, приобретение
навыка разработки программ, реализующих алгоритмы поиска на графах.
Задание:
1. Изменить исходные данные в программе Lr10.pas для заданного графа.
Составить список вершин для заданного графа в порядке поиска в глубину.
Вывести список обхода вершин графа программой Lr_10.pas. Сравнить
списки, устранить ошибки. Граф задает преподаватель.
2. Написать процедуру выполнения операции на графе. Получить результаты выполнения программы.
Подготовка к работе
Повторить теоретический материал по вопросам: машинное представление графов; алгоритмы поиска на графах. Подготовить ответы на
вопросы к защите. Литература: [2].
Порядок выполнения работы
1.
Для понимания алгоритма поиска выполнить по шагам просмотр гра-
фа программой Lr_10.pas. При выполнении программы анализировать изменения значений переменных и массивов в окне Watch.
2.
Для заданного графа составить матрицу смежности, матрицу стоимо-
сти, списки смежных вершин и внести изменения в исходные данные программы Lr_10.pas.
3.
Составить список просмотра вершины графа в порядке поиска в глу-
бину. Выполнить просмотр графа программой и сравнить порядок просмотра графа программой с составленным списком. Проанализировать и
устранить ошибки.
46
4.
Написать математическую постановку решения поставленной задачи.
5.
Написать программу для решения задачи.
6.
Тестировать программу.
7.
Оформить отчет.
Содержание отчета
1. Задание.
2. Математическая постановка задачи:
- входные данные: рисунок графа, матрица смежности и стоимости, списки
смежных вершин;
- выходные данные: форма представления, тип,
- метод решения задачи.
3. Псевдокод и описание алгоритма решения задачи;
4. Листинг программы с комментариями и описанием.
5. Результаты:
-список вершин графа в порядке поиска в глубину;
-список ребер и рисунок остовного дерева наименьшей стоимости;
-полное имя программы.
Программное обеспечение
1. Среда программирования Паскаль.
2. Программа Lr_10: обход графа.
Варианты заданий
1.
Поиск в глубину. Определение среднего арифметического значения
ключей вершин графа.
2.
Поиск в глубину. Определение максимального ключа вершин графа.
3.
Поиск в глубину. Определение количества вершин с ключами, значе-
ние которых больше заданного значения.
47
4.
Поиск в глубину. Добавление новой вершины с ребрами в граф.
5.
Поиск в глубину. Добавление нового ребра в граф.
6.
Поиск в глубину. Удаление вершины графа с заданным ключом.
7.
Поиск в глубину. Удаление ребра графа.
8.
Поиск в глубину. Вывести на печать элементы массива, значения ин-
дексов которых не являются ключами вершин графа.
9.
Поиск в глубину. Проверка ключей графа на уникальность.
10. Поиск в глубину. Вывести на печать матрицу смежности.
11. Поиск в глубину. Вывести на печать матрицу стоимости.
12. Поиск в глубину. Вывести на печать списки смежных вершин.
13. Поиск в глубину. Вывести на печать веса ребер, по которым осуществляется поиск.
14. Поиск в ширину. Определение среднего арифметического значения
ключей вершин графа.
15. Поиск в ширину. Определение максимального ключа вершин графа.
Вопросы для защиты
1.
Поясните представление графа набором списков смежных вершин.
2.
Поясните представление графа в виде матрицы смежности.
3.
Поясните алгоритм поиска в ширину.
4.
Поясните алгоритм поиска в глубину.
5.
Граф хранится в виде списка смежных вершин. Сколько операций
необходимо, чтобы найти число выходящих из данной вершины ребер и
число входящих в данной вершины ребер?
6.
Укажите представление в виде списков смежных вершин и матрицу
смежности для графа, являющегося двоичным деревом с 7 вершинами.
Вершины дерева пронумерованы как при сортировке с помощью кучи.
7.
Нарисуйте ориентированный граф и покажите порядок поиска в ши-
рину.
48
8.
Нарисуйте неориентированный граф и покажите порядок поиска в
глубину.
49
11 Лабораторная работа. Алгоритмы оптимального выбора на
графе
Цель работы: закрепить теоретические знания по теме: Машинное
представление графов, алгоритмы оптимального выбора.
Задание: Получить вариант графа у преподавателя. Пронумеровать
вершины графа в порядке поиска в глубину. В программе Lr_11.pas исходные данные отредактировать для своего варианта. Получить порядок просмотра вершин при поиске в глубину и построить на заданном графе
остовное дерево наименьшей стоимости с помощью программы Lr_11.pas
(Приложение Б).
Подготовка к работе
Повторить теоретический материал по вопросам: машинное представление графов; поиск в глубину в графах; стовное дерево наименьшей
стоимости и алгоритм его построения.
Порядок выполнения работы
1. Для закрепления и понимания теоретического материала выполнить по
шагам просмотр графа и формирование остовного дерева программой
Lr_11.pas. При выполнении программы анализировать изменения значений
переменных и массивов в окне Watch: v, w, w1, w2, Q, Vs, T, Nw.
2. По графу определить количество ребер и вершин, составить матрицу
смежности, матрицу стоимости, вектор с информацией из вершин графа,
список ребер в порядке возрастания их стоимости
3. Внести изменения в исходные данные программы Lr_11.pas для своего
графа.
4. Составить список просмотра вершины графа в порядке поиска в глубину.
50
Выполнить просмотр графа программой и сравнить порядок просмотра
графа
программой с ручным. Проанализировать и устранить ошибки.
5. Построить остовное дерево наименьшей стоимости с помощью программы.
Нарисовать полученное дерево.
Содержание отчета
1) Задание.
2) Математическая постановка задачи:
- рисунок графа;
- матрицы смежности, стоимости и вектор информации вершин графа;
- описание алгоритма просмотра графа;
- описание алгоритма построения на графе остовного дерева минимальной
стоимости.
3) Программа для построения остовного дерева наименьшей стоимости.
Если в программе Lr_11.pas не внесено никаких изменений, кроме данных,
описывающих заданный граф, то достаточно распечатать блоки Const и
Var.
4) Результаты:
-список вершин графа в порядке поиска в глубину;
-список ребер и рисунок остовного дерева наименьшей стоимости;
-полное имя программы.
Программное обеспечение
1. Среда программирования Паскаль.
2. Программа Lr_11: обход графа, построение оставного дерева минимальной стоимости.
51
Вопросы для защиты
1. Какие способы представления графа в памяти ЭВМ вы знаете?
2. В чем различие алгоритмов поиска в ширину и поиска в глубину на
графе?
3. Какое дерево называют остовным?
4. Какое дерево является остовным деревом наименьшей стоимости?
5. Поясните алгоритм построения оставного дерева.
52
Список литературы
1. Лойко В.И. Структуры и алгоритмы данных ЭВМ: Курс лекций для
спец. 220400 – Краснодар: КубГТУ, 1998.
2. Ахо А., Хопкрофт Дж., Ульман Дж. Структуры данных и алгоритмы. :
Пер с англ.: М.: издательский дом «Вильямс», 2001. – 384 с.
3. Вирт Н. Алгоритмы и структуры данных: Пер. с англ. -2-е изд., испр.СПб.:Невский Диалект, 2001.-352 с.: ил.
4. Вирт Н. Алгоритмы и структуры данных. – М.: Мир, 1989.
5. Кормен Т. Лейзерсон Ч. Ривест Р. Алгоритмы: построение и анализ. М.:
МЦНМО, 2002. – 960 с.
6. Кнут Д. Искусство программирования для ЭВМ. – В 3 т. 2001.
53
Приложение А
ОБРАЗЕЦ ОФОРМЛЕНИЯ ОТЧЕТА
Отчет о лабораторной работе №___
по дисциплине ___________________________________________________
на тему__________________________________________________________
________________________________________________________________
Студент_________________________
фамилия, и. о.
Группа_________________________
шифр группы.
Преподаватель ___________________
фамилия, и. о.
Цель работы _____________________________________________________
________________________________________________________________
Задание _________________________________________________________
________________________________________________________________
Математическая постановка задачи__________________________________
________________________________________________________________
Краткое описание методов решения задачи___________________________
________________________________________________________________
________________________________________________________________
Листинг программы ______________________________________________
Результаты решения ______________________________________________
________________________________________________________________
Выводы _________________________________________________________
________________________________________________________________
Выполнена ____________________________подпись ___________________
Число, месяц, год
(студента)
Проверил _____________________________подпись ___________________
Число, месяц, год
(преподавателя)
54
Приложение Б
Программа демонстрации представления графа
в памяти компьютера и поиска на графе:
| Номер
| Инф.
|Смежные
| Веса
|
|вершины | вершины |вершины
| ребер
|
| 1 | 10 | 2,6,7
| 20,23,1
|
| 2 | 20 | 1,3,7
| 20,15,4
|
| 3 | 30 | 2,4,7
| 15,3,9
|
| 4 | 40 | 3,5,
| 3,16
|
| 5 | 50 | 4,6,7
| 28,25
|
| 6 | 60 | 1,5,7
| 23,28,36
|
| 7 | 70 | 1,2,3,4,5,6 | 1,4,9,16,25,36 |
program GrafSearch;
uses crt,timer;
type
PNode = ^TNode; {ссылочный тип на элемент списка смежных вершин}
TNode = record
{тип элемента списка}
Num : integer;
{номер смежной вершины}
Ves : integer;
{вес ребра}
next: PNode;
{ссылка на следующий элемент списка}
end;
TNodeT = record
{тип элемента списка}
Info : integer;
{информация вершины}
next: PNode;
{ссылка на начало списка смежных вершин}
end;
const
n=7;
{количество вершин в графе}
{матрица смежности ненаправленного графа}
Ms:array[1..n,1..n] of integer = ((0,1,0,0,0,1,1), (1,0,1,0,0,0,1), (0,1,0,1,0,0,1),
55
(0,0,1,0,1,0,1), (0,0,0,1,0,1,1), (1,0,0,0,1,0,1), (1,1,1,1,1,1,0));
{вектор c информацией, находящейся в вершинах графа}
Info:array[1..n] of integer = (10,20,30,40,50,60,70);
{матрица стоимости ребер ненаправленного графа}
s:array[1..n,1..n] of integer = ((0 ,20,0 ,0 ,0 ,23,1), {1} (20,0 ,15,0 ,0 ,0 ,4),
{2}(0 ,15,0 ,3 ,0 ,0 ,9), {3} (0 ,0 ,3 ,0 ,17,0 ,16), {4} (0 ,0 ,0 ,17,0 ,28,25),
{5} (23,0 ,0 ,0 ,28,0 ,36), {6} (1 ,4 ,9 ,16,25,36,0)); {7}
{Списки смежных вершин и веса ребер, представленных в массиве
A[i,j,k], где A[i,j,1] - матрица списков смежных вершин, A[i,j,2] - матрица
весов ребер,}
A:array[1..n,1..n,1..2] of integer =
(((2,20),(6,23),(7, 1),(0, 0),(0, 0),(0, 0),(0,0)), {смежные вершины с 1-ой }
((1,20),(3,15),(7, 4),(0, 0),(0, 0),(0, 0),(0,0)), {смежные вершины с 2-ой }
((2,15),(4, 3),(7, 9),(0, 0),(0, 0),(0, 0),(0,0)), {смежные вершины с 3-ой }
((3, 3),(5,17),(7,16),(0, 0),(0, 0),(0, 0),(0,0)), {смежные вершины с 4-ой }
((4,17),(6,28),(7,25),(0, 0),(0, 0),(0, 0),(0,0)), {смежные вершины с 5-ой }
((1,23),(5,28),(7,36),(0, 0),(0, 0),(0, 0),(0,0)), {смежные вершины с 6-ой }
((1, 1),(2, 4),(3, 9),(4,16),(5,25),(6,36),(0,0)));{смежные вершины с 7-ой }
var
i,j,v,u: integer;
Nw: array[1..n] of boolean;
{признаки просмотра вершины}
Tabl: array[0..n] of TNodeT; {массив ссылок на начало списков смежных
вершин и информации}
p,q:Pnode;
menu:char;
{Рекурсивная процедура просмотра графа с v-той вершины методом поиска в глубину}
Procedure WG(v:integer);
begin
56
Write('Информ.вершины= ',Info[v]); {просмотр вершины}
Nw[v]:=False;
{установка признака просмотра вершины}
for u:=1 to n do
{цикл просмотра смежных вершин с узлом v}
if (Ms[v,u]=1) and Nw[u] then {если смежная вершина есть и она не использована}
begin
{то смотреть граф с u-ой вершины}
Writeln(', смежные вершины (v-u)=(',v,'-',u,'), вес ребра =',s[v,u]);
WG(u);
end;
end;
Procedure Write_G; {Процедура просмотра графа}
begin
{инициализация признаков просмотра вершин}
for i:=1 to n do Nw[i]:=true;
{если из n вершин i-ая не использована, то смотреть граф с i-ой вершины}
for i:=1 to n do if Nw[i] then WG(i);
end;
{Создание списков смежных вершин в динамической памяти. Списки заполняются из массива A[i,j,k]. Информация вершин графа размещается в
массиве ссылок на начало списков Tabl. Элемент массива Tabl является записью извух полей: ссылка на начало списка и информация вершины. }
Procedure Make_G;
begin
for i:=1 to n do {цикл создания списков на каждую вершину}
begin
Tabl[i].info:=info[i];
{запись информации в вершину}
if A[i,1,1]=0 then
{нет в списке смежных вершин}
begin
57
Tabl[i].next:=nil;
end
{есть в списке смежные вершины }
else
begin
New(p); Tabl[i].next:=p; {ссылка на начало списка i-ой вершины}
j:=1;
While A[i,j,1]>0 do {цикл создания списка для i-ой вершины}
begin
p^.num:=A[i,j,1]; {запись в список номера смежной i-ой вершины}
p^.ves:=A[i,j,2]; {запись в список веса ребра из i-ой вершины в
A[i,j,1]}
{счетчик смежных вершин в списке}
inc(j);
if A[i,j,1]=0 then p^.next:=nil {конец списка}
else
{нет конца списка}
begin
New(q);
{создание следующего элемента списка}
p^.next:=q;
{ссылка на следующий элемент списка}
p:=q;
end;
end; {While A}
end; {if A}
end; {for i}
end;
{Печать списков смежных вершин из динамической памяти}
Procedure Print_G;
begin
for i:=1 to n do
{цикл печати списков на каждую вершину}
begin
p:=Tabl[i].next; write(i,'-->');
58
While p<>nil do
{цикл печати списка для i-ой вершины}
begin
write(p^.num,' ');
p:=p^.next;
end;
writeln;
end;
end;
Procedure Search_G; {Поиск вершины графа по условию info=key}
begin …
end;
begin
while menu<>'7' do
begin
window(1,1,80,10); clrscr; {установка окна меню и его очистка}
writeln('
***** О П Е Р А Ц И И на Г Р А Ф Е *****
');
writeln('1. Поиск в глубину на графе, заданном матрицей смежности');
writeln('2. Создание списков смежных вершин в динамической памяти');
writeln('3. Печать списков смежных вершин из динмической памяти');
writeln('4. .......................................................');
writeln('5. .......................................................');
writeln('6. Оценка временной сложности алгоритма поиска элемента');
writeln('7. Выход..................................................');
write('Введите номер пункта меню: '); menu:=readkey;
window(1,11,80,25); clrscr;{установка окна вывода и его очистка}
case menu of
'1': begin {Поиск в глубину на графе заданном матрицей смежности }
Writeln('Просмотр графа: ');
Write_G;
end;
'2': begin {Создание списков смежных вершин в динамической памяти}
59
Make_G; Writeln('Списки смежных вершин в созданы!!!');
end;
'3': begin {Печать списков смежных вершин из динамической памяти}
Writeln('Списки смежных вершин: ');
Print_G;
end;
'4': begin {Поиск вершины графа}
{Search_G;}
end;
'5': begin {} end;
'6: begin {Оценка временной сложности поиска элемента в графе}
um_k:=0; randomize;
start(t);
{начала отчета времени - модуль Timer}
for i:=1 to Ns do {цикл повторения поиска для статистики}
begin
a:=round(random*(N)); {опр. случайного ключа поиска - х}
Serch_G; {поиск элемента "x"}
if q<>nil then {время вывода результатов сравнения<=0,5 сек}
writeln('Поиск ',a,'=>',q^.info,' Кол сравнений = ',k,'
')
else writeln('Элемента "a"=',a,' нет
');
sum_k:=sum_k+k;
end;
finish(t);
{конец отчета времени - модуль Timer}
report('Время поиска ',t);{вывод времени поиска - модуль Timer}
write('Среднее количество сравнений= ',sum_k/Ns,'
end;
end;
end;
end.
60
');}
ДЛЯ ЗАМЕТОК
61
СТРУКТУРЫ И АЛГОРИТМЫ
ОБРАБОТКИДАННЫХ НА ЭВМ
Составитель: Ткаченко Анатолий Дмитриевич
Компьютерный набор А.Д. Ткаченко
Компьютерная верстка Д.А. Трухан
Технический редактор М. В. Умарова
Подписано в печать
Формат 60х84/16
Бумага офсетная
Печать трафаретная
Печ.л
Изд. №
Усл. печ.л.
Тираж экз.
Уч. - изд. л.
Заказ №
Лиц. ИД № 02586 от 18.08.2000
ГОУ ВПО «Кубанский государственный технологический университет»
350072, Краснодар, ул. Московская, 2-а
Армавирский филиал РИО КубГТУ
352905 г. Армавир, ул. Кирова, 127
62
Download