- •Лабораторная работа №1 «Методы сортировки» Вариант №12 «Пирамидальная сортировка»
- •Лабораторная работа №2 «Методы поиска» Вариант №12 «Метод цепочек»
- •Лабораторная работа №3 «Методы поиска подстроки в строке» Вариант №12 «Кнута-Морриса-Прата»
- •Лабораторная работа №5 «Рекурсия. Фракталы.» Вариант №10 «Салфетка Серпинского»
Лабораторная работа №2 «Методы поиска» Вариант №12 «Метод цепочек»
Цель работы:
Реализовать заданный метод поиска в соответствии с индивидуальным заданием. Организовать генерацию начального набора случайных данных. Для всех вариантов добавить реализацию добавления, поиска и удаления элементов. Оценить время работы каждого алгоритма поиска и сравнить его со временем работы стандартной функции поиска, используемой в выбранном языке программирования.
Ход работы:
Для реализации целей лабораторной работы выбрала язык программирования Python. Для поиска методом цепочек я использовала хэш-таблицы:
def __init__(self, size): self.size = size self.table = [[] for _ in range(size)]
Заполняю таблицу случайными значениями, количество которых регулируется введенными значениями:
def generate_random_data(size): keys = random.sample(range(1, size * 10), size) values = [random.randint(1, 100) for _ in range(size)] return list(zip(keys, values))
Создаём функции удаления, вставки и поиска значений:
def insert(self, key, value): index = self._hash(key) for kvp in self.table[index]: if kvp[0] == key: kvp[1] = value return self.table[index].append([key, value]) def search(self, key): index = self._hash(key) for kvp in self.table[index]: if kvp[0] == key: return kvp[1] return None def delete(self, key): index = self._hash(key) for i, kvp in enumerate(self.table[index]): if kvp[0] == key: del self.table[index][i] return raise KeyError(f"Key {key} not found")
Проводим замеры поиска при помощи Метода цепочек и стандартного функционала Python:
search_time = measure_time(lambda: [hash_table.search(k) for k, _ in data]) print(f"Время поиска {size} элементов в хэш-таблице: {search_time:.2f} мкс")
dict_search_time = measure_time(lambda: [python_dict.get(k) for k, _ in data]) print(f"Время поиска {size} элементов в словаре Python: {dict_search_time:.2f} мкс")
Результаты замеров:
Размер массива |
Метод цепочек, мс |
Стандартный Python, мс |
10000 |
1.99 |
1 |
100000 |
31.77 |
12.88 |
1000000 |
496.68 |
83.64 |
Код программы:
import time import random class HashTable: def __init__(self, size): self.size = size self.table = [[] for _ in range(size)] def _hash(self, key): return hash(key) % self.size def insert(self, key, value): index = self._hash(key) for kvp in self.table[index]: if kvp[0] == key: kvp[1] = value return self.table[index].append([key, value]) def search(self, key): index = self._hash(key) for kvp in self.table[index]: if kvp[0] == key: return kvp[1] return None def delete(self, key): index = self._hash(key) for i, kvp in enumerate(self.table[index]): if kvp[0] == key: del self.table[index][i] return raise KeyError(f"Key {key} not found") def generate_random_data(size): keys = random.sample(range(1, size * 10), size) values = [random.randint(1, 100) for _ in range(size)] return list(zip(keys, values)) def measure_time(func, *args): start_time = time.time() func(*args) return (time.time() - start_time) * 1000 def run_test(size): data = generate_random_data(size) hash_table = HashTable(size) python_dict = {} search_time = measure_time(lambda: [hash_table.search(k) for k, _ in data]) print(f"Время поиска {size} элементов в хэш-таблице: {search_time:.2f} мс") dict_search_time = measure_time(lambda: [python_dict.get(k) for k, _ in data]) print(f"Время поиска {size} элементов в словаре Python: {dict_search_time:.2f} мс") print("-" * 60) def main(): for i in range(3): size = int(input(f"Введите размер массива для теста {i + 1}: ")) run_test(size) if __name__ == "__main__": main()
Вывод:
В связи с произведенными испытаниями производительности функции поиска при помощи Метода цепочек и последующем сравнением с основной функцией языка программирования Python можно подвести вывод. Хэш-таблица с методом цепочек успешно справляется с задачами вставки, поиска и удаления элементов, но уступает по производительности встроенному словарю Python.
