From 8f4473f8fab5688dad9deb1ee3f9015b06a6b853 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Tue, 18 Apr 2023 00:25:01 +0300 Subject: [PATCH] update analysis --- Lab2/Program.cs | 89 ++++++++++++++++++++++++++++++++++++++++------ Lab2/analysis.ods | Bin 4383 -> 19324 bytes 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/Lab2/Program.cs b/Lab2/Program.cs index a9d7ecd..2908f8f 100644 --- a/Lab2/Program.cs +++ b/Lab2/Program.cs @@ -1,5 +1,8 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection; +using System.Security.Cryptography; namespace Lab2 { @@ -57,7 +60,15 @@ namespace Lab2 return n; } - public static double TestFunc(Func T, uint n, int value) + public static double TimeFunc(Action Func) + { + var before = DateTime.Now; + Func(); + var duration = DateTime.Now - before; + return duration.TotalSeconds; + } + + public static double TestFunc(Func T, uint n, int value) { int[] data = new int[n]; for (int i = 0; i < n; i++) @@ -65,11 +76,8 @@ namespace Lab2 data[i] = value; } - var before = DateTime.Now; counter = 0; - T(data); - var duration = DateTime.Now - before; - return duration.TotalSeconds; + return TimeFunc(() => T(data)); } static void TestMethod(Func F, string format, int bestValue, uint[] best, int worstValue, uint[] worst) @@ -88,13 +96,73 @@ namespace Lab2 } } + static uint Recursive(Span board) + { + if (board.Length <= 1) + return 0; + else if (board.Length == 2) + return board[1]; + + uint score1 = board[1] + Recursive(board[1..]); + uint score2 = 2 * (uint)Math.Abs((int)board[0] - (int)board[2]) + Recursive(board[2..]); + + return Math.Max(score1, score2); + } + + static uint DP(uint[] board) + { + uint[] cache = new uint[board.Length]; + cache[0] = 0; + cache[1] = board[1]; + + for (int i = 2; i < board.Length; i++) + { + uint score1 = board[i] + cache[i - 1]; + uint score2 = 2 * (uint)Math.Abs((int)board[i] - (int)board[i - 2]) + cache[i - 2]; + + cache[i] = Math.Max(score1, score2); + } + + return cache[board.Length - 1]; + } + static void Main(string[] args) { - string format = " F({0}) => {1}s {2}i"; - //string format = "{1} {2}"; + + string format = " Recursive({0}) => {1}s"; + foreach (var size in new uint[] { 10, 30, 35, 37 }) + { + uint[] board = new uint[size]; + for (uint i = 0; i < size; i++) + { + board[i] = i; + } + + double time = TimeFunc(() => Recursive(board)); + Console.WriteLine(format, size, time, counter); + } + + format = " DP({0}) => {1}s"; + foreach (var size in new uint[] { 1000, 10000000, 30000000, 60000000, 180000000 }) + { + uint[] board = new uint[size]; + for (uint i = 0; i < size; i++) + { + board[i] = i; + } + + double time = TimeFunc(() => DP(board)); + Console.WriteLine(format, size, time, counter); + } + + + /* + + //string format = "{1} {2}"; + Console.WriteLine("methodToAnalysis1:"); TestMethod( methodToAnalysis1, @@ -102,15 +170,16 @@ namespace Lab2 -1, new uint[] { 10000, 100000000, 300000000, 600000000, 900000000 }, 1, new uint[] { 500, 600, 700, 800, 1000 } ); - */ + Console.WriteLine("methodToAnalysis2:"); TestMethod( methodToAnalysis2, format, - 1, new uint[] { 10000, 100000000, 300000000, 600000000, 900000000 }, + 1, new uint[] { 10000, 100000000, 300000000, 600000000, 900000000 }, -1, new uint[] { 10000, 20000, 30000, 50000, 100000 } - ); + ); + */ } } } diff --git a/Lab2/analysis.ods b/Lab2/analysis.ods index 564d296eaa405a64e7df1838af3b550bfe493548..0ca82de4e2dc058a53dbe35b8dc09817b3ef8b99 100644 GIT binary patch literal 19324 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 V3KHt|9VFmS1@IK97khp7e*hhI|Fr-B delta 4096 zcmZ8kWl$835Ky0qrR>6Qk^_;9@LNz%8-YZTMJ!?K_&zKmXq2uS? zd}+CMvb;!joS!vaH#A(=k095ziWP#3+&U;C47CkqY{pQI9dlqC7d>*A?r|L)$-~>H z0qq7I+%>tmxdY~UG=@+OwqD!Wfna!9QDjGPPRS1=rHl9Wy_G@kG0$6WDW&&NOyTcH zH}2$v6JAafQ}n%w_^g_SF~K)&X~%ESXBCSzVXhwC-ic?VGb{_WX>s<7lD6-^$%$g4 z>k#j_vXDe%ZvDdQnbDp;-iJC1b|Iy>kOJUncJzY;(?>%+E@5Z^@~-HVzfk-hU8>&g z$yk1dyOKxx+G5Yb?1x@{YuEOCAJ>^l!-@i8wy@XFx1W6UjHA|^0$(5&O)!jdCmK7A zCz+ZNa!RHU72?Y1_8WnTw=8dt@6Nht6P`)J^Cnv!^9Vb|___}oDOhnR#dec#Te6-wuCw(YhYJ4&4-RYjFC zm=^ma)Q^}{4K=nyV~)PVoJWD%8Q*hhW#p|NB}A5D^=eI1_oiJXX#h<-)P-5uZL5Yt zyoymt#9c~DKIxxAy?w7YBQ2B?srWa^9CY9BE(bW(8s9*t?8i4iB*_=duTF~PcI#_- z8(y{H+PxhTPQv;9xRq0<$+w<9I9l2Zii2FO=yzj#i$=x)PgIWL35m=jgpbD2u!0gU za#YFs^2ok~OXT3(S1EVu_fMISG~*PqcJ)Qj9pM`~lV%v5^3nn?53C>zzbT`NaMwI` zPX~WkU!Fqw3o*rUsX+PM6A||eL^po)89=48c(4Ai3spWx#+`6v{DTGcRJ^+&PXv&N zfg_7qix*g?S{x&M?e&_N|CodW<#%_q3_j-<>m>&GlTy40CD;Z}CfQ=c%_)tJBQ|m# zhrK|coZ-?y3}p;Wi{GN#db#ykFxnJ19YAc}%4R+<^r+aqs4 zAyH7&7U1%w|ok~0X@uEUJcveOcB3ymyfSuNg)9t zd67Iw2Pqb%4{umhE;!=zUjsi45%b0EU*zL(u7^Dl>R!csiJu&R42#y`GZl|X%2*)8 zd!hID(-i)?>048S88Hs?fh=nK$WEE3gUsh-JsK5s-U}#L27`{a*e2-PG2ev0dSllu zycTm5JBPWxMMG^}{ZowxVi7{o@c<&)tcYeo$_QF6Onq7$%n8M6P&A!0$;=y{t9&g7HpYw_Ja$EL_< zR!+tu2Y#f=Aha)Es&$B)ZDzoUQcz-Q&P1ntpWQeP+u55bYo7Ck>6~#0wnv_?d>{Bh zniU5CdkD3Mw%53@Ea2r}Ui8lbt|6#Xz@B|Q@C4gXT7QWlfd8o^fE4z2gT~Z3AEN?m z>4Nf0bkL<}5 z`?cJ`PnZfYTq^e3=*7lcrEgL5(e7;(;_79NL9=7*9+2R3W3#OCL2bd>Ai0*y z%RPTQ{=l?UPH3y9Bw{}PD7UnDCbf+#Zbtld3z#yA?KeM?T4dXnv;eNXH+B3j_MzXj z+D=ID<5`)nAni;6Ze5R^GqdNAkuh!4M6%i-?P@_e{4$rD$pC8^Dxea@G1)ecMFf@y za7M3b?x8a!1}0#_(T+e_gK6>^0OCN^5~ePe4@f+wU}q&WAfvAP;U6_c0hS@xu2@YK z-q$2Z&RNN%@W6005OGuch}W*cdHaOF_f6(L95Nu`yk=j}!%kGYqG23e=HL3pO|^MN zBqk|4Mp<58+CCCG%e>(rKY;%87L~;TH-msA(%#>(O_n7-)C2tpUB8;6BqddrDwniW z(P7k0>oa-Q#872HqCH>W9S5665v%A38ez_vIJGdBW~b%;0D)B07PvT&ny@5KImGGX zh#fulsq|TAhxmN_)og8b7L`-@GuZbBrlD#RU@ryh(XmSjwB>wvyrgZ7tIbhG6 zmLRqLuOn|x+wd|F;Map2`k5}fTHbDCF(H7^8#lOgnz0GB*|FKleh@Eo!vc=3?=Xt6 z^;cOc&M~4j%Y zaWL`MXLLS~_BJM~!;gb``c}@Wy4hQGfkPVYOFy1&EuZ2Z{ht{mpax=xV5%DZtjsvH zR!i5;O`Fq=Y5pc{6`kc0JK%JwcD>}j0()~pIxY^yTh$F>!sABgjUf8)#IPx7xhlME z5+6dAVf%LViak7GSCiUfZoyOZTqtt%VK0Kpvg6q>&CQ(xM2fudcZ%|^V!NeTg(JAj z{v%F?XRJ!Q_!jMR8d9Uv0_weLmz??$k*;i@+>_HeHDJvsfYguHCx!;G`*ek`*C|>z zB!~%3p8KVB`{@4L1RqGXZ%DsSxOG!<^YiCGfjW7?GHyn@VslhTYLzcq7J+a#3Xc5a zweR3YWwEF`fYz!Ipt!teFdi*MZzT&EOflNo2u?0)=p^NXkb|^TM$D~=y-bu#-V3W z#ML7Qzxa8{9ZPg$Le3=H?E%gU*q8Sx&ht*S4qNw_c)3GIDfB7Y$txs)C!bob39Asw z8PxR(QoN3DYdnons8yuPvUdpeBVadeH)<=d-=C^R0B4%slYK?3a(AdK2+c}#Vm7u{ zD7gK3w4cZeU3apvhtTfP{hq@fuI$CRRZJteC|-XCLr}5&Ui0@=4pR|O+gxS!dAepW zHLLkJ(hI-y?ws3)CA>#2zx-a}lWYie6zU6KRehLMbA{BdM9hLqU(aHiwq@(C8t`!3 z7noTTfKt(onq zvOM2#U2fH!BGd1Q(@a&-3UdP10~07H0#5iogHj zw3ks9g6>}FErI><&d9#9rpN0qp7f77Z2dd}HyR$6)VsN>o+Z(9WI)R8Xjcxp-xNTY zx)l)kCtAu}qP5y*{NFmUgQ+t!3x~h(7)X3rm@6OvYwy=yA{TF(>mE4+HZpqN8d|CT zNm$i+csX^F5)TSvQ+z0?xMw7~)_UN1&Jw=W>hbH50JcE@g2s&!oG<=mNgz}Jfb_4` zQZkf#uBNTb_tMtW)ydKO-@K_dRn84f09WZIX01O!#;=K+t>8E)@;6{$UKnUD%B(fA zBCTzk?x&|(ETKmBD>M))mQ|}Q=3TRMjp%ZT0l8^j9b6A1m(OZQade|Cu)3|%u5ClY zevlUlLm3m7vFFsjw9X$nvYAAXNJK^+v$Xw4wZqepBfjxow_M$(l_*bAu+BAsQ?4}c zND8NxE*P&5W7tQ^&Cg%Txq~rM!;+=+gsoA={Tnt#nH8m(5?WHIA@fNdL5J3}kErn4^*20aHY;uZ>*&C0N7NxPJgORjHpz9!w-TGaDAqQ#!Sq z6i}{(JInD0qYG&)LenSgjv56`A55gYvdlQSt|$l6Y(qTq5w*+qoct~n6<65~=%ua* znDL%hg}-H%uM#NrI_Mp9Lb~guk|IXU{z=@aFQxNh6v}Xv?{yO~BB&FGPk>3&7*ddz zn8J=iCFAwnY(k;%4oMNFZc;X)5n?Nv!(AG=B~FTOmuM0!yAif!WmgV5j%=+;3M2Xz zT$zqp<*J=1%%>mJS`HrL?Ck!NJq{(oJd(j4aDf_k+bL^E#)u9Ht?&7#SeHMdz#3IF zvH$mK!!T8OY5t#&|84z$LF8to54qRXzySUOV*FKxzu5-_|3v=+bx5bs