Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по АиСД 2023 / Baraeva_Elizaveta_cw

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
245 Кб
Скачать
11
3. ИССЛЕДОВАНИЕ СТРУКТУРЫ ДАННЫХ
3.1. Проведение экспериментов для оценки производительности
Для проведения исследования был реализован модуль, который позволял
исследовать функцию удаления на разных объемах данных (10, 100, 1000,
10000, 100000).
Для этого был импортирован файл со структурой данных и с помощи предварительного заполнения хеш-таблицы функцией вставки было
произведено удаления всех элементов в цикле. Было принято решение в
рассмотрении двух случаев: хорошего (удаление с начала связного списка) и плохого (удаление с конца связного списка), с размером таблицы 10 и 100.
Результаты исследования в табл. 2, табл. 3. Таблица 2 – Результаты исследования с размером 10
Количество элементов
Время выполнения (ms)
Худший случай
Время выполнения (ms)
Лучший случай
10
0.0
0.0
100
0.2
0.0
1000
1.9
1.0
10000
178.2
3.2
100000
74964.2
34.5
Таблица 3 – Результаты исследования с размером 100
Количество элементов
Время выполнения (ms)
Худший случай
Время выполнения (ms)
Лучший случай
10
0.0
0.0
100
0.0
0.0
1000
0.6
0.1
10000
20.9
3.0
100000
5029.9
33.3
3.2. Анализ полученных результатов
В теоретической оценке время выполнения функции удаления увеличивается линейно от количества данных. Полученный результаты близки
к теоретическим, так как время выполнения линейно увеличивается с
12
увеличением числа элементов. Явно эта разница становится видна в таблице на числах больше 10^4.
13
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсовой работы была реализована структура данных
– хеш-таблица, с методом решения коллизий с помощью цепочек. Для данной структуры были реализованы методы вставки, удаления, поиска значений. Был проведен теоретический анализ сложности разных методов. Также помимо реализации структуры, был проведет анализ ее эффективности. В результате
которого, стало понятно, что ее эффективность соответствует теоретическим
оценкам и время выполнения метода линейно зависит от количества элементов.
14
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Хеш-таблица – Википедия URL: https://ru.wikipedia.org/wiki/Хеш-таблица
2. Хеш-таблицы – CodeChick URL: https://codechick.io/tutorials/dsa/dsa-hash-
table
3. Hashing Data Structure GeeksForgeeks URL:
https://www.geeksforgeeks.org/hashing-data-structure/?ref=header_search
4. Разрешение коллизий Викиконспекты URL:
https://neerc.ifmo.ru/wiki/index.php?title=Разрешение_коллизий
15
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: main.py
class Node: def __init__(self, key, value): self.key = key self.value = value self.next = None
class HashTable: def __init__(self, capacity): self.capacity = capacity self.size = 0 self.table = [None] * capacity
def _hash(self, key): return hash(key) % self.capacity
def insert(self, key, value): index = self._hash(key) if self.table[index] is None: self.table[index] = Node(key, value) self.size += 1 else: new_node = Node(key, value) current = self.table[index] while current.next: if current.key == key: current.value = value return current = current.next if current.key == key: current.value = value return current.next = new_node self.size += 1
def search(self, key): index = self._hash(key) current = self.table[index] while current: if current.key == key: return current.value current = current.next raise KeyError(key)
def remove(self, key): index = self._hash(key) previous = None current = self.table[index] while current: if current.key == key: if previous: previous.next = current.next
16
else: self.table[index] = current.next self.size -= 1 return previous = current current = current.next raise KeyError(key)
def __str__(self): elements = [] for i in range(self.capacity): elements_str = '' current = self.table[i] if current is None: continue while current.next: elements_str += f'({current.key}, {current.value}) -> ' current = current.next elements_str += f'({current.key}, {current.value})' elements.append(elements_str) return str(elements)
def __len__(self): return self.size
17
ПРИЛОЖЕНИЕ Б ТЕСТИРОВАНИЕ
Название файла: test.py
import main
def test_insert(): 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) assert ht.__str__() == "['(0, 23) -> (4, 178)', '(1, 45) -> (9, 10) ­> (17, 64)', '(2, 7)', '(3, 99) -> (23, 67)']"
def test_search(): 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) assert ht.search(0) == 23 assert ht.search(1) == 45 assert ht.search(2) == 7 assert ht.search(3) == 99
def test_remove(): 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) assert ht.__str__() == "['(4, 178)', '(1, 45) -> (9, 10) -> (17,
64)', '(2, 7)', '(3, 99) -> (23, 67)']" ht.remove(4) assert ht.__str__() == "['(1, 45) -> (9, 10) -> (17, 64)', '(2, 7)', '(3, 99) -> (23, 67)']" ht.remove(23) assert ht.__str__() == "['(1, 45) -> (9, 10) -> (17, 64)', '(2, 7)', '(3, 99)']"
18
ht.remove(2) assert ht.__str__() == "['(1, 45) -> (9, 10) -> (17, 64)', '(3,
99)']"
Соседние файлы в папке Лабы по АиСД 2023