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

ЛР1 Саляхов

.docx
Скачиваний:
0
Добавлен:
25.06.2025
Размер:
234.75 Кб
Скачать

ФГБОУ ВО

Уфимский университет науки и технологий

Кафедра ТК

Отчет по лабораторной работе №1

«Организация таблиц идентификаторов»

По дисциплине «Системное программное обеспечение»

Выполнил:

ст. гр. ИВТ-429Б

Саляхов А.Ф.

Проверил:

Доцент кафедры ТК

Ракипова А.С.

Уфа 2024

Цель: изучить основные методы организации таблиц идентификаторов, получить представление о преимуществах и недостатках, присущих различным методам организации таблиц идентификаторов.

  1. Задание

Для выполнения лабораторной работы требуется написать программу, которая получает на входе набор идентификаторов, организует таблицы идентификаторов с помощью заданных методов, позволяет осуществить многократный поиск произвольного идентификатора в таблицах и сравнить эффективность методов организации таблиц. Список идентификаторов считать заданным в виде текстового файла. Длина идентификаторов ограничена 32 символами.

Вариант 11:

  1. Метод цепочек.

  2. Упорядоченный список

  1. Схемы организации таблиц идентификаторов

    1. Упорядоченный список

Рисунок 1

    1. Метод цепочек

Рисунок 2

  1. Описание алгоритмов поиска в таблице идентификаторов

    1. Упорядоченный список

Рисунок 3

    1. Метод цепочек

Рисунок 4

  1. Текст программы

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()

  1. Результат обработки

Для размера таблицы 2000:

Для размера таблицы 200:

  1. Анализ эффективности используемых методов

Таблица сравнений:

Метод

Упорядоченный список

Метод цепочек

Для размера таблицы 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

Вывод

Метод цепочек значительно эффективнее как в процессе заполнения таблицы так и в процессе поиска как по временным показателям, так и по количеству сравнений.

Соседние файлы в предмете Системное программное обеспечение