Compare commits

...

1 Commits

Author SHA1 Message Date
52ab70ee71 Задание 1 2026-05-21 22:00:40 +03:00
6 changed files with 631 additions and 0 deletions

View File

@ -0,0 +1,19 @@
Структура,Режим,Операция,Среднее время (сек),Мин,Макс
LinkedList,shuffled,вставка,0.42060984001727775,0.4142958000302315,0.42548670002724975
LinkedList,shuffled,поиск,0.00460058000171557,0.004181800002697855,0.0052013000240549445
LinkedList,shuffled,удаление,0.003505319997202605,0.003264300001319498,0.0037631000159308314
LinkedList,sorted,вставка,0.4510407999972813,0.446296899986919,0.4555279000196606
LinkedList,sorted,поиск,0.0027159999939613045,0.0025430000387132168,0.0028782999725081027
LinkedList,sorted,удаление,0.002460040000732988,0.001968099968507886,0.002805600001011044
HashTable,shuffled,вставка,0.04048331999219954,0.0402110000140965,0.040805700002238154
HashTable,shuffled,поиск,0.00036708000116050246,0.00035719998413696885,0.0003866000333800912
HashTable,shuffled,удаление,0.0002693800022825599,0.00025370001094415784,0.0002874999772757292
HashTable,sorted,вставка,0.041944000008516016,0.04176550003467128,0.04211939999368042
HashTable,sorted,поиск,0.000306799984537065,0.0003005999606102705,0.00031589996069669724
HashTable,sorted,удаление,0.00025475999573245647,0.00021820003166794777,0.0002739999908953905
BST,shuffled,вставка,0.025399240001570435,0.025202599994372576,0.025638799997977912
BST,shuffled,поиск,0.00024858000688254833,0.00024119997397065163,0.00025720003759488463
BST,shuffled,удаление,0.0001722599961794913,0.00015210005221888423,0.00019409996457397938
BST,sorted,вставка,1.471655760006979,1.4474275999818929,1.4893997000181116
BST,sorted,поиск,0.005254479986615479,0.004766399972140789,0.005771900003310293
BST,sorted,удаление,0.002353680005762726,0.0019777000416070223,0.0030280999490059912
1 Структура Режим Операция Среднее время (сек) Мин Макс
2 LinkedList shuffled вставка 0.42060984001727775 0.4142958000302315 0.42548670002724975
3 LinkedList shuffled поиск 0.00460058000171557 0.004181800002697855 0.0052013000240549445
4 LinkedList shuffled удаление 0.003505319997202605 0.003264300001319498 0.0037631000159308314
5 LinkedList sorted вставка 0.4510407999972813 0.446296899986919 0.4555279000196606
6 LinkedList sorted поиск 0.0027159999939613045 0.0025430000387132168 0.0028782999725081027
7 LinkedList sorted удаление 0.002460040000732988 0.001968099968507886 0.002805600001011044
8 HashTable shuffled вставка 0.04048331999219954 0.0402110000140965 0.040805700002238154
9 HashTable shuffled поиск 0.00036708000116050246 0.00035719998413696885 0.0003866000333800912
10 HashTable shuffled удаление 0.0002693800022825599 0.00025370001094415784 0.0002874999772757292
11 HashTable sorted вставка 0.041944000008516016 0.04176550003467128 0.04211939999368042
12 HashTable sorted поиск 0.000306799984537065 0.0003005999606102705 0.00031589996069669724
13 HashTable sorted удаление 0.00025475999573245647 0.00021820003166794777 0.0002739999908953905
14 BST shuffled вставка 0.025399240001570435 0.025202599994372576 0.025638799997977912
15 BST shuffled поиск 0.00024858000688254833 0.00024119997397065163 0.00025720003759488463
16 BST shuffled удаление 0.0001722599961794913 0.00015210005221888423 0.00019409996457397938
17 BST sorted вставка 1.471655760006979 1.4474275999818929 1.4893997000181116
18 BST sorted поиск 0.005254479986615479 0.004766399972140789 0.005771900003310293
19 BST sorted удаление 0.002353680005762726 0.0019777000416070223 0.0030280999490059912

View File

@ -0,0 +1,19 @@
Структура,Режим,Операция,Среднее время (сек),Мин,Макс
LinkedList,shuffled,вставка,0.4877981000114232,0.4723332999856211,0.5048669999814592
LinkedList,shuffled,поиск,0.005099979997612536,0.004888699972070754,0.005397600005380809
LinkedList,shuffled,удаление,0.003206899994984269,0.002823700022418052,0.0036705999518744648
LinkedList,sorted,вставка,0.5067427000147291,0.5056617999798618,0.5084751000395045
LinkedList,sorted,поиск,0.003157860005740076,0.003096400003414601,0.003234500007238239
LinkedList,sorted,удаление,0.0027350999880582094,0.0020201000152155757,0.003734299971256405
HashTable,shuffled,вставка,0.0430581400054507,0.04275970003800467,0.04344099998706952
HashTable,shuffled,поиск,0.0003944600117392838,0.00037650001468136907,0.0004216000088490546
HashTable,shuffled,удаление,0.0002655199728906155,0.00024719996144995093,0.000278000021353364
HashTable,sorted,вставка,0.04386393999448046,0.04331600002478808,0.044519999995827675
HashTable,sorted,поиск,0.00030770000303164123,0.00029749999521300197,0.0003185000387020409
HashTable,sorted,удаление,0.00021459999261423944,0.00017769995611160994,0.00024099997244775295
BST,shuffled,вставка,0.023519799998030066,0.023390699992887676,0.02383040002314374
BST,shuffled,поиск,0.0002645400119945407,0.0002535999519750476,0.000271800032351166
BST,shuffled,удаление,0.00015245999675244092,0.000139000010676682,0.00016689999029040337
BST,sorted,вставка,1.4369806799921208,1.4339254000224173,1.4454721999936737
BST,sorted,поиск,0.005990639992523939,0.005681200011167675,0.0064765000133775175
BST,sorted,удаление,0.002513900003395975,0.001900400035083294,0.00313799997093156
1 Структура Режим Операция Среднее время (сек) Мин Макс
2 LinkedList shuffled вставка 0.4877981000114232 0.4723332999856211 0.5048669999814592
3 LinkedList shuffled поиск 0.005099979997612536 0.004888699972070754 0.005397600005380809
4 LinkedList shuffled удаление 0.003206899994984269 0.002823700022418052 0.0036705999518744648
5 LinkedList sorted вставка 0.5067427000147291 0.5056617999798618 0.5084751000395045
6 LinkedList sorted поиск 0.003157860005740076 0.003096400003414601 0.003234500007238239
7 LinkedList sorted удаление 0.0027350999880582094 0.0020201000152155757 0.003734299971256405
8 HashTable shuffled вставка 0.0430581400054507 0.04275970003800467 0.04344099998706952
9 HashTable shuffled поиск 0.0003944600117392838 0.00037650001468136907 0.0004216000088490546
10 HashTable shuffled удаление 0.0002655199728906155 0.00024719996144995093 0.000278000021353364
11 HashTable sorted вставка 0.04386393999448046 0.04331600002478808 0.044519999995827675
12 HashTable sorted поиск 0.00030770000303164123 0.00029749999521300197 0.0003185000387020409
13 HashTable sorted удаление 0.00021459999261423944 0.00017769995611160994 0.00024099997244775295
14 BST shuffled вставка 0.023519799998030066 0.023390699992887676 0.02383040002314374
15 BST shuffled поиск 0.0002645400119945407 0.0002535999519750476 0.000271800032351166
16 BST shuffled удаление 0.00015245999675244092 0.000139000010676682 0.00016689999029040337
17 BST sorted вставка 1.4369806799921208 1.4339254000224173 1.4454721999936737
18 BST sorted поиск 0.005990639992523939 0.005681200011167675 0.0064765000133775175
19 BST sorted удаление 0.002513900003395975 0.001900400035083294 0.00313799997093156

View File

@ -0,0 +1,91 @@
Структура,Режим,Операция,Повторение,Время (сек)
LinkedList,shuffled,вставка,1,0.42548670002724975
LinkedList,shuffled,вставка,2,0.420181900030002
LinkedList,shuffled,вставка,3,0.4228276999783702
LinkedList,shuffled,вставка,4,0.4202571000205353
LinkedList,shuffled,вставка,5,0.4142958000302315
LinkedList,shuffled,поиск,1,0.004461299977265298
LinkedList,shuffled,поиск,2,0.004771800013259053
LinkedList,shuffled,поиск,3,0.0052013000240549445
LinkedList,shuffled,поиск,4,0.004181800002697855
LinkedList,shuffled,поиск,5,0.004386699991300702
LinkedList,shuffled,удаление,1,0.0036864999565295875
LinkedList,shuffled,удаление,2,0.003434700018260628
LinkedList,shuffled,удаление,3,0.0033779999939724803
LinkedList,shuffled,удаление,4,0.0037631000159308314
LinkedList,shuffled,удаление,5,0.003264300001319498
LinkedList,sorted,вставка,1,0.4555279000196606
LinkedList,sorted,вставка,2,0.4474210999906063
LinkedList,sorted,вставка,3,0.446296899986919
LinkedList,sorted,вставка,4,0.4518415000056848
LinkedList,sorted,вставка,5,0.4541165999835357
LinkedList,sorted,поиск,1,0.0025430000387132168
LinkedList,sorted,поиск,2,0.0026971999905072153
LinkedList,sorted,поиск,3,0.0028782999725081027
LinkedList,sorted,поиск,4,0.00268759997561574
LinkedList,sorted,поиск,5,0.0027738999924622476
LinkedList,sorted,удаление,1,0.001968099968507886
LinkedList,sorted,удаление,2,0.002279900014400482
LinkedList,sorted,удаление,3,0.0026916000060737133
LinkedList,sorted,удаление,4,0.0025550000136718154
LinkedList,sorted,удаление,5,0.002805600001011044
HashTable,shuffled,вставка,1,0.04048329999204725
HashTable,shuffled,вставка,2,0.040805700002238154
HashTable,shuffled,вставка,3,0.04023119999328628
HashTable,shuffled,вставка,4,0.040685399959329516
HashTable,shuffled,вставка,5,0.0402110000140965
HashTable,shuffled,поиск,1,0.00035719998413696885
HashTable,shuffled,поиск,2,0.00036239996552467346
HashTable,shuffled,поиск,3,0.0003719999804161489
HashTable,shuffled,поиск,4,0.00035720004234462976
HashTable,shuffled,поиск,5,0.0003866000333800912
HashTable,shuffled,удаление,1,0.00026569998590275645
HashTable,shuffled,удаление,2,0.0002874999772757292
HashTable,shuffled,удаление,3,0.00025370001094415784
HashTable,shuffled,удаление,4,0.00027540000155568123
HashTable,shuffled,удаление,5,0.00026460003573447466
HashTable,sorted,вставка,1,0.04203070001676679
HashTable,sorted,вставка,2,0.04176550003467128
HashTable,sorted,вставка,3,0.04188929998781532
HashTable,sorted,вставка,4,0.04211939999368042
HashTable,sorted,вставка,5,0.04191510000964627
HashTable,sorted,поиск,1,0.0003032999811694026
HashTable,sorted,поиск,2,0.00030319998040795326
HashTable,sorted,поиск,3,0.0003005999606102705
HashTable,sorted,поиск,4,0.00031589996069669724
HashTable,sorted,поиск,5,0.00031100003980100155
HashTable,sorted,удаление,1,0.00021820003166794777
HashTable,sorted,удаление,2,0.00026649999199435115
HashTable,sorted,удаление,3,0.000248699972871691
HashTable,sorted,удаление,4,0.0002663999912329018
HashTable,sorted,удаление,5,0.0002739999908953905
BST,shuffled,вставка,1,0.025202599994372576
BST,shuffled,вставка,2,0.025266800017561764
BST,shuffled,вставка,3,0.025638799997977912
BST,shuffled,вставка,4,0.025355199992191046
BST,shuffled,вставка,5,0.025532800005748868
BST,shuffled,поиск,1,0.00025720003759488463
BST,shuffled,поиск,2,0.00025560002541169524
BST,shuffled,поиск,3,0.00024309998843818903
BST,shuffled,поиск,4,0.00024119997397065163
BST,shuffled,поиск,5,0.00024580000899732113
BST,shuffled,удаление,1,0.00017309997929260135
BST,shuffled,удаление,2,0.00015999999595806003
BST,shuffled,удаление,3,0.00015210005221888423
BST,shuffled,удаление,4,0.00019409996457397938
BST,shuffled,удаление,5,0.00018199998885393143
BST,sorted,вставка,1,1.4893997000181116
BST,sorted,вставка,2,1.473117200017441
BST,sorted,вставка,3,1.4703117000171915
BST,sorted,вставка,4,1.4474275999818929
BST,sorted,вставка,5,1.4780226000002585
BST,sorted,поиск,1,0.005226599983870983
BST,sorted,поиск,2,0.005771900003310293
BST,sorted,поиск,3,0.004766399972140789
BST,sorted,поиск,4,0.005606099963188171
BST,sorted,поиск,5,0.0049014000105671585
BST,sorted,удаление,1,0.0022025000071153045
BST,sorted,удаление,2,0.0030280999490059912
BST,sorted,удаление,3,0.002415299997664988
BST,sorted,удаление,4,0.0019777000416070223
BST,sorted,удаление,5,0.0021448000334203243
1 Структура Режим Операция Повторение Время (сек)
2 LinkedList shuffled вставка 1 0.42548670002724975
3 LinkedList shuffled вставка 2 0.420181900030002
4 LinkedList shuffled вставка 3 0.4228276999783702
5 LinkedList shuffled вставка 4 0.4202571000205353
6 LinkedList shuffled вставка 5 0.4142958000302315
7 LinkedList shuffled поиск 1 0.004461299977265298
8 LinkedList shuffled поиск 2 0.004771800013259053
9 LinkedList shuffled поиск 3 0.0052013000240549445
10 LinkedList shuffled поиск 4 0.004181800002697855
11 LinkedList shuffled поиск 5 0.004386699991300702
12 LinkedList shuffled удаление 1 0.0036864999565295875
13 LinkedList shuffled удаление 2 0.003434700018260628
14 LinkedList shuffled удаление 3 0.0033779999939724803
15 LinkedList shuffled удаление 4 0.0037631000159308314
16 LinkedList shuffled удаление 5 0.003264300001319498
17 LinkedList sorted вставка 1 0.4555279000196606
18 LinkedList sorted вставка 2 0.4474210999906063
19 LinkedList sorted вставка 3 0.446296899986919
20 LinkedList sorted вставка 4 0.4518415000056848
21 LinkedList sorted вставка 5 0.4541165999835357
22 LinkedList sorted поиск 1 0.0025430000387132168
23 LinkedList sorted поиск 2 0.0026971999905072153
24 LinkedList sorted поиск 3 0.0028782999725081027
25 LinkedList sorted поиск 4 0.00268759997561574
26 LinkedList sorted поиск 5 0.0027738999924622476
27 LinkedList sorted удаление 1 0.001968099968507886
28 LinkedList sorted удаление 2 0.002279900014400482
29 LinkedList sorted удаление 3 0.0026916000060737133
30 LinkedList sorted удаление 4 0.0025550000136718154
31 LinkedList sorted удаление 5 0.002805600001011044
32 HashTable shuffled вставка 1 0.04048329999204725
33 HashTable shuffled вставка 2 0.040805700002238154
34 HashTable shuffled вставка 3 0.04023119999328628
35 HashTable shuffled вставка 4 0.040685399959329516
36 HashTable shuffled вставка 5 0.0402110000140965
37 HashTable shuffled поиск 1 0.00035719998413696885
38 HashTable shuffled поиск 2 0.00036239996552467346
39 HashTable shuffled поиск 3 0.0003719999804161489
40 HashTable shuffled поиск 4 0.00035720004234462976
41 HashTable shuffled поиск 5 0.0003866000333800912
42 HashTable shuffled удаление 1 0.00026569998590275645
43 HashTable shuffled удаление 2 0.0002874999772757292
44 HashTable shuffled удаление 3 0.00025370001094415784
45 HashTable shuffled удаление 4 0.00027540000155568123
46 HashTable shuffled удаление 5 0.00026460003573447466
47 HashTable sorted вставка 1 0.04203070001676679
48 HashTable sorted вставка 2 0.04176550003467128
49 HashTable sorted вставка 3 0.04188929998781532
50 HashTable sorted вставка 4 0.04211939999368042
51 HashTable sorted вставка 5 0.04191510000964627
52 HashTable sorted поиск 1 0.0003032999811694026
53 HashTable sorted поиск 2 0.00030319998040795326
54 HashTable sorted поиск 3 0.0003005999606102705
55 HashTable sorted поиск 4 0.00031589996069669724
56 HashTable sorted поиск 5 0.00031100003980100155
57 HashTable sorted удаление 1 0.00021820003166794777
58 HashTable sorted удаление 2 0.00026649999199435115
59 HashTable sorted удаление 3 0.000248699972871691
60 HashTable sorted удаление 4 0.0002663999912329018
61 HashTable sorted удаление 5 0.0002739999908953905
62 BST shuffled вставка 1 0.025202599994372576
63 BST shuffled вставка 2 0.025266800017561764
64 BST shuffled вставка 3 0.025638799997977912
65 BST shuffled вставка 4 0.025355199992191046
66 BST shuffled вставка 5 0.025532800005748868
67 BST shuffled поиск 1 0.00025720003759488463
68 BST shuffled поиск 2 0.00025560002541169524
69 BST shuffled поиск 3 0.00024309998843818903
70 BST shuffled поиск 4 0.00024119997397065163
71 BST shuffled поиск 5 0.00024580000899732113
72 BST shuffled удаление 1 0.00017309997929260135
73 BST shuffled удаление 2 0.00015999999595806003
74 BST shuffled удаление 3 0.00015210005221888423
75 BST shuffled удаление 4 0.00019409996457397938
76 BST shuffled удаление 5 0.00018199998885393143
77 BST sorted вставка 1 1.4893997000181116
78 BST sorted вставка 2 1.473117200017441
79 BST sorted вставка 3 1.4703117000171915
80 BST sorted вставка 4 1.4474275999818929
81 BST sorted вставка 5 1.4780226000002585
82 BST sorted поиск 1 0.005226599983870983
83 BST sorted поиск 2 0.005771900003310293
84 BST sorted поиск 3 0.004766399972140789
85 BST sorted поиск 4 0.005606099963188171
86 BST sorted поиск 5 0.0049014000105671585
87 BST sorted удаление 1 0.0022025000071153045
88 BST sorted удаление 2 0.0030280999490059912
89 BST sorted удаление 3 0.002415299997664988
90 BST sorted удаление 4 0.0019777000416070223
91 BST sorted удаление 5 0.0021448000334203243

45
starikovta/docs/report.md Normal file
View File

@ -0,0 +1,45 @@
# Отчёт по Заданию 1
## Реализованные структуры
1. Связный список
2. Хеш-таблица (1000 бакетов)
3. Двоичное дерево поиска
## Результаты экспериментов (N=10000, 5 повторений)
### Среднее время операций (секунды)
| Структура | Режим | Вставка | Поиск | Удаление |
|-----------|-------|---------|-------|----------|
| LinkedList | shuffled | 0.4201 | 0.0046 | 0.0035 |
| LinkedList | sorted | 0.4510 | 0.0027 | 0.0025 |
| HashTable | shuffled | 0.4048 | 0.0037 | 0.0027 |
| HashTable | sorted | 0.0419 | 0.0003 | - |
| BST | shuffled | 0.0002 | 0.0002 | - |
| BST | sorted | 1.4717 | 0.0053 | 0.0024 |
*(Заполни числами из эксперимента)*
## График
![График производительности](data/chart.png)
## Анализ
### 1. Влияние порядка данных на BST
[Напиши: на отсортированных данных BST деградирует, так как становится вырожденным деревом (как связный список). Время вставки растёт с O(log n) до O(n).]
### 2. Хеш-таблица
[Напиши: почти не чувствительна к порядку, так как хеш-функция распределяет записи равномерно независимо от входного порядка.]
### 3. Связный список
[Напиши: всегда медленный при поиске (O(n)), так как нужно перебирать элементы последовательно.]
### 4. Удаление
[Напиши: в связном списке — O(n), в хеш-таблице — O(1) в среднем, в BST — O(log n) в среднем, но O(n) в худшем случае.]
## Вывод
Какую структуру и для каких задач выбирать:
- **Частые вставки**: связный список (O(1) в начало/конец) или хеш-таблица (амортизированно O(1))
- **Частый поиск**: хеш-таблица (O(1) в среднем)
- **Необходимость получать данные в порядке**: BST (in-order обход даёт отсортированный список за O(n))

View File

@ -0,0 +1,91 @@
Структура,Режим,Операция,Повторение,Время (сек)
LinkedList,shuffled,вставка,1,0.49103280005510896
LinkedList,shuffled,вставка,2,0.48294900002656505
LinkedList,shuffled,вставка,3,0.5048669999814592
LinkedList,shuffled,вставка,4,0.4723332999856211
LinkedList,shuffled,вставка,5,0.4878084000083618
LinkedList,shuffled,поиск,1,0.004906799993477762
LinkedList,shuffled,поиск,2,0.005168500007130206
LinkedList,shuffled,поиск,3,0.005397600005380809
LinkedList,shuffled,поиск,4,0.004888699972070754
LinkedList,shuffled,поиск,5,0.0051383000100031495
LinkedList,shuffled,удаление,1,0.0031753999646753073
LinkedList,shuffled,удаление,2,0.0035342000192031264
LinkedList,shuffled,удаление,3,0.0028306000167503953
LinkedList,shuffled,удаление,4,0.0036705999518744648
LinkedList,shuffled,удаление,5,0.002823700022418052
LinkedList,sorted,вставка,1,0.5084751000395045
LinkedList,sorted,вставка,2,0.5062428000383079
LinkedList,sorted,вставка,3,0.5072087000007741
LinkedList,sorted,вставка,4,0.5056617999798618
LinkedList,sorted,вставка,5,0.506125100015197
LinkedList,sorted,поиск,1,0.003096400003414601
LinkedList,sorted,поиск,2,0.003234500007238239
LinkedList,sorted,поиск,3,0.0031832000240683556
LinkedList,sorted,поиск,4,0.0031731000053696334
LinkedList,sorted,поиск,5,0.0031020999886095524
LinkedList,sorted,удаление,1,0.002260599983856082
LinkedList,sorted,удаление,2,0.0020201000152155757
LinkedList,sorted,удаление,3,0.0028519000043161213
LinkedList,sorted,удаление,4,0.003734299971256405
LinkedList,sorted,удаление,5,0.002808599965646863
HashTable,shuffled,вставка,1,0.04344099998706952
HashTable,shuffled,вставка,2,0.04329000000143424
HashTable,shuffled,вставка,3,0.04290130001027137
HashTable,shuffled,вставка,4,0.04275970003800467
HashTable,shuffled,вставка,5,0.04289869999047369
HashTable,shuffled,поиск,1,0.00041800003964453936
HashTable,shuffled,поиск,2,0.00037750002229586244
HashTable,shuffled,поиск,3,0.0004216000088490546
HashTable,shuffled,поиск,4,0.00037650001468136907
HashTable,shuffled,поиск,5,0.00037869997322559357
HashTable,shuffled,удаление,1,0.00024719996144995093
HashTable,shuffled,удаление,2,0.0002562999725341797
HashTable,shuffled,удаление,3,0.00026979995891451836
HashTable,shuffled,удаление,4,0.00027629995020106435
HashTable,shuffled,удаление,5,0.000278000021353364
HashTable,sorted,вставка,1,0.044519999995827675
HashTable,sorted,вставка,2,0.043910799955483526
HashTable,sorted,вставка,3,0.04366250004386529
HashTable,sorted,вставка,4,0.04391039995243773
HashTable,sorted,вставка,5,0.04331600002478808
HashTable,sorted,поиск,1,0.0003066000062972307
HashTable,sorted,поиск,2,0.00029749999521300197
HashTable,sorted,поиск,3,0.00030989997321739793
HashTable,sorted,поиск,4,0.0003060000017285347
HashTable,sorted,поиск,5,0.0003185000387020409
HashTable,sorted,удаление,1,0.00017769995611160994
HashTable,sorted,удаление,2,0.00021810003090649843
HashTable,sorted,удаление,3,0.0002011999604292214
HashTable,sorted,удаление,4,0.00024099997244775295
HashTable,sorted,удаление,5,0.00023500004317611456
BST,shuffled,вставка,1,0.023512399988248944
BST,shuffled,вставка,2,0.023390999995172024
BST,shuffled,вставка,3,0.02383040002314374
BST,shuffled,вставка,4,0.02347449999069795
BST,shuffled,вставка,5,0.023390699992887676
BST,shuffled,поиск,1,0.0002652000403031707
BST,shuffled,поиск,2,0.00026300002355128527
BST,shuffled,поиск,3,0.0002535999519750476
BST,shuffled,поиск,4,0.0002691000117920339
BST,shuffled,поиск,5,0.000271800032351166
BST,shuffled,удаление,1,0.00015969999367371202
BST,shuffled,удаление,2,0.00016689999029040337
BST,shuffled,удаление,3,0.00015079998411238194
BST,shuffled,удаление,4,0.000139000010676682
BST,shuffled,удаление,5,0.00014590000500902534
BST,sorted,вставка,1,1.4365359999937937
BST,sorted,вставка,2,1.4347687999834307
BST,sorted,вставка,3,1.4342009999672882
BST,sorted,вставка,4,1.4454721999936737
BST,sorted,вставка,5,1.4339254000224173
BST,sorted,поиск,1,0.0064765000133775175
BST,sorted,поиск,2,0.006033400015439838
BST,sorted,поиск,3,0.005681200011167675
BST,sorted,поиск,4,0.005705999967176467
BST,sorted,поиск,5,0.006056099955458194
BST,sorted,удаление,1,0.00313799997093156
BST,sorted,удаление,2,0.002808899967931211
BST,sorted,удаление,3,0.0027692000148817897
BST,sorted,удаление,4,0.001900400035083294
BST,sorted,удаление,5,0.0019530000281520188
1 Структура Режим Операция Повторение Время (сек)
2 LinkedList shuffled вставка 1 0.49103280005510896
3 LinkedList shuffled вставка 2 0.48294900002656505
4 LinkedList shuffled вставка 3 0.5048669999814592
5 LinkedList shuffled вставка 4 0.4723332999856211
6 LinkedList shuffled вставка 5 0.4878084000083618
7 LinkedList shuffled поиск 1 0.004906799993477762
8 LinkedList shuffled поиск 2 0.005168500007130206
9 LinkedList shuffled поиск 3 0.005397600005380809
10 LinkedList shuffled поиск 4 0.004888699972070754
11 LinkedList shuffled поиск 5 0.0051383000100031495
12 LinkedList shuffled удаление 1 0.0031753999646753073
13 LinkedList shuffled удаление 2 0.0035342000192031264
14 LinkedList shuffled удаление 3 0.0028306000167503953
15 LinkedList shuffled удаление 4 0.0036705999518744648
16 LinkedList shuffled удаление 5 0.002823700022418052
17 LinkedList sorted вставка 1 0.5084751000395045
18 LinkedList sorted вставка 2 0.5062428000383079
19 LinkedList sorted вставка 3 0.5072087000007741
20 LinkedList sorted вставка 4 0.5056617999798618
21 LinkedList sorted вставка 5 0.506125100015197
22 LinkedList sorted поиск 1 0.003096400003414601
23 LinkedList sorted поиск 2 0.003234500007238239
24 LinkedList sorted поиск 3 0.0031832000240683556
25 LinkedList sorted поиск 4 0.0031731000053696334
26 LinkedList sorted поиск 5 0.0031020999886095524
27 LinkedList sorted удаление 1 0.002260599983856082
28 LinkedList sorted удаление 2 0.0020201000152155757
29 LinkedList sorted удаление 3 0.0028519000043161213
30 LinkedList sorted удаление 4 0.003734299971256405
31 LinkedList sorted удаление 5 0.002808599965646863
32 HashTable shuffled вставка 1 0.04344099998706952
33 HashTable shuffled вставка 2 0.04329000000143424
34 HashTable shuffled вставка 3 0.04290130001027137
35 HashTable shuffled вставка 4 0.04275970003800467
36 HashTable shuffled вставка 5 0.04289869999047369
37 HashTable shuffled поиск 1 0.00041800003964453936
38 HashTable shuffled поиск 2 0.00037750002229586244
39 HashTable shuffled поиск 3 0.0004216000088490546
40 HashTable shuffled поиск 4 0.00037650001468136907
41 HashTable shuffled поиск 5 0.00037869997322559357
42 HashTable shuffled удаление 1 0.00024719996144995093
43 HashTable shuffled удаление 2 0.0002562999725341797
44 HashTable shuffled удаление 3 0.00026979995891451836
45 HashTable shuffled удаление 4 0.00027629995020106435
46 HashTable shuffled удаление 5 0.000278000021353364
47 HashTable sorted вставка 1 0.044519999995827675
48 HashTable sorted вставка 2 0.043910799955483526
49 HashTable sorted вставка 3 0.04366250004386529
50 HashTable sorted вставка 4 0.04391039995243773
51 HashTable sorted вставка 5 0.04331600002478808
52 HashTable sorted поиск 1 0.0003066000062972307
53 HashTable sorted поиск 2 0.00029749999521300197
54 HashTable sorted поиск 3 0.00030989997321739793
55 HashTable sorted поиск 4 0.0003060000017285347
56 HashTable sorted поиск 5 0.0003185000387020409
57 HashTable sorted удаление 1 0.00017769995611160994
58 HashTable sorted удаление 2 0.00021810003090649843
59 HashTable sorted удаление 3 0.0002011999604292214
60 HashTable sorted удаление 4 0.00024099997244775295
61 HashTable sorted удаление 5 0.00023500004317611456
62 BST shuffled вставка 1 0.023512399988248944
63 BST shuffled вставка 2 0.023390999995172024
64 BST shuffled вставка 3 0.02383040002314374
65 BST shuffled вставка 4 0.02347449999069795
66 BST shuffled вставка 5 0.023390699992887676
67 BST shuffled поиск 1 0.0002652000403031707
68 BST shuffled поиск 2 0.00026300002355128527
69 BST shuffled поиск 3 0.0002535999519750476
70 BST shuffled поиск 4 0.0002691000117920339
71 BST shuffled поиск 5 0.000271800032351166
72 BST shuffled удаление 1 0.00015969999367371202
73 BST shuffled удаление 2 0.00016689999029040337
74 BST shuffled удаление 3 0.00015079998411238194
75 BST shuffled удаление 4 0.000139000010676682
76 BST shuffled удаление 5 0.00014590000500902534
77 BST sorted вставка 1 1.4365359999937937
78 BST sorted вставка 2 1.4347687999834307
79 BST sorted вставка 3 1.4342009999672882
80 BST sorted вставка 4 1.4454721999936737
81 BST sorted вставка 5 1.4339254000224173
82 BST sorted поиск 1 0.0064765000133775175
83 BST sorted поиск 2 0.006033400015439838
84 BST sorted поиск 3 0.005681200011167675
85 BST sorted поиск 4 0.005705999967176467
86 BST sorted поиск 5 0.006056099955458194
87 BST sorted удаление 1 0.00313799997093156
88 BST sorted удаление 2 0.002808899967931211
89 BST sorted удаление 3 0.0027692000148817897
90 BST sorted удаление 4 0.001900400035083294
91 BST sorted удаление 5 0.0019530000281520188

366
starikovta/phonebook.py Normal file
View File

@ -0,0 +1,366 @@
import time
import random
import csv
import sys
sys.setrecursionlimit (50000)
from datetime import datetime
# ==================== СВЯЗНЫЙ СПИСОК ====================
def ll_insert(head, name, phone):
"""Добавляет или обновляет запись в связном списке"""
# Проверяем, не существует ли уже такой name
curr = head
while curr:
if curr['name'] == name:
curr['phone'] = phone # обновляем
return head
curr = curr['next']
# Если не нашли, вставляем в конец
new_node = {'name': name, 'phone': phone, 'next': None}
if head is None:
return new_node
curr = head
while curr['next']:
curr = curr['next']
curr['next'] = new_node
return head
def ll_find(head, name):
"""Ищет запись по имени, возвращает телефон или None"""
curr = head
while curr:
if curr['name'] == name:
return curr['phone']
curr = curr['next']
return None
def ll_delete(head, name):
"""Удаляет запись по имени, возвращает новую голову"""
if head is None:
return None
# Если удаляем голову
if head['name'] == name:
return head['next']
# Ищем элемент перед удаляемым
curr = head
while curr['next']:
if curr['next']['name'] == name:
curr['next'] = curr['next']['next']
return head
curr = curr['next']
return head
def ll_list_all(head):
"""Собирает все записи и сортирует по имени"""
records = []
curr = head
while curr:
records.append((curr['name'], curr['phone']))
curr = curr['next']
# Сортируем по имени
records.sort(key=lambda x: x[0])
return records
# ==================== ХЕШ-ТАБЛИЦА ====================
def hash_function(name, size):
"""Простая хеш-функция"""
return sum(ord(c) for c in name) % size
def ht_insert(buckets, name, phone):
"""Вставляет запись в хеш-таблицу"""
index = hash_function(name, len(buckets))
# Используем ll_insert для бакета
buckets[index] = ll_insert(buckets[index], name, phone)
return buckets
def ht_find(buckets, name):
"""Ищет запись в хеш-таблице"""
index = hash_function(name, len(buckets))
return ll_find(buckets[index], name)
def ht_delete(buckets, name):
"""Удаляет запись из хеш-таблицы"""
index = hash_function(name, len(buckets))
buckets[index] = ll_delete(buckets[index], name)
return buckets
def ht_list_all(buckets):
"""Собирает все записи из всех бакетов и сортирует"""
all_records = []
for bucket in buckets:
curr = bucket
while curr:
all_records.append((curr['name'], curr['phone']))
curr = curr['next']
all_records.sort(key=lambda x: x[0])
return all_records
# ==================== БИНАРНОЕ ДЕРЕВО ПОИСКА ====================
def bst_insert(root, name, phone):
"""Вставляет запись в BST (рекурсивно)"""
if root is None:
return {'name': name, 'phone': phone, 'left': None, 'right': None}
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
return root
def bst_find(root, name):
"""Ищет запись в BST"""
if root is None:
return None
if name == root['name']:
return root['phone']
elif name < root['name']:
return bst_find(root['left'], name)
else:
return bst_find(root['right'], name)
def bst_find_min(node):
"""Находит узел с минимальным значением"""
current = node
while current and current['left']:
current = current['left']
return current
def bst_delete(root, name):
"""Удаляет запись из BST"""
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']
# Узел с двумя детьми
temp = bst_find_min(root['right'])
root['name'] = temp['name']
root['phone'] = temp['phone']
root['right'] = bst_delete(root['right'], temp['name'])
return root
def bst_list_all(root):
"""Центрированный обход (возвращает отсортированный список)"""
records = []
def inorder_traversal(node):
if node:
inorder_traversal(node['left'])
records.append((node['name'], node['phone']))
inorder_traversal(node['right'])
inorder_traversal(root)
return records
# ==================== ГЕНЕРАЦИЯ ТЕСТОВЫХ ДАННЫХ ====================
def generate_test_data(n=10000):
"""Генерирует shuffled и sorted версии данных"""
# Генерируем имена с небольшим количеством коллизий
names_pool = [f"User_{i:05d}" for i in range(n // 10)] # 1000 уникальных имен
records = []
for i in range(n):
name = random.choice(names_pool) # повторяющиеся имена для коллизий
phone = f"+7-999-{random.randint(1000000, 9999999)}"
records.append((name, phone))
# Создаем shuffled и sorted версии
records_shuffled = records.copy()
random.shuffle(records_shuffled)
records_sorted = sorted(records, key=lambda x: x[0])
return records_shuffled, records_sorted
# ==================== ЗАМЕРЫ ВРЕМЕНИ ====================
def measure_insertion(struct_type, records, buckets_size=None):
"""Замеряет время вставки всех записей"""
if struct_type == "LinkedList":
head = None
start = time.perf_counter()
for name, phone in records:
head = ll_insert(head, name, phone)
end = time.perf_counter()
elif struct_type == "HashTable":
if buckets_size is None:
buckets_size = 1000
buckets = [None] * buckets_size
start = time.perf_counter()
for name, phone in records:
buckets = ht_insert(buckets, name, phone)
end = time.perf_counter()
elif struct_type == "BST":
root = None
start = time.perf_counter()
for name, phone in records:
root = bst_insert(root, name, phone)
end = time.perf_counter()
else:
return None, None
elapsed = end - start
return elapsed, (head if struct_type == "LinkedList" else (buckets if struct_type == "HashTable" else root))
def measure_find(struct_type, data_structure, records, num_existing=100, num_nonexistent=10):
"""Замеряет время поиска записей"""
# Выбираем существующие записи
existing_names = random.sample([name for name, _ in records[:len(records)//2]], min(num_existing, len(records)))
# Создаем несуществующие имена
nonexistent_names = [f"None_{i}" for i in range(num_nonexistent)]
all_queries = existing_names + nonexistent_names
random.shuffle(all_queries)
start = time.perf_counter()
for name in all_queries:
if struct_type == "LinkedList":
ll_find(data_structure, name)
elif struct_type == "HashTable":
ht_find(data_structure, name)
elif struct_type == "BST":
bst_find(data_structure, name)
end = time.perf_counter()
return end - start
def measure_delete(struct_type, data_structure, records, num_to_delete=50):
"""Замеряет время удаления записей"""
# Выбираем случайные имена для удаления
names_to_delete = random.sample([name for name, _ in records[:len(records)//2]], min(num_to_delete, len(records)))
start = time.perf_counter()
for name in names_to_delete:
if struct_type == "LinkedList":
data_structure = ll_delete(data_structure, name)
elif struct_type == "HashTable":
data_structure = ht_delete(data_structure, name)
elif struct_type == "BST":
data_structure = bst_delete(data_structure, name)
end = time.perf_counter()
return end - start
# ==================== ОСНОВНОЙ ЭКСПЕРИМЕНТ ====================
def run_experiment():
"""Запускает все эксперименты и сохраняет результаты"""
print("Генерация тестовых данных...")
records_shuffled, records_sorted = generate_test_data(10000)
structures = ["LinkedList", "HashTable", "BST"]
modes = {"shuffled": records_shuffled, "sorted": records_sorted}
all_results = []
all_results.append(["Структура", "Режим", "Операция", "Повторение", "Время (сек)"])
# Количество повторений
repeats = 5
for struct in structures:
for mode_name, records in modes.items():
print(f"\nТестирование: {struct}, режим {mode_name}")
# Вставка
insertion_times = []
for rep in range(repeats):
print(f" Вставка, повторение {rep+1}/{repeats}...")
elapsed, data_struct = measure_insertion(struct, records)
insertion_times.append(elapsed)
all_results.append([struct, mode_name, "вставка", rep+1, elapsed])
# Используем последнюю структуру для поиска и удаления
# (пересоздаем для чистоты эксперимента)
_, data_struct = measure_insertion(struct, records)
# Поиск
find_times = []
for rep in range(repeats):
print(f" Поиск, повторение {rep+1}/{repeats}...")
elapsed = measure_find(struct, data_struct, records)
find_times.append(elapsed)
all_results.append([struct, mode_name, "поиск", rep+1, elapsed])
# Удаление
delete_times = []
# Создаем свежую структуру для удаления
_, fresh_data_struct = measure_insertion(struct, records)
for rep in range(repeats):
print(f" Удаление, повторение {rep+1}/{repeats}...")
elapsed = measure_delete(struct, fresh_data_struct, records)
delete_times.append(elapsed)
all_results.append([struct, mode_name, "удаление", rep+1, elapsed])
# Выводим средние значения
print(f" Среднее время вставки: {sum(insertion_times)/len(insertion_times):.6f} сек")
print(f" Среднее время поиска: {sum(find_times)/len(find_times):.6f} сек")
print(f" Среднее время удаления: {sum(delete_times)/len(delete_times):.6f} сек")
# Сохраняем результаты в CSV
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
csv_filename = f"experiment_results_{timestamp}.csv"
with open(csv_filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(all_results)
print(f"\nРезультаты сохранены в файл: {csv_filename}")
# Сохраняем также средние значения для удобства
avg_results = []
avg_results.append(["Структура", "Режим", "Операция", "Среднее время (сек)", "Мин", "Макс"])
# Группируем по структуре, режиму, операции
grouped = {}
for row in all_results[1:]: # пропускаем заголовок
struct, mode, op, rep, time_val = row
key = (struct, mode, op)
if key not in grouped:
grouped[key] = []
grouped[key].append(time_val)
for (struct, mode, op), times in grouped.items():
avg_time = sum(times) / len(times)
min_time = min(times)
max_time = max(times)
avg_results.append([struct, mode, op, avg_time, min_time, max_time])
avg_filename = f"average_results_{timestamp}.csv"
with open(avg_filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(avg_results)
print(f"Средние значения сохранены в файл: {avg_filename}")
return all_results, avg_results
if __name__ == "__main__":
print("Начало эксперимента...")
print("="*50)
results, avg_results = run_experiment()
print("="*50)
print("Эксперимент завершен!")