Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по АиСД 2023 / Baraeva_Elizaveta_cw
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
КУРСОВАЯ РАБОТА
по дисциплине «Алгоритмы и структуры данных»
Тема: Реализация и исследование хеш-таблицы
Студентка гр. 2383
Бараева Е.Н.
Преподаватель
Гаврилов А.В.
Санкт-Петербург
2023

2
ЗАДАНИЕ
НА КУРСОВУЮ РАБОТУ
Студентка Бараева Е.Н.
Группа 2383
Тема работы: Реализация и исследование хеш-таблицы
Вариант 3:
Реализация хеш-таблицы с методом решения коллизий – метод цепочек и
проведение исследования функции удаления из хеш-таблицы.
Содержание пояснительной записки:
Содержание, Введение, Теоретическое описание структуры данных,
Реализация, Исследование структуры данных, Заключение, Список
использованных источников, Приложение А, Приложение Б.
Предполагаемый объем пояснительной записки:
Не менее 15 страниц.
Дата выдачи задания: 13.12.2023
Дата сдачи реферата: 24.12.2023
Дата защиты реферата: 24.12.2023
Студентка
Бараева Е.Н.
Преподаватель
Гаврилов А.В.

3
АННОТАЦИЯ
В данной курсовой работе была реализована хеш-таблица (метод
цепочек) с функциями вставки, удаления и поиска, а также проведено
исследование функции удаления. Хэш-таблица – это структура данных,
которая позволяет быстро вставлять, удалять и извлекать данные. Она работает
с помощью хэш-функции для сопоставления ключа с индексом в массиве.

4
СОДЕРЖАНИЕ
Введение
5
1.
Теоретическое описание структуры данных
6
1.1
Основные понятия и определения
6
1.2
Временная и пространственная сложность операций
6
2.
Реализация
8
2.1.
Описание разработанных классов, методов
8
2.2.
Обоснование принятых решений по выбору типов данных и
применяемых алгоритмов
9
2.3.
Примеры использования реализованных классов и методов
9
3.
Исследование структуры данных
11
3.1
Проведение экспериментов для оценки производительности
11
3.2
Анализ полученных результатов
11
Заключение
13
Список использованных источников
14
Приложение А. Исходный код программы
15
Приложение Б. Тестирование
17

5
ВВЕДЕНИЕ
Цель работы.
Целью данной работы является реализация хеш-таблицы (метод цепочек)
и исследование функции удаления на различных объемах данных (10, 100,
1000, 10000, 100000).
Задачи.
Для достижения поставленной цели требуется решить следующие задачи:
изучить информацию о хеш-таблицах и методах решений коллизий в том числе
о методе цепочек; выбрать удобную структуру данных для реализации хештаблицы.

6
1. ТЕОРЕТИЧЕСКОЕ ОПИСАНИЕ СТРУКТУРЫ ДАННЫХ
1.1. Основные понятия и определения
Хеш-таблица – это структура данных, реализующая интерфейс
ассоциативного массива, а именно, она позволяет хранить пары (ключ,
значение) и выполнять три операции: операцию добавления новой пары,
операцию удаления и операцию поиска пары по ключу.
В хеш-таблице обработка новых индексов производится при помощи
ключей. А элементы, связанные с этим ключом, сохраняются в индексе. Этот
процесс называется хешированием.
Когда хеш-функция генерирует один индекс для нескольких ключей,
возникает конфликт: неизвестно, какое значение нужно сохранить в этом
индексе. Это называется коллизией хеш-таблицы.
Метод цепочек. Суть этого метода проста: если хеш-функция выделяет
один индекс сразу двум элементам, то храниться они будут в одном и том же
индексе, но уже с помощью односвязного списка.
1.2. Временная и пространственная сложность операций
Временная сложность методов вставки, поиска и удаления в хэш-таблице
с использованием отдельной цепочки зависит от размера хэш-таблицы,
количества пар ключ-значение в хэш-таблице и длины связанного списка по
каждому индексу.
Предполагая хорошую хэш-функцию и равномерное распределение
ключей, ожидаемая временная сложность этих методов составляет O (1) для
каждой операции. Однако в худшем случае временная сложность может
составлять O(n), где n - количество пар ключ-значение в хэш-таблице.
Однако важно выбрать хорошую хэш-функцию и подходящий размер для
хэш-таблицы, чтобы минимизировать вероятность коллизий и обеспечить
хорошую производительность.

7
Пространственная сложность хэш-таблицы с использованием отдельной
цепочки зависит от размера хэш-таблицы и количества пар ключ-значение,
хранящихся в хэш-таблице.
Сама хэш-таблица занимает O(m) пространство, где m - емкость хэш-
таблицы. Каждый узел связанного списка занимает O(1) места, и в связанных
списках может быть не более n узлов, где n - количество пар ключ-значение,
хранящихся в хэш-таблице. Следовательно, общая сложность пространства
равна O(m + n).

8
2. РЕАЛИЗАЦИЯ
2.1. Описание разработанных классов, методов
Класс Node представляет узел хэш-таблицы и содержит ключ (key),
значение (value) и ссылку на следующий узел (next).
Класс HashTable представляет саму хэш-таблицу и содержит атрибуты:
ёмкость capacity (количество возможных слотов в хэш-таблице), текущий
размер size (количество элементов в хэш-таблице), и table – список слотов хэштаблицы (изначально заполненный значениями None).
Метод _hash(self, key) вычисляет хэш-код ключа и возвращает индекс
слота в хэш-таблице для данного ключа. Операция hash(key) % self.capacity
обеспечивает равномерное распределение значений хэш-функции по слотам
хэш-таблицы.
Метод insert(self, key, value) вставляет элемент с ключом key и значением
value в хэш-таблицу. Сначала он вычисляет индекс слота, в который должен
быть вставлен элемент. Если слот пуст (равен None), создается новый объект
Node с ключом и значением, и этот узел становится элементом списка по
указанному индексу. Если слот занят, то происходит перебор элементов в
списке. Если найден элемент с таким же ключом, то его значение обновляется.
Если значение не найдено, то создается новый узел и добавляется в конец
связного списка. В конце метод увеличивает размер хэш-таблицы на 1.
Метод search(self, key) осуществляет поиск значения элемента с ключом
key в хэш-таблице. Сначала он вычисляет индекс слота для данного ключа.
Затем происходит перебор элементов в списке с индексом слота и сравнение
ключей. Если элемент найден, то возвращается его значение. Если элемент не
найден, то выбрасывается исключение KeyError.
Метод remove(self, key) удаляет элемент с ключом key из хэш-таблицы.
Сначала он вычисляет индекс слота для данного ключа. Затем происходит
перебор элементов в списке с индексом слота и сравнение ключей. Если
элемент найден, то он удаляется из списка (путем изменения ссылок на

9
предыдущий и следующий узлы). Если элемент не найден, то выбрасывается
исключение KeyError. В конце метод уменьшает размер хэш-таблицы на 1.
Метод __str__(self) создает строковое представление хэш-таблицы. Он
перебирает все слоты хэш-таблицы и для каждого непустого слота перебирает
элементы в списке, формируя строку вида "(ключ, значение) -> (ключ,
значение) -> ... -> (ключ, значение)". Затем строки добавляются в список
elements, и в конце этот список возвращается функцией.
Метод __len__(self) возвращает текущий размер хэш-таблицы.
2.2. Обоснование принятых решений по выбору типов данных и
применяемых алгоритмов
Хеш-таблица состоит из двух классов: Node – узел таблицы и сама хештаблица HashTable. Решение о создании двух классов было стандартным для
реализации хеш-таблицы. Также была использована обычная хеш-функция,
проста в вычислении и понимании.
Были реализованы три основных метода: вставка, поиск, удаление, а
также переопределен метод: str и len. Они были переопределены для удобного
представления хеш-таблицы и исследования ее методов.
2.3. Примеры использования реализованных классов и методов
Примеры использования представлены в табл. 1.

10
Таблица 1 – Примеры использования
№
п/п
Входные данные
Выходные данные
Комментарии
1.
ht = main.HashTable(4)
ht.insert(0, 23)
ht.insert(1, 45)
ht.insert(2, 7)
ht.insert(3, 99)
ht.insert(4, 178)
ht.insert(9, 10)
ht.insert(17, 64)
ht.insert(23, 67)
print(ht)
['(0, 23) -> (4, 178)', '(1, 45) > (9, 10) -> (17, 64)', '(2, 7)',
'(3, 99) -> (23, 67)']
Вставка.
2.
ht = main.HashTable(4)
ht.insert(0, 23)
ht.insert(1, 45)
ht.insert(2, 7)
ht.insert(3, 99)
ht.insert(4, 178)
ht.insert(9, 10)
ht.insert(17, 64)
ht.insert(23, 67)
print(ht.search(0))
print(ht.search(1))
print(ht.search(2))
print(ht.search(3))
23
45
7
99
Поиск.
3.
ht = main.HashTable(4)
ht.insert(0, 23)
ht.insert(1, 45)
ht.insert(2, 7)
ht.insert(3, 99)
ht.insert(4, 178)
ht.insert(9, 10)
ht.insert(17, 64)
ht.insert(23, 67)
ht.remove(0)
ht.remove(4)
ht.remove(23)
ht.remove(2)
print(ht)
['(1, 45) -> (9, 10) -> (17,
64)', '(3, 99)']
Удаление.
Соседние файлы в папке Лабы по АиСД 2023
