2026-rff_mp/ivanchenkoam/laba1.txt

109 lines
3.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
import csv
import random
import sys
from typing import List, Tuple, Optional, Any, Dict
#лимит рекурсии
sys.setrecursionlimit(20000)
def ll_insert(head: Optional[Dict], name: str, phone: str) -> Dict:
"""Вставка в конец связного списка"""
new_node = {'name': name, 'phone': phone, 'next': None}
if head is None:
return new_node
current = head
while current['next'] is not None:
# Обновляем, если уже есть
if current['name'] == name:
current['phone'] = phone
return head
current = current['next']
if current['name'] == name:
current['phone'] = phone
else:
current['next'] = new_node
return head
def ll_find(head: Optional[Dict], name: str) -> Optional[str]:
"""Поиск в связном списке"""
current = head
while current is not None:
if current['name'] == name:
return current['phone']
current = current['next']
return None
def ll_delete(head: Optional[Dict], name: str) -> Optional[Dict]:
"""Удаление из связного списка"""
if head is None:
return None
if head['name'] == name:
return head['next']
current = head
while current['next'] is not None:
if current['next']['name'] == name:
current['next'] = current['next']['next']
return head
current = current['next']
return head
def ll_list_all(head: Optional[Dict]) -> List[Tuple[str, str]]:
"""Сбор всех записей из связного списка с сортировкой"""
records = []
current = head
while current is not None:
records.append((current['name'], current['phone']))
current = current['next']
def hash_function(name: str, size: int) -> int:
"""Простая хеш-функция"""
return sum(ord(c) for c in name) % size
def ht_create(size: int = 1000) -> List[Optional[Dict]]:
"""Создание хеш-таблицы"""
return [None] * size
def ht_insert(buckets: List[Optional[Dict]], name: str, phone: str) -> None:
"""Вставка в хеш-таблицу"""
index = hash_function(name, len(buckets))
buckets[index] = ll_insert(buckets[index], name, phone)
def ht_find(buckets: List[Optional[Dict]], name: str) -> Optional[str]:
"""Поиск в хеш-таблице"""
index = hash_function(name, len(buckets))
return ll_find(buckets[index], name)
def ht_delete(buckets: List[Optional[Dict]], name: str) -> None:
"""Удаление из хеш-таблицы"""
index = hash_function(name, len(buckets))
buckets[index] = ll_delete(buckets[index], name)
def ht_list_all(buckets: List[Optional[Dict]]) -> List[Tuple[str, str]]:
"""Сбор всех записей из хеш-таблицы с сортировкой"""
records = []
for head in buckets:
current = head
while current is not None:
records.append((current['name'], current['phone']))
current = current['next']
records.sort(key=lambda x: x[0])
return records
records.sort(key=lambda x: x[0])
return records