
ЛР1 Саляхов
.docxФГБОУ ВО
Уфимский университет науки и технологий
Кафедра ТК
Отчет по лабораторной работе №1
«Организация таблиц идентификаторов»
По дисциплине «Системное программное обеспечение»
Выполнил:
ст. гр. ИВТ-429Б
Саляхов А.Ф.
Проверил:
Доцент кафедры ТК
Ракипова А.С.
Уфа 2024
Цель: изучить основные методы организации таблиц идентификаторов, получить представление о преимуществах и недостатках, присущих различным методам организации таблиц идентификаторов.
Задание
Для выполнения лабораторной работы требуется написать программу, которая получает на входе набор идентификаторов, организует таблицы идентификаторов с помощью заданных методов, позволяет осуществить многократный поиск произвольного идентификатора в таблицах и сравнить эффективность методов организации таблиц. Список идентификаторов считать заданным в виде текстового файла. Длина идентификаторов ограничена 32 символами.
Вариант 11:
Метод цепочек.
Упорядоченный список
Схемы организации таблиц идентификаторов
Упорядоченный список
Рисунок 1
Метод цепочек
Рисунок 2
Описание алгоритмов поиска в таблице идентификаторов
Упорядоченный список
Рисунок 3
Метод цепочек
Рисунок 4
Текст программы
import time import random import string class HashTable: def __init__(self, size): self.size = size self.table = [[] for _ in range(size)] self.comparisons_insert = 0 self.comparisons_search = 0 def hash(self, key): hash_value = sum(ord(char) for char in key) % self.size return hash_value def insert(self, key): index = self.hash(key) if key not in self.table[index]: # Проверка на дубликаты self.comparisons_insert += 1 self.table[index].append(key) else: self.comparisons_insert += 1 # Сравнение с существующими элементами def search(self, key): index = self.hash(key) self.comparisons_search += 1 # Сравнение индекса for item in self.table[index]: self.comparisons_search += 1 # Сравнение с каждым элементом в цепочке if item == key: return True return False def clear(self): self.table = [[] for _ in range(self.size)] self.comparisons_insert = 0 self.comparisons_search = 0 def __str__(self): return "\n".join(f"Индекс {i}: {bucket}" for i, bucket in enumerate(self.table)) class ListNode: def __init__(self, key): self.val = key self.next = None class OrderedList: def __init__(self): self.head = None self.comparisons_insert = 0 self.comparisons_search = 0 def insert(self, key): self.comparisons_insert += 1 new_node = ListNode(key) if self.head is None or key < self.head.val: new_node.next = self.head self.head = new_node return current = self.head while current.next is not None and current.next.val < key: self.comparisons_insert += 1 current = current.next new_node.next = current.next current.next = new_node def search(self, key): current = self.head while current is not None: self.comparisons_search += 1 if current.val == key: return True elif key < current.val: return False current = current.next return False def clear(self): self.head = None self.comparisons_insert = 0 self.comparisons_search = 0 def __str__(self): current = self.head elements = [] while current: elements.append(current.val) current = current.next return " -> ".join(elements) def generate_identifiers(count): identifiers = [] for _ in range(count): # Генерируем первый символ (буква) first_char = random.choice(string.ascii_letters) # Генерируем остальные 31 символ (буквы и цифры) other_chars = ''.join(random.choices(string.ascii_letters + string.digits, k=31)) # Объединяем первый символ и остальные символы identifier = first_char + other_chars identifiers.append(identifier) return identifiers # def generate_identifiers(count): # identifiers = [] # for _ in range(count): # identifier = ''.join(random.choices(string.ascii_letters + string.digits, k=32)) # identifiers.append(identifier) # return identifiers def main(): try: count = int(input("Введите количество генерируемых идентификаторов: ")) if count <= 0: raise ValueError("Количество должно быть положительным.") except ValueError as e: print("Ошибка ввода:", e) return identifiers = generate_identifiers(count) # Генерация идентификаторов # Хеш-таблица hash_table = HashTable(size=count // 2) # Вставка в хеш-таблицу start_time = time.time() for identifier in identifiers: hash_table.insert(identifier) insert_time_hash = time.time() - start_time # Поиск в хеш-таблице start_time = time.time() for identifier in identifiers: hash_table.search(identifier) search_time_hash = time.time() - start_time # Упорядоченный список ordered_list = OrderedList() # Вставка в упорядоченный список start_time = time.time() for identifier in identifiers: ordered_list.insert(identifier) insert_time_list = time.time() - start_time # Поиск в упорядоченном списке start_time = time.time() for identifier in identifiers: ordered_list.search(identifier) search_time_list = time.time() - start_time while True: print("\nВыберите действие:") print("1. Вывести хеш-таблицу") print("2. Вывести упорядоченный список") print("3. Вывести статистику вставки и поиска") print("4. Поиск конкретного идентификатора") print("5. Выход") choice = input("Введите номер действия (1-5): ") if choice == '1': print("\nХеш-таблица:") print(hash_table) elif choice == '2': print("\nУпорядоченный список:") print(ordered_list) elif choice == '3': print("\nСтатистики:") print("Хеш-таблица:") print(f"Время вставки: {insert_time_hash:.6f} сек") print(f"Сравнений при вставке: {hash_table.comparisons_insert}") print(f"Время поиска: {search_time_hash:.6f} сек") print(f"Сравнений при поиске: {hash_table.comparisons_search}") print("\nУпорядоченный список:") print(f"Время вставки: {insert_time_list:.6f} сек") print(f"Сравнений при вставке: {ordered_list.comparisons_insert}") print(f"Время поиска: {search_time_list:.6f} сек") print(f"Сравнений при поиске: {ordered_list.comparisons_search}") elif choice == '4': search_key = input("Введите идентификатор для поиска: ") # Поиск в хеш-таблице hash_table.comparisons_search = 0 found_in_hash = hash_table.search(search_key) print("\nРезультаты поиска в хеш-таблице:") print(f"Найден: {found_in_hash}") print(f"Сравнений при поиске: {hash_table.comparisons_search}") print(f"Время поиска: {search_time_hash:.6f} сек") # Поиск в упорядоченном списке ordered_list.comparisons_search = 0 found_in_list = ordered_list.search(search_key) print("\nРезультаты поиска в упорядоченном списке:") print(f"Найден: {found_in_list}") print(f"Сравнений при поиске: {ordered_list.comparisons_search}") print(f"Время поиска: {search_time_list:.6f} сек") elif choice == '5': print("Выход...") break else: print("Неверный ввод, попробуйте снова.") if __name__ == "__main__": main()
Результат обработки
Для размера таблицы 2000:
Для размера таблицы 200:
Анализ эффективности используемых методов
Таблица сравнений:
Метод |
Упорядоченный список |
Метод цепочек |
Для размера таблицы 2000 |
||
Время на заполнение |
0,387 |
0,014 |
Время на поиск |
0,804 |
0,015997 |
Количество сравнений при заполнении |
989037 |
2000 |
Количество сравнений при поиске |
2001000 |
8838 |
Для размера таблицы 100 |
||
Время на заполнение |
0,004 |
0,001014 |
Время на поиск |
0,007041 |
0,000977 |
Количество сравнений при заполнении |
10302 |
200 |
Количество сравнений при поиске |
20100 |
604 |
Вывод
Метод цепочек значительно эффективнее как в процессе заполнения таблицы так и в процессе поиска как по временным показателям, так и по количеству сравнений.