[2] 1-st_ex

This commit is contained in:
agafonovdm 2026-05-25 12:56:25 +03:00
parent 057dfb01af
commit 153f2a092c
2 changed files with 109 additions and 49 deletions

View File

@ -1,6 +1,11 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import time
import random
import csv
import sys
sys.setrecursionlimit(30000)
def ll_create_node(name, phone):
return {'name': name, 'phone': phone, 'next': None}
@ -59,7 +64,7 @@ def ll_list_all(head):
def hash_function(name, table_size):
return sum(ord(c) for c in name) % table_size
def ht_create_table(size=1000):
def ht_create_table(size=2000):
return [None] * size
def ht_insert(table, name, phone):
@ -92,25 +97,36 @@ def bst_insert(root, name, phone):
if root is None:
return bst_create_node(name, phone)
if name < root['name']:
root['left'] = bst_insert(root['left'], name, phone)
elif name > root['name']:
root['right'] = bst_insert(root['right'], name, phone)
else:
root['phone'] = phone
current = root
while True:
if name < current['name']:
if current['left'] is None:
current['left'] = bst_create_node(name, phone)
break
else:
current = current['left']
elif name > current['name']:
if current['right'] is None:
current['right'] = bst_create_node(name, phone)
break
else:
current = current['right']
else:
current['phone'] = phone
break
return root
def bst_find(root, name):
if root is None:
return None
if name < root['name']:
return bst_find(root['left'], name)
elif name > root['name']:
return bst_find(root['right'], name)
else:
return root['phone']
current = root
while current is not None:
if name < current['name']:
current = current['left']
elif name > current['name']:
current = current['right']
else:
return current['phone']
return None
def bst_find_min(node):
current = node
@ -122,34 +138,63 @@ def bst_delete(root, name):
if root is None:
return None
if name < root['name']:
root['left'] = bst_delete(root['left'], name)
elif name > root['name']:
root['right'] = bst_delete(root['right'], name)
else:
if root['left'] is None:
return root['right']
elif root['right'] is None:
return root['left']
parent = None
current = root
while current is not None and current['name'] != name:
parent = current
if name < current['name']:
current = current['left']
else:
current = current['right']
if current is None:
return root
if current['left'] is None or current['right'] is None:
if current['left'] is not None:
child = current['left']
else:
child = current['right']
min_node = bst_find_min(root['right'])
root['name'] = min_node['name']
root['phone'] = min_node['phone']
root['right'] = bst_delete(root['right'], min_node['name'])
if parent is None:
return child
if parent['left'] == current:
parent['left'] = child
else:
parent['right'] = child
else:
successor_parent = current
successor = current['right']
while successor['left'] is not None:
successor_parent = successor
successor = successor['left']
current['name'] = successor['name']
current['phone'] = successor['phone']
if successor_parent['left'] == successor:
successor_parent['left'] = successor['right']
else:
successor_parent['right'] = successor['right']
return root
def bst_list_all(root):
records = []
stack = []
current = root
def inorder(node):
if node is None:
return
inorder(node['left'])
records.append((node['name'], node['phone']))
inorder(node['right'])
while stack or current is not None:
while current is not None:
stack.append(current)
current = current['left']
current = stack.pop()
records.append((current['name'], current['phone']))
current = current['right']
inorder(root)
return records
def generate_data(n=10000):
@ -162,11 +207,7 @@ def generate_data(n=10000):
def run_experiment(structure_name, insert_func, find_func, delete_func,
list_all_func, init_func, records, n_find=100):
if structure_name == "HashTable":
data = init_func(1000)
else:
data = init_func()
data = init_func()
names = [r[0] for r in records]
start = time.perf_counter()
@ -201,22 +242,22 @@ def run_experiment(structure_name, insert_func, find_func, delete_func,
return insert_time, find_time, delete_time
def main():
print("Генерация тестовых данных...")
print("Generating test data...")
records_shuffled, records_sorted = generate_data(10000)
results = []
structures = [
("LinkedList", ll_insert, ll_find, ll_delete, ll_list_all, lambda: None),
("HashTable", ht_insert, ht_find, ht_delete, ht_list_all, lambda: ht_create_table(1000)),
("HashTable", ht_insert, ht_find, ht_delete, ht_list_all, lambda: ht_create_table(2000)),
("BST", bst_insert, bst_find, bst_delete, bst_list_all, lambda: None)
]
for mode_name, records in [("random", records_shuffled), ("sorted", records_sorted)]:
print(f"\nРежим: {mode_name}")
print(f"\nMode: {mode_name}")
for struct_name, insert_f, find_f, delete_f, list_f, init_f in structures:
print(f" Тестирование {struct_name}...")
print(f" Testing {struct_name}...")
times = []
for run in range(5):
@ -224,7 +265,7 @@ def main():
struct_name, insert_f, find_f, delete_f, list_f, init_f, records
)
times.append((insert_t, find_t, delete_t))
print(f" Запуск {run+1}: вставка={insert_t:.4f}s, поиск={find_t:.4f}s, удаление={delete_t:.4f}s")
print(f" Run {run+1}: insert={insert_t:.4f}s, find={find_t:.4f}s, delete={delete_t:.4f}s")
avg_insert = sum(t[0] for t in times) / 5
avg_find = sum(t[1] for t in times) / 5
@ -240,12 +281,12 @@ def main():
writer.writerows(results)
print("\n" + "="*60)
print("РЕЗУЛЬТАТЫ (среднее за 5 запусков):")
print("RESULTS (average over 5 runs):")
print("="*60)
for row in results:
print(f"{row[0]:12} | {row[1]:8} | {row[2]:8} | {row[3]:.6f} сек")
print(f"{row[0]:12} | {row[1]:8} | {row[2]:8} | {row[3]:.6f} sec")
print("\nРезультаты сохранены в results.csv")
print("\nResults saved to results.csv")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,19 @@
Structure,Mode,Operation,Time_seconds
LinkedList,random,insert,3.115811080000276
LinkedList,random,find,0.02396312000018952
LinkedList,random,delete,0.016048219999720458
HashTable,random,insert,0.18448304000012286
HashTable,random,find,0.0012929600005008978
HashTable,random,delete,0.0009329200001957361
BST,random,insert,0.017231119999996734
BST,random,find,0.00014155999961076304
BST,random,delete,9.299999983340968e-05
LinkedList,sorted,insert,2.780292439999903
LinkedList,sorted,find,0.02136590000045544
LinkedList,sorted,delete,0.014907859999584615
HashTable,sorted,insert,0.16707750000023225
HashTable,sorted,find,0.0012113199998566415
HashTable,sorted,delete,0.0008899600001313956
BST,sorted,insert,3.844869280000421
BST,sorted,find,0.031808019999880345
BST,sorted,delete,0.016554539999560802
1 Structure Mode Operation Time_seconds
2 LinkedList random insert 3.115811080000276
3 LinkedList random find 0.02396312000018952
4 LinkedList random delete 0.016048219999720458
5 HashTable random insert 0.18448304000012286
6 HashTable random find 0.0012929600005008978
7 HashTable random delete 0.0009329200001957361
8 BST random insert 0.017231119999996734
9 BST random find 0.00014155999961076304
10 BST random delete 9.299999983340968e-05
11 LinkedList sorted insert 2.780292439999903
12 LinkedList sorted find 0.02136590000045544
13 LinkedList sorted delete 0.014907859999584615
14 HashTable sorted insert 0.16707750000023225
15 HashTable sorted find 0.0012113199998566415
16 HashTable sorted delete 0.0008899600001313956
17 BST sorted insert 3.844869280000421
18 BST sorted find 0.031808019999880345
19 BST sorted delete 0.016554539999560802