!#"!$!%'&(&*)!+! ,.-0/2143514687914:;=<><>? @BADCFEGHJI KMLONPRQ.I KML @BSTVUXWZY\[]C_^'G`2acbXad[fehgji.klad[dm!LjnZK5oZNpK\qVPdq5H5LrsCFTJTVY\TtPRLJI KML5ucIwvyY\x zZYMT|{~}J[E.adTmL4nZK5LZN nMnMQ\H4n5nMn5njmM. 4b]Y\>YMT{k5 [XadTVUsk rYZbXad[!PdLVI K5L5ucI @BfYZ'=Y\ TJ^9Yx bXadT4b]Y\adTGoMLVI @B{~acblgj^5UX^M[Y\ TVUXa[Rm4~AvOGjKQ\qOm.qKMomJ#|q5H!mV!GJQ\qOm.hq5HOI @BvkYM _JaRE.a ¡G~¢J£\¤=¥Z¦¨§\©«ª¬R¤=£!YMT4bXadzjTJCFTJ^4Y\[D9Yfx ­®®Shq\N¯iJ FY5EI9fYMTY\x [UXz4[]CFWY#9Yx iYMx EJY U¨C°E.5[XTVYy.fbXajbXaT±0YMx U¨bXa#zj}JTJTVY ¡Y5 UXY5U }.b]YMTf¨M [U¨bXM[]CFTJ^5UX^M °YMUdIST4bXaRz4TVC_TJ^4Y\[U¨5 C_T4b]a}JJ.sgj F _ad[E.acbXb]Yzj[]YWz5Ma[Y\b¨bi'aRU¨ °Y\^Mb]Y5U² ³ M []a ¯YM UXTJC_TV^5U]Y\T4bXaRz4TVC_TJ^4Y\[5EJY\b]Y5Ulb][X}Jz4b]}J[Xad[DCvhYMUXzMad _ ¡mJYWy{~[]M[{kla[]TJa[ @´jzj[XCFWblg.E. FC_^Mbj E.C°UX'5TJa[YO'Y\J=a[]acb9Y#x ab¨b ¯Y\ J FC_^MbhUdY\ b¨bdI @B{M [k¨YOWZY\[klaTjgy}JJV^MC_b9Y#x T4g4bXbiJ FY5EI @´jzj[XCFWadTVEJYMU¨b9Y#x aT UXCFEJYYW'Y\J=a[]acbRI @Bµ ¶'·¹¸»º ½J¼ ¾¿DY\ F °Y#UXWZY\[UXzY#\b]C_W5a[YMU~WY\ ¡² @B`2'YM TJ^5YW.E.[Y\^zZYMT ^5adU>¨5 [MT5 E.CF^\b Y\x TJ^4YJmz5MJ FCFa[YME.a2ad _ Fa[4Ulb][X}Vz5b]}J[]a[YME.a ¡4 U¨TVC_TJ^4Y\[RI @BÀg.zZY!b]C_ F ¡² P PMIST4b]YM^Y\b¨b!E.} URYZ bXbXad[CFT ad _adaT4bXadT qVmKVmQ.mPMmyacbXb abXa[ab¨brsCE.adTJTVYM[E.TJCFTJ^4uC ¨M k¨Y\TVEJaEVYZb]Y5Ulb][X}Vz5b]}J[]a[rsVYU¨b]YMTVEJY\[EJYM _^5M[]C b]#ad[XT'Y¨M [CFTVURYZ bXbXTJCFTJ^4u r»Y4uYMTJ _CF^\biVC_TYM [¨bURM z4bX[YM Em.}.b]YMTiVYM FYMTVUXa[]C_TJ^'I~r¨P'u rsi'ujV FYg4bX[YM EIDrK\'u r»du±r¡Q.m q4u¯N¡bX[YM EI M C_9YMx ^Y\b¨bCE.aRUXU]Yb][RY5 E 'Y\[Y\ F FYCFTJ[XaTJ.E.ad[#ad _ °Y\T0Q. q iVYM[XTI2Sh _ °Y ¯M W _CF^M^5a[9YOx UXYM#YEkl}VyU5Yx bX[YM E.abY\ [=a[Xsaz4b9i'Y\ °Y\TVUXa[YZbRIY\[kla TJ.E# °Y\^M[Y\[a F FYMTPD.K a FaadT5bRm\.!b][RY5 E.acbVYM[adT#URM z4b][RY5 EJU¨ad^MadTVU¨zZYMOU¨5 ^5aTJad[]YM _C°U¨ad[]YM[~EJacbiJCFTY\ [Y#Ud5 z5b][RY5 E.acbUIrK\'u r»EVuvhadY\ r»aT0WZY\TV _CF^ iJCFTY\ [ ¨C_TJN¡JaRY\ UXM FYM^M[Y\[C_T'UlbYa FaaT4bXabC[]\b]aT'ucI rK\'u C_b]Yj}J[hbX[YM E.adT i4gj^5^5U}JVfUlb]a^¨5 [U¨bXa^yacbXad[hWZY\[kla!CFTVURYZ b¨b]TJCFTJ^.¨M []zj FYM[]Y#WZYME U¨5 YM TVE.a[R² rY5u~[YM z5a[DE.acbhE..zyY\b¨bhE.}[]C bY\[E.abhU¨ F}.bX^5C_ _bXCF^5Y#iJCFTYM []Y#Ud5 z4bX[YM E.abdI Q.ISWj^'5 [MWYM[¨bjab¨bYWy¨M k¨Y\TVE.aYMx U¨b4Y\x adTVE.adT8YM [hU]Y\T4ba F _ad[»Y\ °UXz5bR ² 9TVEJY5UlbhUXWZY\[ adEzM5[X[]az4bMbXCFWMa[]CFTJ^^M.Ejb]YM^MaRUI r»Y4u aTY\ F^M5[XC_bX 'Y\[E.adTY5U¨gj.b]\bXC°UXzYz5MJ Fac.C_bXacb]aT rlPuU5Yx bY\[9E.adTY\ F b]CFE FC_zZY Y\x TJ^#b]CFEYZbXbac.azjW5a[Y!5YW.UXacbXbDCFTVEJY\b]YVIDr¡QZ'u rsi'uvc k¨E.adTYx acb¨biVC_TYM [¨bURM z4bX[YM EyadE TVjEJa[!Y\ [YM _ _bXC°E rs FM^ ucIrQ\'u r»dueacbh^=Y\ F _ad[Y\ F b]CFEYZbXb rs FM^ u rs FM^ u«Ir¡QZ'u r»EVuvc k¨E.adTYx acb¨bOr¡Q.m q4upNb][RY5 EyUXM °Y\^5[]YM [ a FaaT4bOYM [Y\ F b]CFE rs FM^ u«IrQ\'u rsaRufYMT´zZYMT UXM[XbXad[]Y ab¨b¨YM b9Y x bXC°E.aT r FM^ uOCaRE.a _b]YM ^MaTVM YZbXb¨M [Ulb URYZ bXb]YCFTE.aacb¨bacbXad[acbXb9CVadTU¨zjCFJJ FCFU¨b]YVmM.U¨aREJY\TJ F.zY }.b~E.aCJM[E.TJCFTJ^ s[jY\x T}JTVEJa[UlbY[YMEJaTyCU¨zjCFJJ FCFU¨b]YMTIrQ\'u KJIwr»Y4u ³ M k¨Y\T'E.aJ[]M^M[Y\tVYM[U¨5 CFTVEJYZbYacbXb¨Y\ _byYWJad bY\ ¡I ! #"$% &(')*#$% +-,$!+/.. $ "0"$. %1 &2'3465784,2#9:4.. "$#"$. < ' ='0" ;4 C_ FzMadT Y\ [ N¡z5MJ Fac.C b]acb]aT0J4U!J[]M^5[]YM³ #ab!}.b¨b][Xg.z4b#UXM s}JTJz4bXCFMT´YW m ¯Y\ TJ^4E.aTV5UCFTVEJY\b]Y\¨Y\ _bXacb?> \b]C_W5a[YJ² 5 [s}J F '='YM TJ^OUXzZY N¡z5MJ Fac.C_bXacb]aT WZY\[Y#aT XUXzZY\[]!}VJVUXzY\b¨b]TJC_TV^VIhrK\'u rsi'u ³ M k¨Y\T'E.aJ[]M^M[Y\tVYM[U¨5 CFTVEJYZbYacbXb¨Y\ _byYWJad bY\ @$A=I B &C/D * 1E AF( ! $G IH A 1 &(')*4J% :4, A :4.. GK4% &(')*#$% +-,$!+/.. GK L/..1 &(')*4J% :4, A :4.. $ 6M%N H OG;4P% ( LQ..-4 GK;42?RRN < < ' ='! < C_ FzM adTfY\ [9YM _^5M[]C b]#adTVU ³ N¯zMMJ Fac.C_bXab9}.b¨b][Xg.z4b9UXM s}VTJz4bXCFMTyYW¨YM b]acbU9U¨bXM[XN Faz .S A?> MbXCFWMa[YJ² 5 [s}J _ .='YM TJ^UXzZY N¯zM5J _a.C b]acbXadTOWZY\[YaT ]U¨zZYM[X }JVVU¨zZY\b¨bXTVC_TJ^'Ihr»KM'u r»du Sh [E.acbzM5[X[]az4bYZb¨bJ[]M^5[]YM#abUXM[XbXad[]YMT[ ?> (k¨YJm~\bXCFWMad[]YV² TJa¨kcm FMzZY\ FC°U¨ad[]YOsa FacbR²hrsq5'u qVI ³ M k¨Y\TVE.a^5[]YMTJTJYZb][XC°U~[XadJ[XaRU¨adT4bXa[Y\[~aTWjCFz5bYMEM[]C_z4bYME^5[]Y\lI G R G R R R R R R R R R R R R R R 5 5 R AYM _adTCVYZb][XC°U¨adT[XadJ[XaRU¨adT4bXa[Y\[2i9YMx ^5YM[XTVY5UW4CFz4bXad[dIbXbUlb][XaRzrsNpu2i=acblg.E.ad[9YZbXb9i9YMx ^MaT UXYMzjTVYMUdI r»Y4u C_b]Y^5[]Y\saT²Y\ b¨b}.bWjCFz4bXa[]TVY#9Y#x i9YMx ^5Y\[]TVYVI~r¨P'u rsi'ufYMT8zYMT±YMTjW>YM TVEJYeC klz.U¨bX[YMUY\ F^M5[XC_bX(¨5 [!YZbXb VTJTVYz5M[Xb]YMU¨bXa#WY\ ^5aT ad _ °Y\T b]W2Yx TJ.E.ad[hC2aT ^M[YZlI .M(C2 FYMi KWjCF _ Y\T Mb]Yyi9YMx E.aWMab]YWjCF _zZYyTJ.E.a[U¨5 FC_^5^Mad[O9Y x E.aT z5M[Xb]Y5Ulb]aW>YM ^MadT0jB4}V[O Y\x TJ^fWYM ^MaT YM [rE.W.UUX}JY\TBYW8E.a CFTJ^YMx aTVEJai9YMx ^5YM[XTVY5UWjC_z4b]a[«u«I {~adUXzj[XCFW8C~5[]E 4}V[eC klzjU¨bX[YMU#Y\ F^M5[XC_bX ^=M [¨M [ Y\b¨bOi=a[Y\ zjTVYE.aRUXU]YbXWY x UXYMzMad[dIfreh}8YMx [!E.a F'=Y\ TJ^ 5 E.}8iVYM[]YzZY\T8i=a[Y\ zjTVY ¯Y\ TJ^4E.aT aT CFT4bXaTJ.E. _C°U¨b]Y\TI u±e} i=a5 WMa[ CFT5b]a^5a!s}J F °UlbY\ TVE.CF^VU¨ad}VE.5zM.EN E.ab[RY5 zMa[M*EJ}¨M []zj FYM[]YM[9WjCF _zZY#EJYZbYMU¨bX[]}Jz4bX}J[]a[DE.}Y\TjWY\ TVE.ad[.y¨M []z4 °Y\[Y\[ TJ5^M^5[]YMTJT4b~WjCF _z5aT[X5 _ E.a!UX=a °Y\[}JTVEJa[i=a[Y\ zjTJCFTJ^MadTIrsqM=u r»dueC klz.U¨bX[YMU#Y\ F^M5[XC_bX Y\[]i=acb]YM[U¨bXad^MWjCFUdI CFU]Y 4}V[#YM _^5M[]C b]#adT8s}JTJ^5a[Y\[O^5aTJ5 Y\b¨bWjCFU]YhWjCF _zZYa F FYMTJ[XaRU¨}V bYZbrbXCF F FU¨b4YMx TVEOV5U2EJYZbYMU¨bX[]}Jz4bX}J[]a[]TVY4uUXM eC klz.U¨bX[YMU YM _^5M[]C b] r»aTJ FC_^Mb E.CFT i=adUXzj[XCFWjTJCFTJ^ZWZY\T'u FYM^M[Y\[¨5 [ Y\b¨bzj}JTVTVY[]acbX}V[XTJad[]YyE.aT z5M[Xb]YMU¨bXa WY\ ^5aTjE.adTJTVYWY\ ^4U ¯Y\ TV^5E#ad _ °Y\TS|. ³ C^M[YZsadTZWZYMTIr»K\=u r»EVu Sh [E.abC5YM _ F Y\ TJJab ¯Y\ J FC_^MbYZbXbY\TjWY\ TVEVYadT^M[Y\TJTVY\bX[]CFU=¨5 [YZbXb[]aJ[]adUXaT4bXad[]Y adT^5[]Y\VTY\ [2Y\TC_J FaadT5b]a[Y\[eC klz.U¨bX[YJ²Y\[X¨M [a F _ad[WZYM[¨¨5 [CFT4bXQa >f\bXCFWMad[]Y adEZkYM _ YW N¯zM5J _a.C b]acbXad[dIr¡QZ'u .I FY5UXUXaT ''C"/ C4YWZY#M F Fad«b]C_5TVU~zZY\Ty °Y\^5[]YO^M.Ejblg.zj _CF^\bDUlb]M[Y! FCFU¨bX5[dI2vOYM [Y\ [ acbXb}.b]E.[Y\^}J[i=adUXzj[XCFWjTJCFTJ^MadTYWzj °YMU]U¨adT aRU¨C dYMiJ FacNpY\[][]Yg CFJ FaaT4b]Y\bXCFMT M!bXVa F"Q CFT5b]a[X»YMaMI*IFIFIADJa " NE 2" E E " E Q '2?&2' EY\TV# E "/Q '(?&2' 5'ad[]Y\N b]C_5TVUy[]}JTCFT c5TVU¨b]Y\T4bb]C_a5I ADJa Y5EJE M=a[YZb]C_5T [X}JT'UyCFT Y\M[XbXC aRE MTVU¨b]YMT5b bXCFaMmIFI_I YM: ''F"/ CFTVU¨b]Y\T'caO'YMUYydY\VY5cC_blgMIADJaYZN VY5cC_blgCFUbXJaU¨C ah\bXVaY\[][YgO}VUXadE#b]U¨bXM[]ab]Jahad _ad#adT4b]UC_Tb]Jah FC°UlbRI ¯b C°UY\ ~''Yg.U FYZb"/ _ aRYMU¨b YMU °Y\[]^MaOY5UbXJa# _C°U¨bUXC daMI!SUa FaaT4b]UYM[Xa#YMEJE.aRE b] YMT mMC_b]UdY\VY5cC_blg^M[] U~YM}.bX5YZbXC°YM _ FgMI r»Y4u ³ M []zj FYM[]Y±i=acblg.E.ad FUXaT YW XADJafY5EJE M=a[YZb]C_5T []}JTVUC_T YM#5[¨b]C dadE c5TVU¨b]Y\T4b b]C_a V²rQ\'u rsi'uCFU]Y j}J[Y\T´ ¡YM J _CF^MadTBzZY\T´C_J FaadT5b]a[8Y ''F"/ ^MadTJM Y\b¨bU¨zj[]C_WZY adTfzj FY5UXUC 4YWYad _ Fa[CEJacb]YM klad[]Y5EVUXa}VE.5zM.EIeacb[YM z5a[5 E.} W4C°U]Y\[WjCF _zZY b]C_ F FU¨b4YMx TVEJUXWZY\[]CFYMiJ _ad[ r Vad FEJU 5uY\T i=a5 WMad[U]Y\!b4}V[Y\T C_J FaaT4b]a[Y\[ ¨5 k¨YMTVE.a~M=a[YZbXCFMTVa[i=adUXzj[XCFWjTVYC XMTVU¨bX[]}V«b]M[U¨}JY\[]g . ¨abXJ.E!UX}J#N Y\[]g JG CKI ''F"/1 2N5TVUlb][X}'«b]U2YMTOa.blg FC°Ulb C b]#YMTOCFTJC_bXC°Y\ .YMVYMC blgMJbXadTI CFCI 10?D N abX}J[]TVUhbXJa!ad _adaT4b Y\bbXJaU¨=adC VaRE =5UXC b]C_5T C_T b]JC°U _C°U¨bdI C_CFCI B &C/DDDN J& NSJ=aTVEVUbXVahU¨=adC 'adE#a FaaT4bb]bXJaadTVE\=bXVCFU9 _C°UlbRI CFW=I B &C/DDDN ?D E N pTVUXa[Xb]UDb]JaOUX'aRcC VadEad _ad#adT4bhYZb b]Ja!UX'aRcC VadE=5UXC b]C_5TCFTbXJC°U FCFU¨bdI rH\'u oJI TC_TJN¡YZjN¯JadYM0Y\ [aTfEVYZb]Y5Ulb][X}Vz5b]}J[adEa=adz4bXCFWYabX.E.a[i9YMx EJa¨M [hY\b¨bbY}.b C_TVU¨b]Y .U¨bR5 []U¨b]Ya FaadT5b]acbC.aTEJY\b]YMU]Y\ FC_TV^VI`9[XaRcC°UUXM aT#WYMTJ FC_^ JadYMYM [E.aT acbXbhs}J F FU¨bRYM TVE.CF^\bhiVC_TYM [¨bhbX[YM E0r ]c5#V _abXa!iJCFTVYM[XgybX[]aa 4u«m'#adTfa FaadT5b]aT CaT CFT.N YZjN¡VadY\´Y\ [M[E.TVY5E.aO9Yx acbXb!Y\TJTVY\bURYZ bXbdIOSh _ °YTJ.E.a[UXMw FC_^5^Mad[9YOx kY\ T4bEkl}J rsajad'ad _WjC°U9[]\b]aT'u2'Y\[9Tjg.zj FYM[U¨5wY\ [CFTVE.[]aY\ Tfr»a F _ad[9 FC_zZYO#aREVuUXCFTVYYZ bXbX FC_TV^5Y\[Rm adEJYMT#YM _ °Y TJ.E.a[UXM FCF^M^Mad[29Y x }VEJEJYEkl}V#'Y\[URM zjTjgjzj °Y\[2U¨5*Y\ [U¨bR5 [X[]a YM Tr»a F _ad[ _CFzZYadEVu9U¨CFTVYYZ bXbX FC_TV^5Y\[RIr TfY\ b¨bX FCFTJ^bXCF F VTJ.E.adT ±YM [aTTJ.EUXM VTJTVU9CVE.a _bX[YM EJacb adE[XMbXadT I u r»Y4u C_b]YadT C_TJN¡YZjN¯JadYM UXM(C_TVTJa9YMx _ Fa[ad _ad#adT4bXaT´PMm Q.m KJm qVm .m oJm njm HJm JmFPdLV² i.N UXa[]WMad[]Y#YZbXbEJacb VTJT'U0Y\x TJ^4Y#U4YMx EVY\TVYC_T.N¯YZjN¯JadYMVY\[RI~r¡QZ'u rsi'uvh}J[CFJ FaaT4bXad[]Y5UM=a[YZb]C_5TJaT UXM []acbX}V[XTJad[]YM[E.acbUlbM [UlbYa FaaT4b]acb C#CFT.N¯YZjN¡VadY\=aT r»}.b]YMT YZbXbb]Y0i=M[XbyE.abOu > hCF _z5aT Y\ [E.aT Y5U¨gj.bXMbXC°U¨zZY b]CFEJUXzM5J _a.C b]acbXadTJ5U >IDrK\'u r»duvh}J[OCFJ _adaT4bXad[]Y5U!M=a[YZb]C_5TJaT D UXM b]YM[!i=M[XbE.D acb#C_TVU¨b]Yf a FacN aT4b]acbC9aTB#CFT.N¯YZjN¡VadY\F >thC°UXY [XaRU¨}V bYZbXabYW8YZb¨b}.D b¨¨5 []Y 9Y x CFT.N¡Y\4N¯JaRY\=aTC9r»Y4u«IShUXgj.bXMbXC°U¨zzMMJ Fac.C_bXabDV5U 2 > rZ=u eh} UXzY i'aRU¨zj[]C_WZY C_J FaadT5b]a[]C_TV^5Y\[]TVY Y\ [##aREB\kY\ F´YW8VUXa}VE.5zM.EI r 5YWZY\z5.E YMdcaJbXa[YMU~.z.U5YVx I u iVUXa[]WMa[YhY\b¨b9CJbdI acI A YM [JaRY\VYM[aTEJYZbYMU¨bX[]}Jz4bX}J[2¨5 [ Fac.C_zZYEYM [Y\T FYM^M[Y\[ VY\[YWyURM zjTjg.zj FYM[.a FaaT4bdIfaTYMTzYMTy¨5 []U¨b4Y5x UY\ WMadT °Y\^5[]YEJYZbYMU]Y\ FC_TJ^4Y\[ EY\ [URM zjTjg.zMad _T.a FaaT4b]acbOY\ [U]Y\YUXYMz>I Tentamen Datastrukturer D DAT 035/INN960 (med kortfattade lösningar) 19 december 2008 • Tid: 8.30 - 12.30 • Ansvarig: Peter Dybjer, 0736-341480 (innan 10.30). Håkan Burden, 073077287777, och Staffan Björensjö (after 10.30). • Max poäng på tentamen: 60. • Betygsgränser, CTH: 3 = 24 p, 4 = 36 p, 5 = 48 p, GU: G = 24 p, VG = 48 p. • Hjälpmedel: handskrivna anteckningar på ett A4-blad. Man får skriva på båda sidorna och texten måste kunna läsas utan förstoringsglas. Anteckningar som inte uppfyller detta krav kommer att beslagtas! Föreläsningsanteckningar om datastrukturer i Haskell, av Bror Bjerner • Skriv tydligt och disponera papperet på ett lämpligt sätt. • Börja varje ny uppgift på nytt blad. • Skriv endast på en sida av papperet. • Kom ihåg: alla svar ska motiveras väl! • Poängavdrag kan ges för onödigt långa, komplicerade eller ostrukturerade lösningar. • Lycka till! 1 1. Antag att du sätter in elementen 4, 3, 2, 1, 5 ett efter ett (i denna ordning) i följande datastrukturer (mha standardalgoritmerna för insättning) (a) Vanligt binärt sökträd, utan balansering. (1p) Svar: 4 / \ 3 5 / 2 / 1 (b) Splayträd. (3p) Svar: 4 3 \ (zig 3-4) 4 2 \ 3 \ (zig 2-3) 4 1 \ 2 (zig 1-2) \ 3 \ 4 5 / 2 / \ 1 4 / 3 (zig-zig 5-4-3 + zig-zig 5-2-1) (c) (2,4)-träd. Kom ihåg att i dessa träd har alla inre noder mellan 2 och 4 barn. Alla löv ligger på samma djup så trädet är perfekt balanserat. Varje nod lagrar mellan 1 och 3 element, och trädet har en sökträdsegenskap som generaliserar det binära sökträdets. (3p) Svar: Först sätter man in de tre första elementen i rotnoden. När man sedan sätter in det fjärde elementet får man overflow i rotnoden: 1,2,3,4 Alltså splittrar man den och får 2 / \ 1 3,4 (Man kan också lägga 3 i rotnoden, osv.) Slutligen får man 2 / \ 1 3,4,5 (d) Heap (en vanlig binär “min-heap” som lagrar minsta elementet i roten). (3p) Svar: 4 3 / 4 (bubbla upp 3) 2 / \ 4 3 (bubbla upp 2) 2 / \ 4 3 (5 hamnar på rätt plats från början) / 5 Rita hur träden byggs upp steg för steg efter varje insättning och förklara vad som händer! I (a) räcker det dock att du ritar det slutgiltiga binära sökträdet. 2. Avgör om vart och ett av följande påståenden är sant eller falskt! Endast svar med korrekt motivering godtages. (a) Om en algoritm har den asymptotiska komplexiteten O(1) så tar den alltid lika lång tid att exekvera oavsett indata. (2p) Svar. Nej, O(1) betyder bara att det finns en konstant C så att T (n) ≤ C för alla n < n0 . Av detta följer inte att T (n) = C för alla n för någon konstant C. (b) Höjden på ett binärt sökträd med n noder är alltid O(log n). (2p) Svar. Nej, höjden på ett binärt sökträd kan i värsta fall vara O(n) om det är helt obalanserat. (c) Det gäller alltid att O(log2 n) = O(log4 n). (2p) Svar. Ja, eftersom log2 n = 2 log4 n så gäller att om T (n) ≤ C log2 n så T (n) ≤ 2C log4 n och om T (n) ≤ C log4 n så T (n) ≤ (C/2) log2 n. (d) Höjden på ett (2,4)-träd som lagrar n element är alltid O(log n). (2p) Svar. Ja. Värsta fallet är när varje nod bara lagrar ett element och alltså är ett binärt fullständigt balanserat träd. Ett träd med höjden h då lagra n = 2h+1 − 1 element. Alltså är 2h ≤ n, dvs h ≤ log n. Så h är O(log n). (e) Man kan sortera ett fält på tiden O(n log n) i medeltal genom att först sätta in elementen i fältet ett efter ett i en skipplista, och sedan plocka ut dem i ordning från understa raden i skipplistan. (2p) Svar. Ja, den understa raden i en skipplista är sorterad. Varje insättning tar O(log n) i medeltal och varje utplockning tar O(1). Insättningarna kommer alltså att dominera tidsåtgången vilken alltså blir O(n log n) i medeltal. 3. (a) Följande program har som indata ett fält A av heltal. int f(int[] A) { int n = A.length; int s = 0; for (int i = 0; i < n; i++) { s = s + A[0]; for (int j = 1; j <= i; j++) s = s + A[j] } return s Vilken är O-komplexiteten hos programmet uttryckt som funktion av n, längden hos indatafältet A? Motivera! För full poäng ska O-komplexiteten vara en “skarp” uppskattning. (3p) Svar. Den yttre loopen körs n gånger och den inre loopen körs 0 + 1 + · · · + (n − 1) = n(n − 1)/2 gånger. Eftersom varje tilldelning till s tar O(1) kommer den totala exekveringstiden av den inre loopen att dominera och vara O(n2 ). (b) Följande program har som indata ett fält A av heltal < N. void f(int[] A, int N){ int n = A.length; int[] B = new int[N]; for (int j = 0; j < N; j++) B[j] = 0; for (int i = 0; i < n; i++) B[A[i]]++; for (int j = 0; j < N; j++) { int i = 0; while(B[j] > 0){ A[i++] = j; B[j]--; } } return; } Vilken är algoritmens O-komplexitet uttryckt som funktion av fältets storlek n och N? Motivera! För full poäng ska O-komplexiteten vara en “skarp” uppskattning. (3p) Svar. Den första for-slingan tar O(N), den andra O(n) och den tredje O(N + n), eftersom den körs N gånger och den inre while-slingan tar O(n) totalt. Alltså blir den totala tidsåtgången O(N + n). (c) Är det korrekt att programmet sorterar A? Om ja, motivera! Om nej, lokalisera felet! (4p) Svar. Programmet ifråga är nästan “counting sort”, en variant av “bucket sort” där man sorterar heltal genom att räkna antalet förekomster i indatafältet. Det har dock smugit sig in ett fel, genom att variabeln i nollställs varje gång i den tredje slingan. På grund av detta kommer t ex A[0] att skrivas över varje gång while-slingan påbörjas. Om indata fältet exempelvis är 1,2 kommer det att bli 2,2 efter exekveringen. I stället ska i initialiseras utanför while-slingan. 4. Följande grannmatris representerar en viktad oriktad graf. A B C D E F A - 1 4 5 - - B 1 - 2 - 2 - C 4 2 - 5 6 4 D 5 - 5 - - 2 E - 2 6 - - 6 F - - 4 2 6 - Talen i matrisen representerar bågarnas vikter. Ett streck (-) betyder att bågen saknas. (a) Rita grafen! Sätt ut vikterna på bågarna. (1p) (b) Man kan använda Dijkstras algoritm för att finna kortaste vägen mellan två noder i en graf. Som i lab 3 vill man ofta både veta vilka noder som ligger på den kortaste vägen och hur lång vägen är (dvs summan av de ingående bågarnas vikter). Beskriv i ord hur Dijkstras algoritm gör för att beräkna dessa två saker. (Du får delpoäng om du bara kan beräkna längden men inte nodlistan.) Du behöver inte ge fullständig pseudokod det räcker om du förklarar vilka datastrukturer du använder och förklarar noggrannt vilken roll de spelar under beräkningen. (4p) Svar. På sid 587 i G & T finns pseudokod för en version av Dijkstra som bara beräknar längden av kortaste vägen från en given nod v till en godtycklig annan nod u. (Ett fullgott svar på tentan kräver att de viktigaste idérna bakom denna pseudokod beskrivs klart.) Observera i synnerhet att algoritmen använder sig av en prioritetskö Q som bestämmer i vilken ordning algoritmen “besöker” de olika noderna i grafen och ett avstånd D[u] av den kortaste vägen från den givna startnoden v till u. Om man dessutom vill returnera en lista med noderna på den kortaste vägen från v till u lagrar man för varje nod u inte bara längden D[u] av den kortaste vägen från v till u utan även den nod P [u] som kommer innan u på denna kortaste väg. Från början sätter man D[u] till oändligheten och P [u] till en nollpekare. Sedan uppdaterar man både D[u] och P [u] med allt kortare avstånd och vägar efterhand som man besöker nya noder. Dijkstars algoritm som den beskrivs i boken terminerar när man besökt alla noder. Då kommer D[u] att vara den korrekta längden av den kortaste vägen och P [u] att vara föregångaren till u på denna väg. När Dijkstras algoritm används för att beräkna kortaste vägen mellan två givna noder v och u kan man terminera algoritmen efter det att u besökts. Man kan då ge som utdata längden D[u] och vägen u, P [u], P [P [u]], . . . i omvänd ordning (denna väg kan förstås dessutom reverseras om så önskas) (c) Dijkstras algoritm arbetar stegvis. Visa hur algoritmen fungerar genom att visa vilka mellanresultat (tillstånd hos datastrukturerna) som Dijkstras algoritm (enligt din beskrivning ovan) lagrar för att kunna returnera den kortaste vägen och denna vägs längd mellan A och F i grafen ovan. (3p) Svar. Vi visar efter varje besök av en ny nod tillståndet hos prioritetskön och värdena på D[u] och P [u] för alla noder u i prioritetskön. A B C E D F (B, 1, A), (C, 4, A), (D, 5, A) (C, 3, B), (E, 3, B), (D, 5, A) (E, 3, B), (D, 5, A), (F, 7, C) (D, 5, A), (F, 7, C) (F, 7, C) Första raden betyder alltså att när vi har besökt A så ligger B först i Q med D[B] = 1 och U [B] = A, osv. (d) Är det i allmänhet lämpligt att använda en grannmatris för att representera en graf när man implementerar Dijkstra! Varför eller varför inte? Motivera med hjälp av O-komplexiteter. (2p) Svar. Nej, det är i allmänhet lämpligare att använda grannlistor. Varje gång en nod u besöks går man genom dess grannar och uppdaterar D[u] och P [u]. Om man använder en grannmatris måste man gå genom alla noder i grafen för att finna dessa grannar. Om man däremot använder grannlistor finns us grannar direkt åtkomliga. Totalt behöver man alltså under exekveringen inspektera grannmatrisen O(n2 ) gånger om det är n noder i grafen men bara inspektera grannlistorna O(m + n) om det är m bågar i grafen. Om inte grafen är “tät” eller liten är grannlistan alltså klart bättre än grannmatrisen. Ett annat men oftast mindre viktigt argument är att grannlistornas utrymmeskomplexitet O(m + n) också är bättre än grannmatrisens O(n2 ) om inte grafen är tät. 5. Klassen ArrayList i Java Collections kan lagra godtyckligt stora listor. Här är ett utdrag ur beskrivningen av klassen Resizable-array implementation of the List interface. ... The size, isEmpty, get, set, iterator, and listIterator operations run in constant time. The add operation runs in amortized constant time, ... Each ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically. (a) Förklara betydelsen av “The add operation runs in amortized constant time”! (2p) Svar. Det betyder att tiden det tar att utföra n add-operationer i följd efter varandra är O(n), dvs i mdeletal tar var och en av dessa operationer O(1). (b) Visa hur man lämpligen kan implementera ArrayList genom att skriva en klass i Java eller i detaljerad pseudokod. Det räcker om du visar vilka tillståndsvariabler (“fields”) man behöver samt hur man implementerar följande operationer beskrivna i “constructor summary” och “method summary”: i. ArrayList() - Constructs an empty list with an initial capacity of ten. ii. E get(int index) - Returns the element at the specified position in this list. iii. void add(E o) - Appends the specified element to the end of this list. iv. void add(int index, E element) - Inserts the specified element at the specified position in this list. (8p) Svar. public class ArrayList <E> { // Elements are stored in es, with current // capacity available as es.length private E[] es; // The number of occupied entries in the es array. private int size; public ArrayList(){ // The initial capacity is 10, as specified es = (E[])new Object[10]; size = 0; } public E get(int index) { // Check that the index is valid if (index >= size || index < 0) throw new IndexOutOfBoundsException(); // Get the element directly for the array return es[index]; } public void add(E e) { // The position size is after the last object add(size, e); } public void add(int index, E e) { // Check that the index is valid if (index > size || index < 0) throw new IndexOutOfBoundsException(); // Double the capacity if no more room if (es.length == size) { E[] news = (E[])new Object[2*size]; for (int i = 0; i < size; i++) news[i] = es[i]; es = news; } // Shift elements to make room for the new element for (int i = size; i > index; i--) es[i] = es[i-1]; // Insert the new element and increase the size es[index] = e; size++; } } 6. En min-max-heap är en datastruktur med effektiva metoder både för att ta ut minsta och största elementet i en datasamling. Precis som en vanlig heap är den ett fullständigt binärt träd (“complete binary tree”), men elementen i en minmax-heap är ordnade på ett annat sätt. Alla noder som ligger på jämnt djup (exempelvis roten) har nycklar som är mindre än (eller lika med) sina ättlingar, medan alla noder som ligger på udda djup har söknycklar som är större än (eller lika med) sina ättlingar. (En ättling till noden n är en nod som finns i delträdet med roten n.) (a) Rita en min-max-heap som innehåller elementen 1,2,3,4,5,6,7,8,9,10! Observera att det finns många sådana min-max-heapar. (2p) (b) Hur implementeras operationen max som returnerar det största elementet i min-max-heapen (utan att ta bort det)? Vilken är den asymptotiska tidskomplexiteten hos max. (3p) (c) Hur implementeras operationen deleteMin som tar bort det minsta elementet i en min-max-heap? Visa resultatet av att utföra deleteMin på min-max-heapen i (a). Asymptotisk komplexitet hos deleteMin? (5p) Du ska beskriva implementeringarna här med hjälp av pseudokod. (Javakod accepteras också.) Observera att i t.ex. G & T är heapar en datastruktur för lexika där man lagrar par av söknycklar och element. Men man kan förstås även lagra datasamlingar där söknyckeln och elementet är samma sak.