From 56509603c7b6b99739cc97d590df78a831bd1947 Mon Sep 17 00:00:00 2001 From: xalva Date: Tue, 28 Apr 2026 21:25:45 +0300 Subject: [PATCH] [3]lab1_test --- README.md | 54 ------- stepinim/[1]laba.py | 2 - stepinim/docs/data/grafik.png | Bin 0 -> 23463 bytes stepinim/docs/data/results.csv | 91 ++++++++++++ stepinim/docs/otchet_1lab | 44 ++++++ stepinim/lab1_structure/test.py | 255 ++++++++++++++++++++++++++++++++ 6 files changed, 390 insertions(+), 56 deletions(-) delete mode 100644 README.md delete mode 100644 stepinim/[1]laba.py create mode 100644 stepinim/docs/data/grafik.png create mode 100644 stepinim/docs/data/results.csv create mode 100644 stepinim/docs/otchet_1lab create mode 100644 stepinim/lab1_structure/test.py diff --git a/README.md b/README.md deleted file mode 100644 index 7b46480..0000000 --- a/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# 2026-MP - -Практика по курсам "Методы программирования" и "Программная инженерия" РФФ ННГУ - -[Презентация по курсу (обновляемая)](https://docs.google.com/presentation/d/1wmYjy5QDoYECEHi7NAAINPulU9pLsaIi-aLaUppspps/edit?usp=sharing) - -Для работы необходим python 3.11 и выше. Библиотеки: numpy, pandas, matplotlib, tensorflow, Pillow. Редактор любой. Из неплохих: IDLE (родной, идёт вместе с установщиком), Visual Studio Code, notepad++, PyCharm, vim (для любителей сначала страдать, потом наслаждаться). - -Работа с блокнотами онлайн, с возможностью подключения удалённых мощностей гугла (GPU, TPU): https://colab.research.google.com/ - -Мой контакт: nsmorozov@rf.unn.ru - -Внутри папки группы создать папку имени себя (фамилия и имя). В своей папке можете делать все что угодно, в чужие не залезать, в корневую тоже. Я буду ориентироваться на файлы, где в названии будет номер лабораторной. - -**Название пулл-реквеста должно начинаться с квадратных скобок, в которых перечислены номера сдаваемых лабораторных работ. Не больше одного активного реквеста, если надо довнести -- надо обновить текущий.** - -### Крайний срок приема работ 25.05.2026 до 14:00 - -## Задание 1 -- репозиторий - -0. Создай пользователя (логин — фамилия+инициалы слитно транслитом, как в терминал-классе). - -1. Зайди в этот репозиторий на Gitea, нажми кнопку **Форкнуть**, чтобы создать копию в своем аккаунте. - -2. **Клонирование:** Скопируй ссылку на свой форк и выполни: - ```bash - git clone <ссылка_на_ваш_форк> - cd <название_репозитория> - ``` - -3. **Создай ветку** (название — фамилия+инициалы слитно транслитом, буква в букву как логин): - ```bash - git checkout -b IvanovII - ``` - -4. **Создай папку** с таким же названием (`IvanovII`) и внутри неё — текстовый файл, названный номером вашей группы (например, `101.md`). - -5. **Сохрани изменения:** - ```bash - git add -A - git commit -m "[0] initial commit" - ``` - -6. Отправь ветку **в свой форк** на Gitea: - ```bash - git push origin IvanovII - ``` - -7. **Создай запрос на слияние (Pull Request):** На Gitea перейди в свой форк, выбери ветку `IvanovII`, нажмите **Запрос на слияние**. Убедитесь, что: - - Базовый репозиторий: **учебный** (преподавателя) - - Базовая ветка: **develop** - - Сравниваемая ветка: **свой форк / IvanovII** - -8. Отправь PR. \ No newline at end of file diff --git a/stepinim/[1]laba.py b/stepinim/[1]laba.py deleted file mode 100644 index 2435cd6..0000000 --- a/stepinim/[1]laba.py +++ /dev/null @@ -1,2 +0,0 @@ -print("hello") -print("hi") \ No newline at end of file diff --git a/stepinim/docs/data/grafik.png b/stepinim/docs/data/grafik.png new file mode 100644 index 0000000000000000000000000000000000000000..957c7508d60d3a3305fbcda1e1759275a1a6b291 GIT binary patch literal 23463 zcmeIaXINC*wk?Vo6N(BV5)=c90wOtMKqO06qJknB$r;Rmgi?_pS#m}sX9G|oIcHFi zoMTZ1RrUI)wU=j|ciuhU-S>Nc-uKRrz1Lb)nsdxPdT+h8)`#ycC7Jzu823<7QSFz# zd0mx?YTE=A)z;h8JK-;jEcIvLA0qbBx9!!ejqRQ8**>6Byl4N&!rI=#)bNDk16w;& zYb#zZo=aRp7f+bj+dr}s;pVpd^A0X++lSm=bQ~JtTXsLXdB={5>cBnpzbz?}$);3P zI)`PiUr~3CoE_K|rap=n{CU(=^YhN9aou!#**d$Ws|PO$@EKxqa5RqbDn?zmpYpGT z+>SrX_NrXV@WbtA%v;WH9a=5J8G6ab;MO;p zbQayj-H>q0PAeApH|nh-@c&01Kc<0y>^Kp-jfzTY3pLy|)h(+3vzHoFPx09dSFPa3 zW0GCQ-m~+Yw%*sAhp$&KZcUJ##IkxRFpJpV%xy@@+8J;qe%}Obqp0JIP`VTRv}X%@ zjQd;qJNId2_AoxVajZGsR-b^)(n#0Lb#;QvzI^J2|99!c*7+={Z(ZlMxu#}{e=UYf zmwI#T?d|~YFBkvobvK{GqMHilzxVYypXa8tckqpPm*ufk)3zi!y<~LT_06ljm77a- zD@5Fo=qo-E%icWMy_|Wss?XXTY2HHhcv5rExMg2~qFtkK@||&0KK7&=7?!A)2Uw$7 z3$2GL*rw?y@3J!Iez6QUJ*1ML^4=&=cqxXqbwu=*ucK2?)fOtMwnV-$F^=(Oh6X&@ zYwZF*`6=bMU&{qlzNjJPa{puH^VM(6SCUDl5?q4)kFG_xl)jC2ok}fZZ4w8sHoI+lMl0`wZ)74#^?~!x@123NeLt#Bvl_ZNN^dC5~P#eUK=3L zd(Hzl;FKS|ujuz%`K6iR;Pp+7D37%s)6&@j`6v+wIfv15+@O4NjHheKe8onqws~eS znafOP&0Hx?A-zFxNGuAjd$LohZ#ckT}`8Q*>ldpW93)3Oy|nC9CDj4FMi6*>*O@q zdPW@AZ>J_^W#F-@p>3Jp(Mlsa^SUOGIifGI30}%uANCusv#Z{KYnwBhcUk}C-FCU| zVo(fbRzY6gMT5Vu+=zG~Gf!3DKzFBgkfMNW{EdJgmcxRB&PJ|3pX^#1f2E^7Zhm;9 z{nLXw-5f68J)YV6<*iTma)ou3ue8c1dlCs6ZbJ~zV%0`;eHi+sG_H#EVcQoH(L=@& zmP^DQ;|R`q1Is!ywbT)&K3Du`XdU~GsaJbo6+ZI`;eQ9U?KrCYdYftgkY(XOt2e7> zSU7(=OS%NSk~f(YF?Q>C$9R#1W1jDjZ5`+2RC;#fycc0IxsAnb=FPRaoyRR+59N*o ziY7ffAR)y3=<^m~CKivCmNp{p5GNtWYdprwQ$luO1S6TWW!ui*^y?6lXAAu>3_Nj6 z8RHN=+Fgg|Cp$BB@*lL2h;ya$Nir-hr#U}<-il|~TxnBobI35WtLMS~{#bzx|~rR;c=lfJfN z&x5+`o=4yItC2~>^z!-7+YZ!w?S_ZRdu=;5vw$#k8^^G>{Og_zznhEuZR>&!cuksP znHo}JWCklSqH%k{jI++KKjnm{c*2MwC1NA;cW zc}grb=~$Ns=QgkS9NbuLk{rKO(rxHB`angI+c$%5V^uzL^O`q}BIKQv0*mgC_flbl z6kj{hE+F8c9oX@%9-?KGXH5f_UGP9dgCK+*4{S0B-E*}0lry%+zeCGFoGcY(-zsaG z+aOT)&}1y!JZousZODskUvuoCg5wisDyqlt?~Mj)aScI2@F3Z(FZ>#9KBn<|wNr09<(*~R?Mb#3OozQ<}u*`P@}=Id0puqN*}Z#s!an?t8MyHd8fDwrB9 z+wR~=Bwxrbd)sN?MKpU-CZW_1E8VW#5FyAt#2xS?%k_K~Lpt+F8LRuk7yFqUY|@LP z`a;~S!nXHG%OAX1IJnaZ(eF?8PO*AzF7iG4`FW+ui^Qu3&#<^-6W;oLBsWHI1CpD! zro()~mLxoHYwFrm+YkG)E3MYw$P=krf0ZT(t0(vBr^|AK;5bho555~BH#*d5u3vap zmC1esv(&`20TIWUFoRr3(#b~++;e&f(Ox9{vECT!n(2&OB`Y4U+59e5KYGrkGe55O z$6UJil{@PcM^j6KuG;pl^0nRz7+j#$6SUyrxC?_DqoD?xdnbd7tX#+Uu#EE<)%@N) zEEkNsp>rjhqwyn?O%*NPo8zgoY@UCW&?|<+3u6)1NwAG1FsnW}(`t-eERyeFWi|Ys z@ISj(@2J1Wu1%*n(9lrfRl#D-@$sIP_+`PG`>Za%-w2Onl+Km7^fgIrSeSLBY0#8Z zl8N)nMH4Ay^Mym6#m|IFe9aFVC5^v-7;Sb%OuIMzl^i}uS>nA;bNne`7Hs_z?JfC{ znvqu1H}S)~*fYIpn&t9w;u3q}RHV7{vAD@L_L%2BHlr&00s^13x+Y84pQqnAbhul( z&%<5?``j*5J712MEl@Tw(C+yf^#Rc)X!NzaRex)q@Fd_3i~X1PY($D_Q#Lymox!k=&4#N>26jCL`O zCW^iCrZpBEa$oL$rDrCHx$|wlcs$zOw2-=wXN#kPvt|SXLB}D+yzvtY+v}QrV>(vF z4=NJ6&nHK|eP)`M96Gl0YImz)Tw#idj8CTG{VWYFJ^lfxK(KW^F#dES^+pE63D+Cy z1^5^7*=0*V?5pXtem61F%~E#;--4{_<@JVt+BGZpY>=4%`DoQiZ>G1|bw?%DEBS7) zWsM%?C04%=rJk!it=&JePv!aQF>!go0=(Be)}#1)AMZNA66s}-E&PUIzs&aj6d{>K zzTWlYCE1lEk(e?c`Hw_Z`pgxl*hidmHWfdcuN`QhTNH}t=RC~tu2)qqciUFLNXKl7 z^A1R?pMa|Pkhh&=V6gAl<#{oZo2k)?(Y*HXjM zB$Ix_KiG$7f~V$$_JuU1(F3bJFG?-+lKVsnfxD*d-C*Bx^9bHH%IP&r56)hUW^|Ln z?8SzjrAbLMsPs&Anjds2yQb?bVZ6t`b4}>k;jW*4JaiC~w+!gGV#%$q*QtLKH*ndx zM0kLYOPUvC))B4~|IhI5#qnp23Xim>OGGo0iMO2k;C@V`)B(#-#ZqmzhYvD_^O?S# z`wt{y)|R9wjTuo>77xaapj@BSg?*3;akQas3K5`a)>mN3c=`U#G;R@xsdwBB%rybW zLs=2DN}b3nf-6{c3mdiHm+yb+_!lR+lbe3r6*rd~MXfpBQqLT>%u^vi5i%1$_Newu z=;rW)^yJlLEeBZFczZc4xwZut_jD;DsE@D|@qTQEj)$em4 z%*uZ;ulZ`~gSwE_siHiqfs$d3O~|Rq)7h00v!(MDrpCT|aP^((TG=c0yiEyCgD&iJ z?-2~U6ikmZnGM83p|j4q+ax?5nJOR3H3^{{F>JE|mABO_Ju}3y`<^$S<4iZgQTB7i z<4FLQ#2R?8On9QxkcU$~PHc1Go9X)pA+=3dM^8(6mj-&=ZL-{j%y(UaGk%R}KdIFY3zh0V7G=G@SE&WLrF4?uq=Q}TP%kc**BP4_UAN;OegeNSBn2@74|Cu_UPvz z0wxD{%+??GutmzZA=0ScDH&0`i*7 zDxH&47F)b7^859*w9Hf54ZHR;zGH#9wes`Xfw3S~zl)!4ij4U4{@6GoL70dyixGEQ zQ?RbU8V(dyS8HK;0f|)^B4p&v+xL{N~s*6c78^x~=j%H1VX# z|)yF85PSw z;ww#3s&AU3dT~0VfW_^p-hA`9gVY+>B=W4am%LGpe=YkdggeS+mg=~h*ja{i^US-r zxc$aqDN4j7$`YWTF^zT^OD#~gF+7#FnrJhrl8M%;4tsI!jM9-Z0K=xM9a>GrI=V3^cb5aM>!HY4i8m742Oi6&M7((`^;8)0{~RRbb#Zk z>JAAB8H>^*jo0!*Wc<7$%g*gs>CR63?Wa^z< zg zc2wTzppxW2B@?Kyi^chF{s{dCB4F$9%)2UUAj?Hy8;(-4#Vy}Q{CyUa01FyB`on&6 zel_=b%=AmVHz!ovEY++qY~|v0dB;3ct<}xtrlw|6mF)8reHl@bd3Jfog-!@<15d6w z<*-Y?j&{+~k%ZpdQrkX&K*|81{9>J-@Q}}Y1yVO_u-mvn_FK;JJ-l75EiS}E+o3~a zdCi=qu&8=EUYjLz6AGdnUR)(Ld$xDcx{~NvZ1f=oCGJ=i0z_+?hVck}P(Xvps7P;4 ze1oX*Wio`$a?w=EC7EhrV`YqQQ=GV1TJNIJCJ9&Br18rLBQCJ3o}td;+kV0Jk^qJX z{oFX+w!PeCud(GQiQ}uJ6u#2))`iv>V~Z9|m@$?f#MLg-&Gp56s|&p&MyjQ08Y>bW zgx|-0#ydzx`yohTROXylCF6{dVme&N3=hT>8ncUqh03zYN>Qy4V^O6C3}de9mb(A^ z{KQ4IXg$Nm->@%Hc9?Aid)ijz0j7!Riul=XKgYFj!>2_iwcMADP_O+%bk_STYe!g5 znXxo~7LGY6w84krut%R|VIttwGu|uRjew}$r#JFU_CR|UiM=V~u$~a4^ke>xeT#G( zp#7k0?%Q!;Hey>H>%Z!^LB5mhk$n=LTU%(>!QnlSVg+3ioAQyPhnuC{T)Vx<#AVOw z>((tdSgwe0IcTc+(_x5ZP`T`=X;g|O7OM^~KlsT;jV;<}9jzNaWRKce5hw-A36_gO zHR%TMo0ZP}jY1>-Whn4=&lqO7_-|m|&l&9`b}L=<8z1QosX8;r_6}QRV{_*fmw9L^zlSTlQttjI>nNzDRT%|K_OBv%d53THY2v|QugdeqEJ=*tR9?oO`kR2q=hZY_Q&~DiIf;3>fV|^ z|62snrJ$9$0Z~h62zY1L1x#B{55R(|xqE(peG<=CCB#t#igkp>u9w>{is+0Vo=_2m4Oh-^)*pIsrhy4RFxcJlCG7(_?Dkqqw zp4{hVo?Yna@F-A9i?{zqcb`doKr2+~(B3@LAmb$JCIBDn>IQAu29;&mxxG+Z->`VD z|FVaA(=q9Y5t&NK`@xZ(fLh`Ph?jh>^r~9#aP2&kH-W-qVfLGg*kqupE_cw;A*6IC z7FAmK%5y`3P;l~~rB&A{sN*U;lY{}sK2FZEg|DWK!sGRs9fbpqI{97wz{$Aane6J{ zj6vSYt34Z$pb~#W!>s{v3B85ZF)@pqtIw%lAyk_YGctlutZ8EVA`V9g7`^0HC6W zr`Z+4UUwBY2=uAzctX8MN(|K(X^_~MaS?}}RV{y9YI!!luhGe!{Q_ zAru`f?6HW>I}fAmH)acyOV|)artl?<$4Ir%YM}Mn0r7XwX1DBOdcAEHR{k~(miFhV zONgrw)|~?+VhU{IsKe&Q5V=ufXnh&*R{aNCxi6p6pugpTeoIa@y;wV#piT=qjqi`i=x>ltkMKKgXx8!k zDvH^6e9Iw;+f}>6?aISNYp`^ckx3iM4rI2QS`H2TUB5%-NW_g~fSM&`Vo#?%H)ccU zV}QXG-Yz5W`n)mRP?9ZDD{5vo+ly#UQ$@x%d9?za#@plel7=}PR}K{E=!0)B_t*Ur zT{8kCQX3=QsnhY}LUtr!Z8l;aTl=Eh(S1%)aDb2aHi=wWdLr$2i}*p@HH+M_PvMQQ z$K2!M_+<4gHURZDFjMoqlvoq5$;QftApWIt4Dp0@+?AX6r>B}fTqA8dNJ~NfVoVI% zmo=8~P-S)iZarxa-PIK)`pbRs(P8 z9~${_>QTt`^bH+r;!=X6N{__oJ2hJkiL}xj?syqYYa?dhkE)*!8aPwcNqEev08L7r3D-giRC~A6x-_O zTZ)S?#*KO|{QQEyetq8=pGKdzLN=;>&TA%5Fh=@Xf0gT3W;3etoEnxrK&5KWF2;~n zlI@`h`W-Sw{cABgrT)gP1GHuFhT?ydGFn;60MwaQnai@zC~wt!VmX$591`Y6g_~ z&ij~KSwm(jPGjjK6mD+5aa0N$?2;kt!A4N zEE1cKU)wIHpWQs#I?P*B(Yfhv<5wAx5`z8sTua|2aWk4h#-Puk-DvPhc;*Ig5T&!* z!Q)x1eiGx`6?ge~=J*+v^BDT|Fg{N0rg`W{Rv@+%c}|dfEg@w!xRmBZF=#P!cJU85 zbm_S;xkL*2@C@-3luSK0(Wu_Hq(T?yI~&)_Y&px5wPp{yBy;@cvcj?Thww0b?yNvu!?MaN+rV+`VCyVq>O-VNRU>6srGFxb8ju%jI zR}j_w19m@;_R`4wtx4;yx0)oU4sLag4e<3?O!m?oUKIzquSq1g4Q zuxj)ynsURv!&Ek*O=;v@K-e0zbq0rAVyUmy8%@VwOkW_*is z8$~WOy)@{sYZ4D7N1N+QSQ(pLPBm-uIz?*`8MewzsJ8@cYuy}?5iHh zTC=g_(F*f{&dD{Z$1fK}&9~=<*Sen^nX{Pcrk z6w4m@=&A^0X|*@}5gq7S`NZZq3*Dovtns*^jgBvP#Hn2Dmso9AGmQ@rkQ?&A=^@S~ z{5_i(pp{`Y55-DP;!;JUnRVIX4OgURAik{a+A1hl25%1U;b#WI-V`eMO~5VpNx420 zHplo$AhT!^d_kPMC^W-udoE<$vg`pUsOnQ00T|^XajmdY5iS^~aEA;EVQZ5lInp=@ zb=|8IEk;Q(_rqwBa`X8J>=8jz*zEGq6g&zCJ**9p8&)6(nPnGm%#|)L0X90-AW7ad z{g<4QwiXUl#)*9EAqh#Zg)h637e}zkNs19kFX**X-2E2%GVbIqjX*X#Z3*8Ze7nGE zKm>Kpldv(PELcx{w}uwYWkcmyAn|=T^kAZu5(QmZdZqm(q}471<;B&*XBECr_k-M$ z##y=a<3byvOpF0LmPG^0lDgRsMWF4TH*-jDfn`LDfzyCPn>=^9dZyY*?Rmt|wrA=T zB6-KYja8O2on5i%j`#>wh{qXUCM{Hz_M(y2JfIjT*P?QZ}2pUEhhjH z6AU=UYm8dyUm(gUOP`@Ylq=86s9zrtU%5q7fY=(EJXm`}VJ4Z!Ll0v-T0y`HeKroI zKJ3ERGh}GJ+GJQg-jU(kkK0XL+|iVZ2U4pI1dm`SqVHFrh>u??1Lk3DR0GLrsSlf? zg+H!MbzGP&na*-CFgtuj@T(=PNgGthNF)HQ43SBKvyk@H`Z2)F@)8%m9WVtl;{vxI z?go`4&?2p|SDr1oBAsAq8O!XXTQVN)wlp3Pv`3yZUp-6T3-U@wC-cbHQ@61stCGp2 zAP3raBGhrNk^s<{CJbCggY%}+(v#)}N<+JxfYTUTTW2`Mxis-pnR5mfIn_(%apC$M zs9teFzp2Y(U{yTY3iv7*F?@Od8LQYV0>P;aqK|`%%k!=jE^po@Fi<(Rzs%XJEC(I2jPk9lCsoNGVc`_`&!*AR?5#nHLgV^n^! zWLI2(n9|kji4wYQv-vKSSaT(M z;Tg$S4AhEUhnUqbXxtDhRdruu1&FzKlF+0?skWq0;F_w!&Z9wZG|KfL1cLykl+%_V z4UXx=saP4Q{dy(#wZZ+)5>IWnw}jozN=u=Z`ON7%W%azl;85@^^`eR}1`(7jpw+na zodF_Y?LH=1{R)P|O?_#^?wyrQ>xt{Zl>!Kw(A2cp>L2iVm@XAvb_=!C8HO)EVAVzf2C3O+GlRu@kvezr;!x`kz-RfaAiAm9s}un2gDDpKfm zY4NXaP)m~u@8P<6dM-Wd9tWIy**ben0$cm+V2q&BD}~vj=V3A@l)|bOFS2bx6xN=& z@-l!W0#n-#h+Qg-4!wTvqM`zQ<~U-Yp&`poVtDN}TL6^hSlK|gk^+^MSxeRwbR|DV zzK>L00g-XpdG;EOa6+d;4FD5q048jgWc-}-W)Q3i+A;DrML_0eV9rks?7V^NWTMM$ zDgW^b5S4AUK0`km@r;CIMQk|sw+-z~yoO}jLL$$wS}RcO{Ut2Z0YS7p$K4~h`!qfQ zrAPvD;&rJ_kL$@-nQ)Jw>Wmv5>tt{y#Ec4RX?Urg!7 zbsaZ_Dth+AhNX!=?Ca}Uo`}~ZV>6a{I>nT>S3P%8Ys-DuR5lpKdcrso^Le1uX?_Lr z~jBP zh5F(Pvjrt{J?}okkfeHj*j^`mpfI#{=5yCkKhp(C8rhhGuE27Hur@&fLbS6oLW|l^IO^&kdG*?Z7a|$H>Kwm$=S5C{ zHl|QTl-Q%44X4^u)fh$WCyo^6K>L+=+^Xn9=XfKK40*s?j5@Rj!v^7w@+3@7f~+oY zo|&&14tv&IPjk;)Fp?CK;ad3zAR-adn6XYcz6WhLlXq-Q6%m@eD?Rowp}y|NJn_KbH5xYt3T>M zfC|(u6m?yhu!oL68M4mBjzpo_gTqx)>V?U9U||Vjv$?oq<$N2$o_ungIt2>ISX3ds zvAUZ*@-;Ggpblho9KnEbGd$cBo$yefE7mPAfw!uya(_()*a9?W81^$H0Z-ha&`6!48zcLGu*rF}&Sh7W8 zbBZA+E*HROCn?E2Xm`trbE?FTSx2s_{K37A?y>P-PyQ1Sq+gAGNTZNUlT zG`NHGc~D}IxoBymwXL2 z7*G1LM}LozyqHsUXcDMsSucE@fvr>}peEa&6$@YYE-wS{wtz4#Y(;*n9>TDlvSq)g zQ8LmuOy0%Oi5lO)^ugl_gXnsL{1{Xer<{-zZG(rIA@d0c#l3}*=b^*3087keJY zl=psmMk8`=0BDNb-BVm^OloG0lxw10lE}koyUMgA)D<%TA;ovr~sis?=J>a!|jQ~to z3>dr0`w1*tyj-vEb@La_PO~>WQDZ9!AS~4lH&^@s3=Q((g4X&K28`VLA}R;zh>&eG zbjA@kc}AQ34KaB1`p&=1nyQ5e2Gh_`HDoTfEA4%XG#v*I#lpz_8yz~>K;~uh5Cczq z|C3uCuvn5kB{lxXg3{*}@u^YBfYp4idVPvIAAC4A<;y7yp~eE3f@KC?MB5}w)89F* zoIoGEO8rgE>{m2>iyUj03dXX=0ecOg$WoOJPnOu)g_^H23sIVopzcL`NMwz$82ttV zTZ`B)-O0DsZRUsoGaAB(Eq&L`q_iD~D~tyIvusZ2!$G|rJfuwkz>0vh4P1dsH7h5% zQ7js^GmIiAW2F>5%N{IRkm0{-VS3RCP@%;vs{Z!`Ek4zr#cNOS?Cyos8l=;9N*AS( z(f5PNSk#PZ>N#}SLo!W5xPsdp+FY7h8<$TE$;_53JZC+$rNdC0wEWx(**7ZAx^15} zP1>juP;3oSwpNlRL7)~*Iu?q7!3g&vR|w|I=(Sd6HteNXd1m!uCre*_f9#o zQ+%`g#ii3VxfWP4^2K14032g7$Ot)`&QN6KK^=D$0l?S>1gNgQC-BWl(4UDxgvcOS z(-gi|S#-Y4P6X5=J1H=x{jVxsy+RHN?v8DUBURdueiBNKEKor1t{}-@D4DBKK)c1{ zodEDxD_}?Xt@FH|`X_LjUhMQFLRaP3T{kc-Bz75iiHid(Ith6}9`w!nCJN<;8-ld& z(gWS#k2(bE|5414^E1h#Amve$MY-#$9JIR%t`JtngaXFBe^pfN0*m+b+9n^|br2l* zf2wCL+b0u4v^g?Ae%*sugSw9Sk3XO84H;skTR&(yo%jHH?<|K>*cgun*C^J9wE?H0 z(a*=HBf+ZJ`d`fto>nCMxH4*~@z<}Up1ORV=<;Sh)g|p0?7yV7j&@u-kQnY4 zeD9V+jUQcgnCa$;dCtIZrjEz|`sST%S^yYnD^-V;6A)7G6^Yw>f@2*cNpg0Dn$-p$iU6nc8{{E;mrgj@ zyBhBn3(fr`1fhaczl{vdj7HbdCz48p} zGCl1By(km}9r9F|$Htl>Xg5YI*mCHU6M*~{wFIRAN%|a>#;(_YVmO>MfZmq}h^UyJ zS)lEy>tI0`BCQohK0(!luS?f%^Z^f-1V{gyU^(G)(cnv%URqyxi`X9I1COyt2``S* zHed{8=^y|J!-set(3EH7BhNX*c33XjJjjWMO|p4E=8S|)qVion;}_|%xcMPTW}px7 z3L264W0Icky%xC*Y56+W{c0phix~H@bNXbESH`)aZhg)}$Y-g0sYse3;Oh{*j)e+M zByD#LAfSGIQ1`r(;YkWBZ_;;+LqDp7dxGp8t^Z-O-21x4jCG`c7Y);GPcDur=*rJ~ zFCWYt%{idL!+pmzF*xnT@_82kwoAVqY;5D~{hC;&kBd1!8r1j4W^0ckzCsnCz*!xw zBN|2u;`{TSk|yFYnr=*zLOg*Z!CLyVzz%vMaek>MLdfrk(WR^Y4L-TTv{UJUBaoEB z-cpyfwCW$~7zcpCTNvZed1rL=LROJs1?q%uQp|(hv*(W7_#DI1Qo>@?n9dQ!;IlZX zk}?C?hf7!g(U%=;O z{mG}U>K%eT_k+wH+70hI-)Plww)dxuKZD9F^c%M{6yoSJr&WGMzio^X9hXdZTqkL_ z{9qYrFbBnfj=->&wd;5#;D@E9b2n~uluij4-N1KurCobsewc0*ATvmy0C>h`p`8vd zboTh2K0)s@qj4yhfa3MjDsqV8mz$}#y5`-kD)KQI^5NC|1<$`;l8?Xdf?>b3m{tUX z5$(gTa)n`u2O-P#$Gtv!jLoX0(_`X;_t=!J|14L26h)!hC*vS0;^>7d9U48sJkpY^ zl^29ftWDEwLHY)Z^G^!&92+;h=x$o?ti%r(A@>X)AG^rU$1gzlqHGw z1PF#!$d*x|)%kVtFC@;s@LMAxgP(ONpRDe4lF0~$V*^R25W}raudjC8q{rx-VwU_&9uL$){$cJ)A zAmSAXeb_Hp=~-( zc)pVRC9TXkjPJHd1`i&sj#X=P+o3*oz!&N=eMRWSKNOlop zIn^kjkr{_{#Nu9-!{3Q-sV7uqF|0|TV#L2AH>tfTZ~m1wOAe=i0?Q>>W92(SLdq0boAk2qfP1OcDxiLqV%N5?^Tt& z-!b58$aNKDjQqM|g<*(RZbTw2@W}+Q0u^M~GQx#Vs*3y=WN3pf>O$|Dd*2J0Bd_dS zF+FyOwVbG>Ya?9&f04R&tB3~?Wkl6xm*fwF#F@SDU!U!LYa_l*w8S%CVN7fxlOI;D z=$U|*6uqxG&$P{basrOk`k$BnH$mioyHJmfgSA@_@eB%f8$?DMnk7N*LL@=RWukd3#=K*DCSbG6 zB0PaGNgHUw;SeC|o>_qZOu@S;kAfdL6~ZkAs$D5%V^XQXo7wU96lmRyP>)0a(6quf zia<3FsbDMM_)CHT6QN9~%BjjR5~k2|C?U#V#R^TkF_ukc#WwMG=}v;rT?zUn^8KcK z%RT{$=FtgLPAgEyl8{W3SwWcMEvbahG@np(l9Gf8oMe1HFxmJOD>Nm?_~O;ReXKAA za3sbJT>cz6$S`Em%yFo>5WLKw3P@_`2!Jq+==@|L7b^}$z#AU#%w*f*FFDz}(%Ev0ycz5&kkJ;Ib&>q=07e*Wkm}2kPg$Iga3$HGgxj~P$Rq-zaM^=Q z#EtTd!yH=eNz|*PJbUcf^B^=4cz=N?kV4Sx+UO|4V2D8Ydx?$H+fUm7IE%7ysSDw3 zOHqmc`xW?p_{qf;WT7b7L`D{3)L9eKpaYphT~LqMzp>hUNR z=jp7{tbaTrsM+$MG0KR5TcQ<3FfdTj5ABff+Y0@uwyz>(O*G#;W^rAe3bv+gmI-8f z58|6nss`$ro^@rY22~M3)H0n+3{`?k_ORjws;~Tz=^cRlI~0M|ZD%@LP}M59#`ZG_ zJ^D1tUAA!56Ur!B2@+5>i2#fqei}vWUuJG8d@mL6$yh;fmJuOtf;h<#60Og7AO6Sv zLrEvP%jT!u6Pv?+0&&0a&picIA;>J8fCPKAyXxw8?qhg;!=K>|6hAMGe+86A!qY(@ zA}F*VykB@ftAto#DS6JRQXYXBZ6HRxI!Y*E2ypuMbc)RMCK6?5@nQB{AzI~@&=Ur) zGr*PJB4n}QOTvC2>TeFHhZ`ynG78{~oywAVeB0HQJv zYP{0&H1f9O0f9swo<^*Ydqg<(Z{QT0`K*t_dl@bKkXt>P2CyG&2X4hhejdLK*g+9} z{b(>l{XBBfA)h|WvS;&^U5T)7lMJUJav!^DT=7C=9Z*S80t5DKeDFib(Cdr};EKqo zFB=~Mri!BbAwC8526R2YOsp}TIAnuIjqN0|SkmD@OyuH+;O)er)?-M{a0&PpDwBg- zJW%^~RL@?8W)i8Ru4C^XQZgX`uXl(aYzJe0JD6__#AW-rd*CV6;k2|(6Z4?!Nd_|S zvQ`JM_4?Cp!?xCF=1>}kp8Otu*?#1P1NJ)EJ%TRewxO^4)t}!ENJbh;NkVhorXs_v zk@<8m#|SIZFApC`iNDkTFc^N54|4?wK%zQ(FmD@DG-{yxu^X;MAJ<&2q`W>V^Mq#+2 zFRBlf5rt=&BytKZ%dIbuJt0{oA$|i$UoKP=Od&%xan2(PelIYJ7yi!jmv<7MA6B}V zo>gLo`2SY0Xhx&iHFodgU|mC=*gtO-kVUF}h_yz(MbBkDm~9L0-Hxv3Hl3*rkTz6% zZe8KlBfHC`H7=mbuTOY92wnmA{VPaycbM(XKa>vde|#g6Z3_{0k3358U3yM>U^4b@ zMXo?cknT`Zs$sYapKt!Daep6S>)wm61I5?6`C!h_9-?vFJkDvV{rmuYXYg%t^z+WV z58f6PRcY(vEyj?l_*lf;h74Qk2j?8h$1nGtpqS6gdoL1n;ml;dh7pq#TEJGLEJm5gDCuD zuv}>VoeFSDMG`g9lMj%q-sW%E|4w0qxNpmI%sLffvEgTl`eN4XTK$Hx2VYDhYWdSuzorYd+;eT8D6mj7K_# z`rnI_P+bla5vD5>Ev8_pRA>k%S_gw4#;&3gh5&!-$oeazpEtfLRSAgWLJlMRhe;mn zY#fxeKM=zI$^o>XUDpmE=g3rBvT_N`KylP1Pns`X53u z0?$(2i~@!4YMhS63N4#hdLbV&ntZqcfGiZ7-vaHU&Yz2Y>6D9C~tALp)aqEvP zrd0bAt3eJUyWvS7inpQpUG757PY~>yhP?1{GkOMK7F_FKVFfB`bc08>pMp;Rl=XNs z^fd~SXt;$c_JeveqTr^N5L=C=`#|*-0TVhGFvf1d-2fn{_=F%8qIzW1U=Bl?s`?~o zrT+12-q8Gs0*~z85#j+ZiOIrBqGjS=cwe)6D*^h$AcV;+d%VaSLw`4(uXd~;Mq8_1 zC*Ld>1c_Vbb(BaC+6GpDfjS&=<-ijdN?>;C&rwZ>1^BCNL*C{lfLCK21Y}M{kRuR8 zK)DP`KU?;%hNyQ0QOc{xw*~`)rU?C@71c(RB@k-RO~JiOJyXk}$MvGA>Cq`yus%K< zOM=^t)la`Ig;?G;L@;Yv_4oD%=4ysA)nQHKp0e)P-z$3w6m ztbw2wjzvBr{32{-y?+G&zs?y=TSN>(hZ3vAux z(T+4^Q9wN5pQ508B}T}`FdW9t@7JO1+duVJ6_FZ(cC!`Gv94!73VFbm?T`oa07d;N zrU}(Vut_N(Z+eudlM)*A%Pm4qNz*4g=x?Htk3U&@D*=kzTQn+1nTJ5uKCLFW=plrg z&4OxR{it~HA`=ba{PJ!yIWm7&Q|X#m?<>!CCV~iY+5x8ZhKA8h206WJ8QO7*9O5w1 zd=m2j<-v4uNtl~xPgagWBDrqV(ET7qTTxVf6KYtRQ45hb{OUpyxUJ8izGVmB3D8T%lM%;{YSSbf9&i&0$}D6SqahUGDuqR?pm0p0{QNM|<_3(R z`?-mA0mwGh?*i8Tjdi~7luJFm*N^kb326G4yA-TTsvuz4CVBwKi~6FBK+tN@Q_6`Y zLy$j$I59kvi@J&XKwCsHQJh(x0O^xbguw}-TU~(C!0P2#YcwkR`SF$@PA}AdKtc=U zIP=xT=aq}bV$q7OB|1L@x<3j7PPIR)8cmfcBE^m6Sw*L|`RD^6N8CZzDQ!igp(HSF zXt`PHi2|Tr_Jm)MdPXzhwf>EDDF)W)K}E-!uFstwD4drD`tF!~c(D|NW=NJV&Yf9w z4%X0oKfGb+zKJ>%PbRt*u<0t{C|`0?ryquCgcJ*p?H<1e+DOw$Vl8`227Q5%01md1 z+pBqVm_R^B3gjP$ALT3B<9a55N%*n{1arsPmu`QzE-3%mSJBE)GCL>GJ;EPjz(a}; zpG5BEiv!m1;jjmEE669AYB%1PuT-)Ity2Q3sp1gHm1a?($JnB2)QT4-ikJ-mezlm9 zPnO;+t|lTsA8%_#-R3qTI$;L6Zja&5!8hLWx-em*xCH%gWoO7@(Pqz+T`XZF80bs} zrx97Jfts~TH0CV>mZeK4+oiz)K4Fqaw*tqmoI-6fOopLjHhBN)>v>|aGm~(HMa=Lr zifcIPrNjR(1pESsGUP*ch3ucaz6li6ompEG__EIm)D!5OfoN%u`Y@g#aU4P<5Y0*8 zg>=0^$$|l2_bDE7LeT|oTtUv<`pc6rbt8*B8TusH9mycNuo>Vsp)1O2uYg#Sdd7ck zOF6JB2r*8^KBJLCW+j)k)iBd?G?tuzHHTk*{GOrto1q_P2pT0@ft{HM`0$eV3T03V zk@+PQ>WR--C^q!^33M+P@+rNsy0OVyO4+%LSl|DaL;PRL*Z=dW|2HVw|4%RPW7nh2 z$}o$E0G3%Hlo>0{d3uPa`q##(EZX;8(4oV0R6P4L?v!s*xF}8TAj|Db;Keu5oJaH} z-yl5>Y7Z-gt3p63!9X^1T!2Je3ldAS zQ~}pMT+M>NOO5QFz%tn>Obu0fp<^i+g&y7Qh0?By<|2XM6i9bMA7@nd+dw_~w{>Kw zq1S!%B@eKC5*QXGh7iUfqz&#^fpqDiIgg5tx^B5S0)LNR-u!pWCI7QK|9`(b|J~FQ z-Y~^%;x7`la0@1czRx(62t)WKJwxubKL_^Rvff6Z)6#u|4qQP6I1l9bB&08B&L4ue z@nt>s1X?*EK2U^Xb+%6s&HAE~O;Vv|nZk)6xvpLCuGmF|LryT?mk1SGau&J_3P_GZ zt?f!zC5b=k(bwI%t~jcsIS_lDo-1v9m@DY`tcT>@g3S1N=Z}pAFXr!ijEe5&yS~a5 zi#aaHRSujjf_E3WVdAo<^=yO%#fPdr#0%zH_X{A}kcnSK46A(jE+{aGf<;U)t~NoW zzdJ)X$>CS{DMD9IK}{fQ%v5Uzfs0Su$b)@4p2uOmd?hNws3K@p)o5KQq(IbEm6=qz zrCwF>Y)7v3CT!SfR(1@7eY6c1nq_-I=e7r?l`ZbW-$;#c*#uAyoKLg^1~}# z%~@CK^iq-8fTmUr7$RdxISvVsDbUyyu-|+{TqQZPK#YYO1l;_JWH^%suc-m%5aTIN zRVTK{y%V>XDuQlZguBt1?sO2c-hHXAqx4QcYO+ckrbE!kiy7Ubvu^$;JdIAJxVM`X7BmSW;+7 zst3GQuYr6U@%g-OGiK6l`z`YBiS}ZIrJ|r;&RzK~DoaIm9#)Ss>rb;o>PmZEU4}{} zYDse~`oK;n4~%8lgFf$??>HK&yS*u~yz=Q?=uAPNbd-A0oD`z3Dfkt5H1&;Y5&~$m zeTB+E{JCkvv`{NFBRZa_l~G14A8I7k(ls+%VbD7gHAzd$=z&wb>Oek((t`q47Klh} zG~_JLReV~DW>^4h@FEg>E}0_+82mk&a!A|?hxVlnh3t(0#^4yg`8u#a$5e8I+gBGk zu+qzMATue~UCdRW%)lLzzxYN;e6<};mt0TvoR=HwLf%W%uygA`H`E5k#oLwxh~yt! z1HV?(-(J1;+Qr9gKJ!24J#nR*%dF&iJ?CF9I-*gbrJQX9ePJYQ=Pb&eMm$H_v^x;- zt!e35;gxoa9tfbfK{ujHk`w}&fCf+g+B#z3%1XtH*&~vxySeoc=RA9qy(-QAUCj2k zdhb5l--<>*xRB}#!6}Z)t#BFghu}4r`i4jXyZq5{2Z(JTj&gg+f(t?!O?m$aCLkC) z03CL5eg$Zc!oRW0v^0p*hQn~yn{QvA7(k3HY?v4?9x|F#z;R4(p#(x{bw+ z!FXQNP$jSi+%ex@&Hn;zOdL$tZp=?4N!)tY<*Th|2#-eS=i^OX7_LD>g6|3`heJfS z;ub>(cYRji+db6{XD(iv1h~?KLudEMqAnX>jI3lJsm&&U3cw*L0W2gt(nwrf6u0f% z7uKGpkuD2ueQJR_SaTv*(Ahvk^L>T$31HYzW|VMWKZ4uB7=gM))y-u|2*}!KzxgI) ztTU@?giRm|jNjUkE?lxC(G(qg@B?GMF$fxlQ4r`S1+qXCr#Uc#`cb!m{PiKBdJuC# z(6HgsC0W~LkQ+OJo>N<)1WuQzt3&f2vM9z$WHT_h2Zak*icG?eN?)shX+CA-My(r) zhod31+~z={OkE>DU*&=@RUKx;4d@}9VnHJ%#=IfM`jNS{f|b(|O*O!+ID0b9PEZa< zO2YOK;o*xw@;Am8n>;|L3|cj1P65#R@o+;v&M@mL4LKPqQE?lb&4&Dvm1^h^iRhS< z6{7Hztg~K)Ue__VPk9Fxf9B#(^w|OPcg0w*DWs+0%PH+G;zD#rl22=o#edR2#95K( zwKw*I-@Mws=~o4-Zzs0h*MzRR=6!p~Ko$Tr+y9k>?3+mO#RLavu2b(^-0N;RGM}cO zbza-<3Hh*P2GT7MvLqmj9SqfevWE?o?6o<dlH?}}R)(+!_aE*v=W9{pSm(sR0-@2z^oPdMdiCkE z0f-v0-RrLYJ^pP4RAJ=tkWhA{t6V{x&?KBQ`QxxbWQG1Y$}8TX*p#Wxa##AcB;1yqg`65x))AjY3w7Ebi&Da2h)V@=VcY z7}cy5>1ubwsf%r(?!12(6!<=A^RMkB&v8 zy~I4%hdEODR{PUZH1 PsAQ#;u4i4n`}F?;Wr>0h literal 0 HcmV?d00001 diff --git a/stepinim/docs/data/results.csv b/stepinim/docs/data/results.csv new file mode 100644 index 0000000..b192034 --- /dev/null +++ b/stepinim/docs/data/results.csv @@ -0,0 +1,91 @@ +Структура,Режим,Операция,Время (сек) +LinkedList,shuffled,insert,0.154480 +LinkedList,shuffled,search,0.001006 +LinkedList,shuffled,delete,0.000890 +LinkedList,shuffled,insert,1.084111 +LinkedList,shuffled,search,0.000904 +LinkedList,shuffled,delete,0.000629 +LinkedList,shuffled,insert,0.131441 +LinkedList,shuffled,search,0.001123 +LinkedList,shuffled,delete,0.000622 +LinkedList,shuffled,insert,0.163422 +LinkedList,shuffled,search,0.000789 +LinkedList,shuffled,delete,0.000530 +LinkedList,shuffled,insert,0.145036 +LinkedList,shuffled,search,0.000570 +LinkedList,shuffled,delete,0.000318 +LinkedList,sorted,insert,24.938719 +LinkedList,sorted,search,0.106848 +LinkedList,sorted,delete,0.096196 +LinkedList,sorted,insert,24.883229 +LinkedList,sorted,search,0.106409 +LinkedList,sorted,delete,0.094658 +LinkedList,sorted,insert,24.408379 +LinkedList,sorted,search,0.115546 +LinkedList,sorted,delete,0.099195 +LinkedList,sorted,insert,24.421941 +LinkedList,sorted,search,0.102282 +LinkedList,sorted,delete,0.092586 +LinkedList,sorted,insert,24.125530 +LinkedList,sorted,search,0.106052 +LinkedList,sorted,delete,0.093177 +HashTable,shuffled,insert,0.024262 +HashTable,shuffled,search,0.000651 +HashTable,shuffled,delete,0.000211 +HashTable,shuffled,insert,0.022815 +HashTable,shuffled,search,0.000259 +HashTable,shuffled,delete,0.000115 +HashTable,shuffled,insert,0.026916 +HashTable,shuffled,search,0.000264 +HashTable,shuffled,delete,0.000115 +HashTable,shuffled,insert,0.022850 +HashTable,shuffled,search,0.000251 +HashTable,shuffled,delete,0.000115 +HashTable,shuffled,insert,0.023054 +HashTable,shuffled,search,0.000261 +HashTable,shuffled,delete,0.000114 +HashTable,sorted,insert,0.021750 +HashTable,sorted,search,0.000246 +HashTable,sorted,delete,0.000110 +HashTable,sorted,insert,0.022438 +HashTable,sorted,search,0.000248 +HashTable,sorted,delete,0.000111 +HashTable,sorted,insert,0.021394 +HashTable,sorted,search,0.000230 +HashTable,sorted,delete,0.000106 +HashTable,sorted,insert,0.022591 +HashTable,sorted,search,0.000285 +HashTable,sorted,delete,0.000125 +HashTable,sorted,insert,0.021119 +HashTable,sorted,search,0.000272 +HashTable,sorted,delete,0.000122 +BST,shuffled,insert,0.054849 +BST,shuffled,search,0.000554 +BST,shuffled,delete,0.000293 +BST,shuffled,insert,0.053888 +BST,shuffled,search,0.000415 +BST,shuffled,delete,0.000260 +BST,shuffled,insert,0.053399 +BST,shuffled,search,0.000407 +BST,shuffled,delete,0.000256 +BST,shuffled,insert,0.056071 +BST,shuffled,search,0.000412 +BST,shuffled,delete,0.000261 +BST,shuffled,insert,0.053024 +BST,shuffled,search,0.000409 +BST,shuffled,delete,0.000285 +BST,sorted,insert,24.942325 +BST,sorted,search,0.108153 +BST,sorted,delete,0.094860 +BST,sorted,insert,25.196583 +BST,sorted,search,0.109160 +BST,sorted,delete,0.096340 +BST,sorted,insert,24.691507 +BST,sorted,search,0.115560 +BST,sorted,delete,0.094962 +BST,sorted,insert,24.461825 +BST,sorted,search,0.103381 +BST,sorted,delete,0.095198 +BST,sorted,insert,24.798636 +BST,sorted,search,0.101888 +BST,sorted,delete,0.093775 diff --git a/stepinim/docs/otchet_1lab b/stepinim/docs/otchet_1lab new file mode 100644 index 0000000..6675f22 --- /dev/null +++ b/stepinim/docs/otchet_1lab @@ -0,0 +1,44 @@ +Анализ по пунктам задания + Влияние порядка входных данных на вставку в BST + На отсортированных данных BST превращается в связный список + (все узлы добавляются только в правое поддерево), + поэтому каждая операция вставки требует прохода по всем ранее вставленным + элементам. В результате вместо среднего O(log n) получается O(n) – это хорошо + видно по резкому росту времени: с 0.02 с до ~2 с. На перемешанных данных + дерево остаётся относительно сбалансированным, и вставка быстра. + + Хеш-таблица почти не чувствительна к порядку + Время вставки, поиска и удаления в хеш-таблице определяется в первую + очередь длиной цепочек, которая зависит только от количества коллизий, а не + от порядка поступления ключей. Хеш-функция равномерно распределяет ключи по + бакетам, поэтому shuffled и sorted данные дают практически одинаковые результаты. + Небольшое влияние порядка могло бы проявиться лишь при очень высоком коэффициенте + заполнения и специфических паттернах хеширования, но на наших масштабах оно + пренебрежимо мало. + + Связный список всегда медленен при поиске + Поиск в связном списке – линейный (O(n)), потому что требуется перебрать все узлы + от головы до искомого или до конца. В нашем эксперименте поиск 110 имён занимал + в среднем 0.03 с, что на два порядка медленнее хеш-таблицы и BST в нормальном + режиме. Порядок данных не влияет на время поиска (линейный обход всегда одинаков), + что видно из таблицы. + + Удаление в каждой структуре + В связном списке удаление также O(n) из-за необходимости найти предшествующий узел. + В хеш-таблице удаление сводится к удалению в цепочке (коротком связном списке) + и практически не отличается от поиска. + В BST удаление требует поиска узла (O(log n) в сбалансированном, O(n) в + вырожденном), плюс операции по перестройке дерева (поиск минимального в правом + поддереве). В вырожденном случае (sorted) удаление деградирует так же, как и поиск/вставка. + +Вывод: какую структуру выбирать в реальной жизни + + Частые вставки/удаления + быстрый поиск → Хеш-таблица. Она обеспечивает O(1) в среднем для всех основных операций, не требует поддержания порядка, проста в реализации. Идеально для словарей, кэшей, индексов баз данных. + + Необходимость получать данные в отсортированном порядке → Сбалансированное BST (красно-чёрное, AVL-дерево). Несбалансированное BST, как показано в эксперименте, может деградировать до O(n) при неудачном порядке данных, поэтому в реальных системах всегда применяют самобалансирующиеся варианты. Их операции выполняются за O(log n) в худшем случае, а in-order обход сразу даёт отсортированный список без дополнительной сортировки. Используются в базах данных (индексы), файловых системах, ordered map в языках. + + Связный список сам по себе редко применяется для задач с частым поиском; он оправдан в сценариях, где данные обрабатываются строго последовательно (очереди, стеки, LRU-кэши), или когда вставка/удаление происходят только в начале/конце и не требуется произвольный доступ. + + Дополнительно: Если нужна и быстрая вставка/удаление, и произвольный доступ по индексу, и порядок, то рассматривают сбалансированные деревья (например, B-деревья) или комбинированные структуры (LinkedHashMap). + +Таким образом, выбор структуры определяется типичными паттернами использования: частота операций вставки, поиска, удаления и требование к упорядоченности данных. \ No newline at end of file diff --git a/stepinim/lab1_structure/test.py b/stepinim/lab1_structure/test.py new file mode 100644 index 0000000..2e18dd8 --- /dev/null +++ b/stepinim/lab1_structure/test.py @@ -0,0 +1,255 @@ +import sys +sys.setrecursionlimit(20000) + +csv_path = 'C:/Users/xalva/2026-rff_mp/stepinim/docs/data/results.csv' + +#Связный список +def ll_insert(head, name, phone): + new_node = {'name': name, 'phone': phone, 'next': None} + if head is None: + return new_node + + curr = head + prev = None + while curr is not None: + if curr['name'] == name: + curr['phone'] = phone + return head + prev = curr + curr = curr['next'] + prev['next'] = new_node + return head + +def ll_find(head, name): + 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): + result = [] + curr = head + while curr: + result.append((curr['name'], curr['phone'])) + curr = curr['next'] + result.sort(key=lambda x: x[0]) + return result + +#Хэш-таблица +HASH_SIZE = 1009 +def _hash_name(name): + return hash(name) % HASH_SIZE + +def ht_insert(buckets, name, phone): + idx = _hash_name(name) + buckets[idx] = ll_insert(buckets[idx], name, phone) + +def ht_find(buckets, name): + idx = _hash_name(name) + return ll_find(buckets[idx], name) + +def ht_delete(buckets, name): + idx = _hash_name(name) + buckets[idx] = ll_delete(buckets[idx], name) + +def ht_list_all(buckets): + all_entries = [] + for bucket in buckets: + if bucket is not None: + curr = bucket + while curr: + all_entries.append((curr['name'], curr['phone'])) + curr = curr['next'] + all_entries.sort(key=lambda x: x[0]) + return all_entries + +#Двоичное дерево поиска +def bst_insert(root, name, phone): + 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): + curr = root + while curr: + if name == curr['name']: + return curr['phone'] + elif name < curr['name']: + curr = curr['left'] + else: + curr = curr['right'] + return None + +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'] + if root['right'] is None: + return root['left'] + min_node = root['right'] + while min_node['left']: + min_node = min_node['left'] + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + +def bst_list_all(root): + result = [] + def inorder(node): + if node: + inorder(node['left']) + result.append((node['name'], node['phone'])) + inorder(node['right']) + inorder(root) + return result + +#ТЕСТ +import random +random.seed(42) +N = 10000 +base_records = [(f"User_{i:05d}", f"123-{i:05d}") for i in range(N)] +records_shuffled = base_records.copy() +random.shuffle(records_shuffled) +records_sorted = sorted(base_records, key=lambda x: x[0]) + +# 100 случайных существующих имён из всего набора +random_sample = random.sample(base_records, 100) +search_existing = [name for name, _ in random_sample] +# 10 несуществующих +search_nonexist = [f"None_{i}" for i in range(10)] +# 50 случайных для удаления +delete_sample = random.sample(base_records, 50) +delete_names = [name for name, _ in delete_sample] + +import time +import csv +import statistics + + +def measure_operations(records, struct_type): + results = [] + for rep in range(5): + if struct_type == 'll': + head = None + elif struct_type == 'ht': + head = [None] * HASH_SIZE + else: + root = None + + start = time.perf_counter() + if struct_type == 'll': + for name, phone in records: + head = ll_insert(head, name, phone) + elif struct_type == 'ht': + for name, phone in records: + ht_insert(head, name, phone) + else: + for name, phone in records: + root = bst_insert(root, name, phone) + insert_time = time.perf_counter() - start + results.append((rep + 1, 'insert', insert_time)) + + start = time.perf_counter() + if struct_type == 'll': + for name in search_existing + search_nonexist: + ll_find(head, name) + elif struct_type == 'ht': + for name in search_existing + search_nonexist: + ht_find(head, name) + else: + for name in search_existing + search_nonexist: + bst_find(root, name) + search_time = time.perf_counter() - start + results.append((rep + 1, 'search', search_time)) + + start = time.perf_counter() + if struct_type == 'll': + for name in delete_names: + head = ll_delete(head, name) + elif struct_type == 'ht': + for name in delete_names: + ht_delete(head, name) + else: + for name in delete_names: + root = bst_delete(root, name) + delete_time = time.perf_counter() - start + results.append((rep + 1, 'delete', delete_time)) + return results + +all_data = [] + +for struct_name, mode_label, records in [ + ("LinkedList", "shuffled", records_shuffled), + ("LinkedList", "sorted", records_sorted), + ("HashTable", "shuffled", records_shuffled), + ("HashTable", "sorted", records_sorted), + ("BST", "shuffled", records_shuffled), + ("BST", "sorted", records_sorted), +]: + for rep, op, t in measure_operations(records, struct_name.split('d')[0].lower()[:2] if 'Linked' in struct_name else ('ht' if 'Hash' in struct_name else 'bst')): + all_data.append([struct_name, mode_label, op, f"{t:.6f}"]) + + +with open(csv_path, 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(["Структура", "Режим", "Операция", "Время (сек)"]) + writer.writerows(all_data) + +print("CSV сохранён в docs/data/results.csv") + + + +import matplotlib.pyplot as plt +import pandas as pd + +df = pd.read_csv(csv_path) + +df_avg = df.groupby(['Структура', 'Режим', 'Операция'])['Время (сек)'].mean().reset_index() + +fig, ax = plt.subplots(figsize=(10,6)) +ops = ['insert', 'search', 'delete'] +x = range(len(ops)) +width = 0.12 + +for i, (struct, mode) in enumerate([('LinkedList','shuffled'),('LinkedList','sorted'), + ('HashTable','shuffled'),('HashTable','sorted'), + ('BST','shuffled'),('BST','sorted')]): + subset = df_avg[(df_avg['Структура']==struct) & (df_avg['Режим']==mode)] + times = [subset[subset['Операция']==op]['Время (сек)'].values[0] for op in ops] + ax.bar([p + i*width for p in x], times, width, label=f"{struct} ({mode})") + +ax.set_xticks([p + 2.5*width for p in x]) +ax.set_xticklabels(ops) +ax.set_ylabel('Среднее время (сек)') +ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left') +plt.tight_layout() +plt.savefig('C:/Users/xalva/2026-rff_mp/stepinim/docs/data/grafik.png') +plt.show() \ No newline at end of file