Исправлены ошибки программы тестирования, проведены завмеры
This commit is contained in:
parent
edea3cf379
commit
ffb0de63df
|
|
@ -106,16 +106,6 @@ def sorten(arr):
|
||||||
arr[j], arr[j + 1] = arr[j + 1], arr[j]
|
arr[j], arr[j + 1] = arr[j + 1], arr[j]
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
|
|
||||||
# linklist = None
|
|
||||||
# linklist = ll_insert(linklist, 'Sjora', '123')
|
|
||||||
# linklist = ll_insert(linklist, 'Vlad', '0000')
|
|
||||||
# linklist = ll_insert(linklist, 'Dima', '228')
|
|
||||||
|
|
||||||
# print(linklist)
|
|
||||||
# print(ll_find(linklist, 'Vlad'))
|
|
||||||
# print(ll_delete(linklist, 'Dima'))
|
|
||||||
# print(ll_list_all(linklist))
|
|
||||||
|
|
||||||
# HashTable (Хранится как список buckets фиксированной длины, каждый элемент — голова связного списка (или None))
|
# HashTable (Хранится как список buckets фиксированной длины, каждый элемент — голова связного списка (или None))
|
||||||
|
|
||||||
def hash_table(size):
|
def hash_table(size):
|
||||||
|
|
@ -172,12 +162,6 @@ def ht_list_all(buckets):
|
||||||
sorten(full_data)
|
sorten(full_data)
|
||||||
return full_data
|
return full_data
|
||||||
|
|
||||||
# Hash_table1 = hash_table(3)
|
|
||||||
# ht_insert(Hash_table1, 'Vlad', '000')
|
|
||||||
# ht_insert(Hash_table1, 'Dima', '111')
|
|
||||||
# ht_insert(Hash_table1, 'Sjora', '222')
|
|
||||||
|
|
||||||
# print(ht_list_all(Hash_table1))
|
|
||||||
|
|
||||||
# Двоичное дерево поиска : Узел — словарь: {'name': 'Имя', 'phone': '123', 'left': None, 'right': None}
|
# Двоичное дерево поиска : Узел — словарь: {'name': 'Имя', 'phone': '123', 'left': None, 'right': None}
|
||||||
|
|
||||||
|
|
@ -233,23 +217,26 @@ def bst_delete(root, name):
|
||||||
|
|
||||||
# стоим в нужном узле
|
# стоим в нужном узле
|
||||||
else:
|
else:
|
||||||
# если у узла нет наследников
|
# узла слева нет (вернет правого ребенка или None)
|
||||||
if root['left'] is None and root['right'] is None:
|
if root['left'] is None:
|
||||||
# обрываем связь
|
return root['right']
|
||||||
return None
|
|
||||||
# если только один наследник
|
# узла справа нет (вернет левого ребенка)
|
||||||
elif root['left'] is None != root['right'] is None:
|
if root['right'] is None:
|
||||||
return root['left'] or root['right']
|
return root['left']
|
||||||
|
|
||||||
# два наследника (поиск минимального поддерева в правой ветке)
|
# два наследника (поиск минимального поддерева в правой ветке)
|
||||||
|
|
||||||
successor = root['right']
|
successor = root['right']
|
||||||
while successor['left'] is not None:
|
while successor['left'] is not None:
|
||||||
successor = root['left']
|
successor = successor['left']
|
||||||
|
|
||||||
root['name'] = successor['name']
|
root['name'] = successor['name']
|
||||||
root['phone'] = successor['phone']
|
root['phone'] = successor['phone']
|
||||||
# Удаляем дубликат преемника в правом поддереве
|
# Удаляем дубликат преемника в правом поддереве
|
||||||
root['right'] = bst_delete(root['right'], successor['name'])
|
root['right'] = bst_delete(root['right'], successor['name'])
|
||||||
|
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -263,13 +250,3 @@ def bst_list_all(root, result=None):
|
||||||
result.append((root['name'], root['phone']))
|
result.append((root['name'], root['phone']))
|
||||||
bst_list_all(root['right'], result)
|
bst_list_all(root['right'], result)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
# derevo = None
|
|
||||||
# derevo = bst_insert(derevo, 'Vlad', '000')
|
|
||||||
# derevo = bst_insert(derevo, 'Dima', '111')
|
|
||||||
# derevo = bst_insert(derevo, 'Sjora', '222')
|
|
||||||
# derevo = bst_insert(derevo, 'weid', '0')
|
|
||||||
|
|
||||||
# # print(derevo)
|
|
||||||
# # derevo = bst_delete(derevo, 'Vlad')
|
|
||||||
# print(bst_list_all(derevo))
|
|
||||||
|
|
|
||||||
|
|
@ -24,19 +24,19 @@ def create_data(n=100):
|
||||||
phone = phone_number_generate()
|
phone = phone_number_generate()
|
||||||
records_sorted.append((name, phone))
|
records_sorted.append((name, phone))
|
||||||
|
|
||||||
records_shuffled = records_sorted
|
records_shuffled = records_sorted[:]
|
||||||
random.shuffle(records_shuffled)
|
random.shuffle(records_shuffled)
|
||||||
return records_sorted, records_shuffled
|
return records_sorted, records_shuffled
|
||||||
|
|
||||||
|
|
||||||
def run_expirement(epoch=1, elements=100):
|
def run_expirement(epoch=1, elements=1000):
|
||||||
|
|
||||||
""" распределяем данные по трем структурам данных
|
""" распределяем данные по трем структурам данных
|
||||||
тестируем время операций (вставки, удаления, перебора) и записываем полученные результаты в файл """
|
тестируем время операций (вставки, удаления, перебора) и записываем полученные результаты в файл """
|
||||||
|
|
||||||
|
|
||||||
# создаем данные
|
# создаем данные
|
||||||
records_sorted, records_shuffled = create_data(100)
|
records_sorted, records_shuffled = create_data(elements)
|
||||||
|
|
||||||
datasets = [
|
datasets = [
|
||||||
("shuffled", records_shuffled),
|
("shuffled", records_shuffled),
|
||||||
|
|
@ -47,13 +47,14 @@ def run_expirement(epoch=1, elements=100):
|
||||||
header = ["Структура", "Режим", "Операция", "Время (сек)"]
|
header = ["Структура", "Режим", "Операция", "Время (сек)"]
|
||||||
results = [header]
|
results = [header]
|
||||||
|
|
||||||
linklist = None
|
|
||||||
hashtab = hash_table(elements)
|
|
||||||
bintree = None
|
|
||||||
|
|
||||||
# сразу будем обрабатывать и случайны и отсортированный данные
|
# сразу будем обрабатывать и случайны и отсортированный данные
|
||||||
for label, arr in datasets:
|
for label, arr in datasets:
|
||||||
|
|
||||||
|
linklist = None
|
||||||
|
hashtab = hash_table(elements)
|
||||||
|
bintree = None
|
||||||
# заполнение связного списка
|
# заполнение связного списка
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
for p in arr:
|
for p in arr:
|
||||||
|
|
@ -75,15 +76,15 @@ def run_expirement(epoch=1, elements=100):
|
||||||
# удаление 50 имен в св писке
|
# удаление 50 имен в св писке
|
||||||
deldata = random.sample(arr, 50)
|
deldata = random.sample(arr, 50)
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
for p in arr:
|
for p in deldata:
|
||||||
ll_delete(linklist, p[0])
|
ll_delete(linklist, p[0])
|
||||||
end = time.perf_counter()
|
end = time.perf_counter()
|
||||||
results.append(["linklist", label, "delete", end-start])
|
results.append(["linklist", label, "delete", end-start])
|
||||||
|
|
||||||
# заполнение хэш-тфблицы
|
# заполнение хэш-тфблицы
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
for p in records_shuffled:
|
for p in arr:
|
||||||
hashtab = ht_insert(hashtab, p[0], p[1])
|
ht_insert(hashtab, p[0], p[1])
|
||||||
end = time.perf_counter()
|
end = time.perf_counter()
|
||||||
results.append(["hashtable", label, "insert", end-start])
|
results.append(["hashtable", label, "insert", end-start])
|
||||||
|
|
||||||
|
|
@ -101,14 +102,14 @@ def run_expirement(epoch=1, elements=100):
|
||||||
# удаление 50 имен в хэш таблице
|
# удаление 50 имен в хэш таблице
|
||||||
deldata = random.sample(arr, 50)
|
deldata = random.sample(arr, 50)
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
for p in arr:
|
for p in deldata:
|
||||||
ht_delete(hashtab, p[0])
|
ht_delete(hashtab, p[0])
|
||||||
end = time.perf_counter()
|
end = time.perf_counter()
|
||||||
results.append(["hashtable", label, "delete", end-start])
|
results.append(["hashtable", label, "delete", end-start])
|
||||||
|
|
||||||
# заполнение дерева
|
# заполнение дерева
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
for p in records_shuffled:
|
for p in arr:
|
||||||
bintree = bst_insert(bintree, p[0], p[1])
|
bintree = bst_insert(bintree, p[0], p[1])
|
||||||
end = time.perf_counter()
|
end = time.perf_counter()
|
||||||
results.append(["bintree", label, "insert", end-start])
|
results.append(["bintree", label, "insert", end-start])
|
||||||
|
|
@ -127,16 +128,16 @@ def run_expirement(epoch=1, elements=100):
|
||||||
# удаление 50 имен в дереве
|
# удаление 50 имен в дереве
|
||||||
deldata = random.sample(arr, 50)
|
deldata = random.sample(arr, 50)
|
||||||
start = time.perf_counter()
|
start = time.perf_counter()
|
||||||
for p in arr:
|
for p in deldata:
|
||||||
bst_delete(bintree, p[0])
|
bst_delete(bintree, p[0])
|
||||||
end = time.perf_counter()
|
end = time.perf_counter()
|
||||||
results.append(["bintree", label, "delete", end-start])
|
results.append(["bintree", label, "delete", end-start])
|
||||||
|
|
||||||
|
|
||||||
with open('timedata.csv', mode='w', encoding='utf-8', newline='') as file:
|
with open(f"timedata_{elements}.csv", mode='w', encoding='utf-8', newline='') as file:
|
||||||
writer = csv.writer(file)
|
writer = csv.writer(file)
|
||||||
writer.writerows(results)
|
writer.writerows(results)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
run_expirement(1)
|
run_expirement(epoch=1, elements=10000)
|
||||||
19
ProninVV/aufgabe-1-data-structures/timedata_1000.csv
Normal file
19
ProninVV/aufgabe-1-data-structures/timedata_1000.csv
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Структура,Режим,Операция,Время (сек)
|
||||||
|
linklist,shuffled,insert,0.028301300000748597
|
||||||
|
linklist,shuffled,find,0.002832099999068305
|
||||||
|
linklist,shuffled,delete,0.0018718999999691732
|
||||||
|
hashtable,shuffled,insert,0.0022233999989111908
|
||||||
|
hashtable,shuffled,find,0.00019609999799286015
|
||||||
|
hashtable,shuffled,delete,9.929999941959977e-05
|
||||||
|
bintree,shuffled,insert,0.002081000002362998
|
||||||
|
bintree,shuffled,find,0.00014569999984814785
|
||||||
|
bintree,shuffled,delete,7.760000153211877e-05
|
||||||
|
linklist,sorted,insert,0.02792069999850355
|
||||||
|
linklist,sorted,find,0.0024707999982638285
|
||||||
|
linklist,sorted,delete,0.001741200001561083
|
||||||
|
hashtable,sorted,insert,0.002176499998313375
|
||||||
|
hashtable,sorted,find,0.00019439999960013665
|
||||||
|
hashtable,sorted,delete,0.00011420000009820797
|
||||||
|
bintree,sorted,insert,0.12917839999863645
|
||||||
|
bintree,sorted,find,0.007965299999341369
|
||||||
|
bintree,sorted,delete,0.00476150000031339
|
||||||
|
19
ProninVV/aufgabe-1-data-structures/timedata_10000.csv
Normal file
19
ProninVV/aufgabe-1-data-structures/timedata_10000.csv
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Структура,Режим,Операция,Время (сек)
|
||||||
|
linklist,shuffled,insert,2.8069403000008606
|
||||||
|
linklist,shuffled,find,0.028815499998017913
|
||||||
|
linklist,shuffled,delete,0.015906399999948917
|
||||||
|
hashtable,shuffled,insert,0.17993940000087605
|
||||||
|
hashtable,shuffled,find,0.0018954999977722764
|
||||||
|
hashtable,shuffled,delete,0.0012972000004083384
|
||||||
|
bintree,shuffled,insert,0.03314669999963371
|
||||||
|
bintree,shuffled,find,0.00022189999799593352
|
||||||
|
bintree,shuffled,delete,0.00011869999798364006
|
||||||
|
linklist,sorted,insert,2.925224900001922
|
||||||
|
linklist,sorted,find,0.026056099999550497
|
||||||
|
linklist,sorted,delete,0.015979499999957625
|
||||||
|
hashtable,sorted,insert,0.15593369999987772
|
||||||
|
hashtable,sorted,find,0.0014122000029601622
|
||||||
|
hashtable,sorted,delete,0.0008025000024645124
|
||||||
|
bintree,sorted,insert,13.357120900000155
|
||||||
|
bintree,sorted,find,0.0936219000031997
|
||||||
|
bintree,sorted,delete,0.040907499998866115
|
||||||
|
19
ProninVV/aufgabe-1-data-structures/timedata_2000.csv
Normal file
19
ProninVV/aufgabe-1-data-structures/timedata_2000.csv
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Структура,Режим,Операция,Время (сек)
|
||||||
|
linklist,shuffled,insert,0.1222989999987476
|
||||||
|
linklist,shuffled,find,0.005472099997859914
|
||||||
|
linklist,shuffled,delete,0.0038157999988470692
|
||||||
|
hashtable,shuffled,insert,0.008049899999605259
|
||||||
|
hashtable,shuffled,find,0.0003437999985180795
|
||||||
|
hashtable,shuffled,delete,0.00024619999749120325
|
||||||
|
bintree,shuffled,insert,0.004746700000396231
|
||||||
|
bintree,shuffled,find,0.00016089999917312525
|
||||||
|
bintree,shuffled,delete,8.469999738736078e-05
|
||||||
|
linklist,sorted,insert,0.12316460000147345
|
||||||
|
linklist,sorted,find,0.005846299998665927
|
||||||
|
linklist,sorted,delete,7.130000085453503e-05
|
||||||
|
hashtable,sorted,insert,0.008595399998739595
|
||||||
|
hashtable,sorted,find,0.0003437999985180795
|
||||||
|
hashtable,sorted,delete,0.0002158999996026978
|
||||||
|
bintree,sorted,insert,0.5351322999995318
|
||||||
|
bintree,sorted,find,0.01742980000199168
|
||||||
|
bintree,sorted,delete,0.007677599998714868
|
||||||
|
19
ProninVV/aufgabe-1-data-structures/timedata_500.csv
Normal file
19
ProninVV/aufgabe-1-data-structures/timedata_500.csv
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
Структура,Режим,Операция,Время (сек)
|
||||||
|
linklist,shuffled,insert,0.007393100000626873
|
||||||
|
linklist,shuffled,find,0.001468800001021009
|
||||||
|
linklist,shuffled,delete,0.0008425000014540274
|
||||||
|
hashtable,shuffled,insert,0.000751199997466756
|
||||||
|
hashtable,shuffled,find,0.00013349999790079892
|
||||||
|
hashtable,shuffled,delete,7.670000195503235e-05
|
||||||
|
bintree,shuffled,insert,0.0008823000025586225
|
||||||
|
bintree,shuffled,find,0.00012040000001434237
|
||||||
|
bintree,shuffled,delete,6.539999958476983e-05
|
||||||
|
linklist,sorted,insert,0.00702620000083698
|
||||||
|
linklist,sorted,find,0.0012153999996371567
|
||||||
|
linklist,sorted,delete,0.0007512000011047348
|
||||||
|
hashtable,sorted,insert,0.0007286000000021886
|
||||||
|
hashtable,sorted,find,0.00012399999832268804
|
||||||
|
hashtable,sorted,delete,8.069999967119657e-05
|
||||||
|
bintree,sorted,insert,0.03012010000020382
|
||||||
|
bintree,sorted,find,0.003360800001246389
|
||||||
|
bintree,sorted,delete,0.0017866999987745658
|
||||||
|
Loading…
Reference in New Issue
Block a user