2026-05-21 10:43:45 +00:00
|
|
|
|
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,]
|
|
|
|
|
|
]
|
|
|
|
|
|
|
2026-05-21 17:55:03 +00:00
|
|
|
|
with codecs.open("docs/data/[1]results.csv", "a+", "utf-16") as f:
|
2026-05-21 10:43:45 +00:00
|
|
|
|
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,]
|
|
|
|
|
|
]
|
|
|
|
|
|
|
2026-05-21 17:55:03 +00:00
|
|
|
|
with codecs.open("docs/data/[1]results.csv", "a+", "utf-16") as f:
|
2026-05-21 10:43:45 +00:00
|
|
|
|
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,]
|
|
|
|
|
|
]
|
|
|
|
|
|
|
2026-05-21 17:55:03 +00:00
|
|
|
|
with codecs.open("docs/data/[1]results.csv", "a+", "utf-16") as f:
|
2026-05-21 10:43:45 +00:00
|
|
|
|
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,]
|
|
|
|
|
|
]
|
|
|
|
|
|
|
2026-05-21 17:55:03 +00:00
|
|
|
|
with codecs.open("docs/data/[1]results.csv", "a+", "utf-16") as f:
|
2026-05-21 10:43:45 +00:00
|
|
|
|
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,]
|
|
|
|
|
|
]
|
|
|
|
|
|
|
2026-05-21 17:55:03 +00:00
|
|
|
|
with codecs.open("docs/data/[1]results.csv", "a+", "utf-16") as f:
|
2026-05-21 10:43:45 +00:00
|
|
|
|
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,]
|
|
|
|
|
|
]
|
|
|
|
|
|
|
2026-05-21 17:55:03 +00:00
|
|
|
|
with codecs.open("docs/data/[1]results.csv", "a+", "utf-16") as f:
|
2026-05-21 10:43:45 +00:00
|
|
|
|
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)
|