- •Аннотация
- •Содержание
- •Введение
- •1. Теоретическое описание структуры данных
- •1.1. Основные понятия и определения
- •1.2. Временная и пространственная сложность операций
- •2.3. Примеры использования реализованных классов и методов
- •2. Реализация
- •2.1. Описание разработанных классов, методов
- •2.2. Обоснование принятых решений по выбору типов данных и применяемых алгоритмов
- •3. Исследование структуры данных
- •3.1. Проведение экспериментов для оценки производительности
- •3.2. Анализ полученных результатов
- •Заключение
- •Список использованных источников
- •Приложение а иСходный код программы
- •Приложение б тестирование
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 из хэш-таблицы. Сначала он вычисляет индекс слота для данного ключа. Затем происходит перебор элементов в списке с индексом слота и сравнение ключей. Если элемент найден, то он удаляется из списка (путем изменения ссылок на предыдущий и следующий узлы). Если элемент не найден, то выбрасывается исключение KeyError. В конце метод уменьшает размер хэш-таблицы на 1.
Метод __str__(self) создает строковое представление хэш-таблицы. Он перебирает все слоты хэш-таблицы и для каждого непустого слота перебирает элементы в списке, формируя строку вида "(ключ, значение) -> (ключ, значение) -> ... -> (ключ, значение)". Затем строки добавляются в список elements, и в конце этот список возвращается функцией.
Метод __len__(self) возвращает текущий размер хэш-таблицы.
2.2. Обоснование принятых решений по выбору типов данных и применяемых алгоритмов
Хеш-таблица состоит из двух классов: Node – узел таблицы и сама хеш-таблица HashTable. Решение о создании двух классов было стандартным для реализации хеш-таблицы. Также была использована обычная хеш-функция, проста в вычислении и понимании.
Были реализованы три основных метода: вставка, поиск, удаление, а также переопределен метод: str и len. Они были переопределены для удобного представления хеш-таблицы и исследования ее методов.
2.3. Примеры использования реализованных классов и методов
Примеры использования представлены в табл. 1.
Таблица 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)'] |
Удаление. |
