
Z9411_Чурилов_ПиАГМ_ПР1
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА 41 |
ОЦЕНКА
ПРЕПОДАВАТЕЛЬ
старший преподаватель |
|
|
|
М. Н. Шелест |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ПРАКТИЧЕСКОЙ РАБОТЕ №1
|
||||
Представление графов в ЭВМ |
||||
по курсу: Построение и анализ графовых моделей |
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
Z9411 |
|
|
|
А.С.Чурилов |
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Студенческий билет № 2019/3684
Санкт-Петербург 2024
Цель работы:
Изучение представления графов в ЭВМ при помощи матрицы смежности, множества пар вершин и массива структур. Визуализация графов.
Ход работы:
Возьмём указанный в работе вариант задания (рисунок 1)
Рисунок 1 – Мой вариант графа
Примечание для проверяющего – Две разные точки названы одинаково (Div), я так понимаю ошибка, называю вторую Div(2).
Составим вручную матрицу смежности (таблица 1):
Таблица 1
|
X |
Y |
Plus |
Div |
K |
Multiplic |
Z |
Div(2) |
A |
X |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
Y |
0 |
0 |
7 |
0 |
0 |
0 |
0 |
0 |
0 |
Plus |
0 |
0 |
0 |
9 |
0 |
9 |
0 |
0 |
0 |
Div |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
K |
0 |
0 |
0 |
3 |
0 |
3 |
0 |
3 |
0 |
Multiplic |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
72 |
24 |
Z |
0 |
0 |
0 |
0 |
0 |
8 |
0 |
0 |
0 |
Div(2) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
24 |
A |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Внесём в редактор кода матрицу смежности и список вершин (рисунок 2).
Рисунок 2 – Матрица смежности и список вершин
Напишем подпрограмму, создающую список рёбер из матрицы смежности (рисунок 3).
Рисунок 3 – Программа создания списка рёбер из матрицы смежности
Результат работы программы представлен на рисунке 4.
Рисунок 4 – Результат работы программы
Визуализируем граф с помощью полученного списка рёбер, программный код представлен на рисунке 5.
Рисунок 5 – Код программы построения графа
Результат работы программы представлен на рисунке 6.
Рисунок 6 – Результат работы программы
Полученный граф совпадает с исходным, значит всё сделано верно.
Напишем подпрограмму, создающую список записей из матрицы смежности (рисунок 7).
Рисунок 7 – Программа создания массива записей из матрицы смежности
Результат работы программы представлен на рисунке 8.
Рисунок 8 – Результат работы программы
Визуализируем граф с помощью полученного массива записей, программный код представлен на рисунке 9.
Рисунок 9 – Код программы построения графа
Результат работы программы представлен на рисунке 10.
Рисунок 10 – Результат работы программы
Полученный граф совпадает с исходным, значит всё сделано верно.
Для каждого из представлений (матрица смежности, список рёбер, массив записей) напишем подпрограммы в соответствии с заданием.
Код программы по поиску всех соседей вершины для матрицы смежности представлен на рисунках 11, 12.
Рисунок 11 – Код программы
Рисунок 12 – Код программы
Результат работы программы представлен на рисунке 13.
Рисунок 13 – Результат выполнения программы
Код программы по поиску всех соседей вершины для списка рёбер представлен на рисунке 14.
Рисунок 14 – Код программы
Результат работы программы представлен на рисунке 15.
Рисунок 15 – Результат выполнения программы
Код программы по поиску всех соседей вершины для массива записей представлен на рисунках 16, 17.
Рисунок 16 – Код программы
Рисунок 17 – Код программы
Результат работы программы представлен на рисунке 18.
Рисунок 18 – Результат выполнения программы
Код программы возвращающий список вершин, сумма весов инцидентных ребер которых больше заданной величины для матрицы смежности представлен на рисунке 19.
Рисунок 19 – Код программы
Результат работы программы представлен на рисунке 20.
Рисунок 20 – Результат выполнения программы
Код программы возвращающий список вершин, сумма весов инцидентных ребер которых больше заданной величины для списка рёбер представлен на рисунке 21.
Рисунок 21 – Код программы
Результат работы программы представлен на рисунке 22.
Рисунок 22 – Результат выполнения программы
Код программы возвращающий список вершин, сумма весов инцидентных ребер которых больше заданной величины для массива записей представлен на рисунке 23.
Рисунок 23 – Код программы
Результат работы программы представлен на рисунке 24.
Рисунок 24 – Результат выполнения программы
Код программы, возвращающий количество рёбер в графе для матрицы смежности представлен на рисунке 25.
Рисунок 25 – Код программы
Результат работы программы представлен на рисунке 26.
Рисунок 26 – Результат выполнения программы
Код программы, возвращающий количество рёбер в графе для списка рёбер представлен на рисунке 27.
Рисунок 27 – Код программы
Результат работы программы представлен на рисунке 28.
Рисунок 28 – Результат выполнения программы
Код программы, возвращающий количество рёбер в графе для массива записей представлен на рисунке 29.
Рисунок 2912 – Код программы
Результат работы программы представлен на рисунке 30.
Рисунок 30 – Результат выполнения программы
Для каждого представления (матрица смежности, список рёбер, массив записей) выведем размер объекта в байтах (рисунки 31-33).
Рисунок 31 – Размер матрицы смежности
Рисунок 32 – Размер списка рёбер
Рисунок 33 – Размер массива записей
Замерим время выполнения подпрограмм для всех исполнений.
Время выполнения функций по 1 миллиону раз для матрицы смежности приведено на рисунке 34.
Рисунок 34 – Время выполнения подпрограмм матрицы смежности
Время выполнения функций по 1 миллиону раз для списка рёбер приведено на рисунке 35.
Рисунок 35 – Время выполнения подпрограмм списка рёбер
Время выполнения функций по 1 миллиону раз для массива записей приведено на рисунке 36.
Рисунок 36 – Время выполнения подпрограмм массива записей
Время выполнения функций по созданию графа по 1 миллиону раз приведено на рисунке 37.
Рисунок 37 – Время выполнения подпрограмм создания графа
Вывод:
По результатам выполнения программ и подпрограмм можно сделать вывод, что если нам более важна память, то из представлений лучше использовать матрицу смежности, так как список рёбер и массив записей занимают больше места.
Но если нам важна скорость выполнения подпрограмм, то в зависимости от необходимых программ необходимо выбирать разные представления – так для создания графа из матрицы смежности больше подойдёт массив записей, чем список рёбер; для проверки соседей вершины с небольшим отрывом подойдет матрица смежности, для нахождения количества рёбер в графе с огромным отрывом надо выбирать список рёбер, ну или на крайний случай массив записей, но никак не матрицу смежности; а для нахождения вершин по сумме инцидентных рёбер подойдёт матрица смежности, тогда как список рёбер и массив записей одинаково отстают от неё в этой задаче.
Как мы видим, нет универсального представления, ведь для его выбора нужно понимать какие задачи нам более важны и какие параметры (скорость или память)