Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по АиСД 2023 / Baraeva_Elizaveta_cw
.pdf
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
