2026-rff_mp/osininyai/[1] data-structures/[1]MP_BST.py
2026-05-21 13:55:57 +03:00

384 lines
14 KiB
Python
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.

from MP_records import records
import random as rd
import time
import csv
import codecs
import sys
sys.setrecursionlimit(15000)
def bst_insert(root,name,phone):
if root==None:
entry={"name":name,"phone":phone,"left":None,"right":None}
root=entry
return root
else:
entry={"name":name,"phone":phone,"left":None,"right":None}
if root["phone"]==phone:
root["name"]=name
return root
else:
if (name.encode())<(root["name"].encode()):
if root["left"]==None:
root["left"]=entry
else:
bst_insert(root["left"], name, phone)
else:
if root["right"]==None:
root["right"]=entry
else:
bst_insert(root["right"], name, phone)
def bst_find(root, name):
a=None
if root!=None:
if root["name"]==name:
return root["phone"]
else:
if (name.encode())>(root["name"].encode()) and root["right"]:
a=bst_find(root["right"], name)
elif root["left"] and a==None:
a=bst_find(root["left"], name)
return a
def bst_delete(root,name):
while root["name"]!=name:
if (name.encode())>(root["name"].encode()):
if root["right"]==None:
#print("None")
return
else:
if root["right"]["name"]==name and root["right"]["right"]==None and root["right"]["left"]==None:
root["right"]=None
return
root=root["right"]
else:
if root["left"]==None:
#print("None")
return
else:
if root["left"]["name"]==name and root["left"]["right"]==None and root["left"]["left"]==None:
root["left"]=None
return
root=root["left"]
if root["right"]:
root1=root["right"]
if root1["left"]:
if root1["left"]["left"]:
while root1["left"]["left"]:
root1=root1["left"]
root2=root1["left"]
else:
root2=root1["left"]
else:
root["name"]=root1["name"]
root["phone"]=root1["phone"]
root["right"]=root1["right"]
return
if root2["right"]:
root["name"]=root2["name"]
root["phone"]=root2["phone"]
root1["left"]=root2["right"]
return
#del root2
else:
root["name"]=root2["name"]
root["phone"]=root2["phone"]
root1["left"]=None
#print(root1.right.data)
return
elif root["left"]:
temp=root["left"]["left"]
root["name"]=root["left"]["name"]
root["phone"]=root["left"]["phone"]
root["right"]=root["left"]["right"]
root["left"]=temp
return
def bst_list_all(root):
if root["left"]:
bst_list_all(root["left"])
print(root["name"]," - ",root["phone"])
if root["right"]:
bst_list_all(root["right"])
def test():
root=None
root=bst_insert(root,"Abba",1)
bst_insert(root,"Babba",2)
bst_insert(root,"Cabba",3)
bst_insert(root,"Aaaaa",4)
bst_insert(root,"Abfga",5)
bst_insert(root,"Arte",6)
bst_insert(root,"Aaxa",7)
bst_insert(root,"Aaax",8)
bst_insert(root,"Aaxx",9)
print(root)
print(bst_find(root, "Aaaaa"))
print(bst_find(root, "Aaxx"))
print(bst_find(root, "Aaax"))
print(bst_find(root, "Babba"))
print(bst_find(root, "Cabba"))
print(bst_find(root, "Arte"))
print(bst_find(root, "Aaxa"))
print(bst_find(root, "Abba"))
print(bst_find(root, "Abfga"))
print(bst_find(root, "Abb"))
#bst_delete(root, "Cabba")
print(root)
bst_list_all(root)
def run_shuffled(records_shuffled):
insertion_times=[]
finding_times=[]
deletion_times1=[]
print("Shuffled list: ")
for k in range(5):
lisst=None
#А. Вставка всех записей
start=time.perf_counter()
lisst=bst_insert(lisst, records_shuffled[0][0], records_shuffled[0][1])
for i in range(1,len(records_shuffled)):
bst_insert(lisst, records_shuffled[i][0], records_shuffled[i][1])
end=time.perf_counter()
insertion_times.append(end-start)
#Б. Поиск 100 случайных записей
names=[]
index=rd.randint(0,9899)
for i in range(100):
names.append(records_shuffled[index][0])
index+=1
for i in range(10):
names.append("A")
rd.shuffle(names)
start=time.perf_counter()
for i in range(len(names)):
bst_find(lisst,names[i])
end=time.perf_counter()
finding_times.append(end-start)
#В. Удаление 50 случайных записей
for i in range(10):
names.remove("A")
rd.shuffle(names)
deletion_times=[]
for i in range(50):
start=time.perf_counter()
bst_delete(lisst,names[i])
end=time.perf_counter()
ttt=end-start
deletion_times.append(ttt)
deletion_times1.append(deletion_times)
print("Run number ",k+1)
print("Insertion time: ",insertion_times[k])
print("Finding time: ",finding_times[k])
print("Deletion times: ","\n",deletion_times)
print("\n")
temp=0
for i in range(5):
temp+=insertion_times[i]
temp=temp/5
results = [
[u"Структура", u"Режим", u"Операция", u"Время (сек)"],
["BinarySearchTree", u"случайный", u"вставка", insertion_times[0]],
["BinarySearchTree", u"случайный", u"вставка", insertion_times[1]],
["BinarySearchTree", u"случайный", u"вставка", insertion_times[2]],
["BinarySearchTree", u"случайный", u"вставка", insertion_times[3]],
["BinarySearchTree", u"случайный", u"вставка", insertion_times[4]],
[u"Структура", u"Режим", u"Операция", u"Среднее время (сек)"],
["BinarySearchTree", u"случайный", u"вставка", temp,]
]
with codecs.open("results.csv", "a+", "utf-16") as f:
writer = csv.writer(f)
writer.writerows(results)
writer.writerows("\n")
temp=0
for i in range(5):
temp+=finding_times[i]
temp=temp/5
results = [
[u"Структура", u"Режим", u"Операция", u"Время (сек)"],
["BinarySearchTree", u"случайный", u"поиск", finding_times[0]],
["BinarySearchTree", u"случайный", u"поиск", finding_times[1]],
["BinarySearchTree", u"случайный", u"поиск", finding_times[2]],
["BinarySearchTree", u"случайный", u"поиск", finding_times[3]],
["BinarySearchTree", u"случайный", u"поиск", finding_times[4]],
[u"Структура", u"Режим", u"Операция", u"Среднее время (сек)"],
["BinarySearchTree", u"случайный", u"поиск", temp,]
]
with codecs.open("results.csv", "a+", "utf-16") as f:
writer = csv.writer(f)
writer.writerows(results)
writer.writerows("\n")
temp=0
del_times=[]
for i in range(5):
for j in range(50):
temp+=deletion_times1[i][j]
temp=temp/50
del_times.append(temp)
temp=0
temp=0
for i in range(5):
temp+=del_times[i]
temp=temp/5
results = [
[u"Структура", u"Режим", u"Операция", u"Время (сек)"],
["BinarySearchTree", u"случайный", u"удаление", del_times[0]],
["BinarySearchTree", u"случайный", u"удаление", del_times[1]],
["BinarySearchTree", u"случайный", u"удаление", del_times[2]],
["BinarySearchTree", u"случайный", u"удаление", del_times[3]],
["BinarySearchTree", u"случайный", u"удаление", del_times[4]],
[u"Структура", u"Режим", u"Операция", u"Среднее время (сек)"],
["BinarySearchTree", u"случайный", u"удаление", temp,]
]
with codecs.open("results.csv", "a+", "utf-16") as f:
writer = csv.writer(f)
writer.writerows(results)
writer.writerows("\n")
writer.writerows("\n")
def run_sorted(records_shuffled):
insertion_times=[]
finding_times=[]
deletion_times1=[]
print("Sorted list: ")
for k in range(5):
lisst=None
#А. Вставка всех записей
start=time.perf_counter()
lisst=bst_insert(lisst, records_shuffled[0][0], records_shuffled[0][1])
for i in range(1,len(records_shuffled)):
bst_insert(lisst, records_shuffled[i][0], records_shuffled[i][1])
end=time.perf_counter()
insertion_times.append(end-start)
#Б. Поиск 100 случайных записей
names=[]
index=rd.randint(0,9899)
for i in range(100):
names.append(records_shuffled[index][0])
index+=1
for i in range(10):
names.append("A")
rd.shuffle(names)
start=time.perf_counter()
for i in range(len(names)):
bst_find(lisst,names[i])
end=time.perf_counter()
finding_times.append(end-start)
#В. Удаление 50 случайных записей
for i in range(10):
names.remove("A")
rd.shuffle(names)
deletion_times=[]
for i in range(50):
start=time.perf_counter()
bst_delete(lisst,names[i])
end=time.perf_counter()
ttt=end-start
deletion_times.append(ttt)
deletion_times1.append(deletion_times)
print("Run number ",k+1)
print("Insertion time: ",insertion_times[k])
print("Finding time: ",finding_times[k])
print("Deletion times: ","\n",deletion_times)
print("\n")
temp=0
for i in range(5):
temp+=insertion_times[i]
temp=temp/5
results = [
[u"Структура", u"Режим", u"Операция", u"Время (сек)"],
["BinarySearchTree", u"отсортированный", u"вставка", insertion_times[0]],
["BinarySearchTree", u"отсортированный", u"вставка", insertion_times[1]],
["BinarySearchTree", u"отсортированный", u"вставка", insertion_times[2]],
["BinarySearchTree", u"отсортированный", u"вставка", insertion_times[3]],
["BinarySearchTree", u"сотсортированный", u"вставка", insertion_times[4]],
[u"Структура", u"Режим", u"Операция", u"Среднее время (сек)"],
["BinarySearchTree", u"отсортированный", u"вставка", temp,]
]
with codecs.open("results.csv", "a+", "utf-16") as f:
writer = csv.writer(f)
writer.writerows(results)
writer.writerows("\n")
temp=0
for i in range(5):
temp+=finding_times[i]
temp=temp/5
results = [
[u"Структура", u"Режим", u"Операция", u"Время (сек)"],
["BinarySearchTree", u"отсортированный", u"поиск", finding_times[0]],
["BinarySearchTree", u"отсортированный", u"поиск", finding_times[1]],
["BinarySearchTree", u"отсортированный", u"поиск", finding_times[2]],
["BinarySearchTree", u"отсортированный", u"поиск", finding_times[3]],
["BinarySearchTree", u"отсортированный", u"поиск", finding_times[4]],
[u"Структура", u"Режим", u"Операция", u"Среднее время (сек)"],
["BinarySearchTree", u"отсортированный", u"поиск", temp,]
]
with codecs.open("results.csv", "a+", "utf-16") as f:
writer = csv.writer(f)
writer.writerows(results)
writer.writerows("\n")
temp=0
del_times=[]
for i in range(5):
for j in range(50):
temp+=deletion_times1[i][j]
temp=temp/50
del_times.append(temp)
temp=0
temp=0
for i in range(5):
temp+=del_times[i]
temp=temp/5
results = [
[u"Структура", u"Режим", u"Операция", u"Время (сек)"],
["BinarySearchTree", u"отсортированный", u"удаление", del_times[0]],
["BinarySearchTree", u"отсортированный", u"удаление", del_times[1]],
["BinarySearchTree", u"отсортированный", u"удаление", del_times[2]],
["BinarySearchTree", u"отсортированный", u"удаление", del_times[3]],
["BinarySearchTree", u"отсортированный", u"удаление", del_times[4]],
[u"Структура", u"Режим", u"Операция", u"Среднее время (сек)"],
["BinarySearchTree", u"отсортированный", u"удаление", temp,]
]
with codecs.open("results.csv", "a+", "utf-16") as f:
writer = csv.writer(f)
writer.writerows(results)
writer.writerows("\n")
writer.writerows("\n")
records_shuffled, records_sorted = records()
run_shuffled(records_shuffled)
run_sorted(records_sorted)