Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по АиСД 2023 / Baraeva_Elizaveta_cw.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
140 Кб
Скачать

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)']

Удаление.

Соседние файлы в папке Лабы по АиСД 2023