From 68ad81116cc32083e68c452c4c6232bf13c88771 Mon Sep 17 00:00:00 2001 From: Matthias Konitzny <konitzny@ibr.cs.tu-bs.de> Date: Thu, 15 Sep 2022 12:03:13 +0200 Subject: [PATCH] Updated sample dataset to contain numeric ids only and generate objectGroups correctly --- datasets/AuD-Inhalt2.xlsx | Bin 43565 -> 35577 bytes datasets/xlsxTOjson.ipynb | 87 ++++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/datasets/AuD-Inhalt2.xlsx b/datasets/AuD-Inhalt2.xlsx index be2b7e5d969a1c4e43510e5b55937a1df851ece5..d7c95307522a10c0b29f893ddbc803d08ad84cf3 100644 GIT binary patch literal 35577 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 literal 43565 zcmeFYRa9MDw=RggOK=YaSh%~pLvVL@4Hn$pgL@#jL(pKsHMlzjcb8g_z5l&W-P`I^ zJ=McKw8k29%+clRJ}06e4Gw_;0tEsC0s=w;0s}d+9s&vi0ty8Jf(`-$rX_4=>uh4{ ztf%a5Z{nmw_sPbZI1d7hG6w_<NdG@y{|9@ZEK%03ivc0{B;lH<MEe8ooIx4|T!=S5 z`};X$n5bM-8?@fw&W>z6J{DO4l?my5wyTHM26W`U#S$4dlyQ#qFu?^Z*tsPOqm<O! zEbq%KQU8K6)xz4?FoGQHnB$Y++DvE}js-&sIMNqV@*PNJxR1M?=c8RgQm7rlg_qQN z-^ly>KEFurjH0RUE0&Xpb+fA%yGRZ^B=etS4o6`Q96Wd6Cc$odTR4hZE8CVmL;wEX z+qIRW(_W#@B}yb<K?71u{gDU(y&EHxgAwDLhFKu&C?}*$DLV3J6$2p=#}#~_$F8Gl zNE5xSI0J5c7~JJI>QNnA>ATG?%i|^LHoD0MmTD1;!bslx_O2NI{K%mkBQlrIicOu+ zXE@+E*^OGEOo##nI<Rvt^ZDlJ-xWYF6K^l+xY<wDTE1;rj$+0t)9W<yhU;!#BxOPD z#ubVAUh8n^PH;8vYQTWuaOg}rg*=ID#W^`G=4M&oI%~PMi#bk@+_nwlG)01YUBZKa zyu5&eDEycDMb~XN0Rz_WDzH4^f%U8BXkzU|Pxt!yKXv<maIyZ&^s;zaX>dlA;1mBB zlHoS)MQYMXYkJW=S>q>A#?&W$_SD#d=BFDmLFe2CLXV6}w=DP6E7O|%Px&aGu4u`k zu>KjQzgkqgq@S9apivVX#i9-+y8KA3OAbn}n4_q-bLX!3!pk=D0_n(Ke6d}`ReSw; zziV4?s3$pMYhFqrmyl~GZ4(5q;wp@=^o~lva65tL@!huGwX(6xR$2^s*bNkt0b;+3 zjK*r*#?A}vU$Ew><`%y1tol6oJ9O}Y)CipLgXUBA-ig(Ol9CvCP#SpV&fOsgWL;~4 zs1v%+QmUBOE<-C5a*?_%{XpIgV>PeQsM;7i+UQEnJ<tpPYsskWJ;xh?gMctVgMc6d zDLz@#yV*Hf8QR%dy^gyA6<NDQ4wN?fsu#gEov#w!>S!An(KZI)brHlP4Sl}J=IJn^ zmXg%2D2G0)xftX&-jZ6~6rv-yXAV0fryJehk~+!QRn6-KjNj$@mTIyK9bxTdw@?o& z>JxlKOwc@o^w@ak-Sl`76Oqq`tW{0~2BP5VhcxO!{<DGaG<iPtxCv}XE<Kr3J&m^^ zbG@t@dQ=C%7?p?6C_~9Ynz+M@?a_$Ns&~+A_uY{!bUmIk#|}BK7F|=T1G>UwC-<aF zvyni+Itb&~0z_0$D`nQR5OGn8<2tOMbKnPi08yBJ&M!HAuEi3}`U%yOC4`(aiTlIH z_g#TrSpL7<5mrJH^}C6J#?}FVgeTI{Lrj1tIN5|<K5FbtP7<2`O@#Sx0DCwcy{phU zeZDjJjEhh0jG0uP0Mh|mlzpp44kyi3oX<_y<+2L>dv%NWUz}Yjm5%L<g57RqDaS~G zJe|TO#u|bjPhh*$rTU@_qbutibGlQUo+@^r4yOeJx&pMG?dTCgy1=|UH4Kbh1{$t| zzYCA!af*!#4Y1aV&AL+bl4VmJ+Y6tw0KzkVy^n5K#8|~{V=uGG{VKSWs6WGgqtKxc zGqaID`(lr<H1L@|u@_m2h}`a)r;ec19fmF+mVKCUD6@C9I6E_CL4GfLny(l;k1NZ| z>zT0&1>~a~ZifSf@9x2sc>jgjHH=0!7NsvGg3dbbxzvWIN_zYff91@yN;CEOY4{|y zOguGG%1~%<-C*APfxO80D<6B@grs`YHttr+K_hwvuyamkZ^NPip}ZQb5xkgPj=@UR zixH;C-J$m~5^~+7bQ0KDD%!^B&df0e+#J;>nR*cX3+zXCCieH#%K0(y7?V7*N*Fw{ z^yV8WeVvagEXN?{Be_v>C(j#(J|Lrkqh$8Z)}99s8(@Vi(BY#Wb#iw1w$Zy<uZ1yG zPjP|=*c5tJ?eQ1b><M-R5DQ)V8nmV4)`CxEy+gU-WPZCb&LZNVaX(d?)&y^y|5{Uz z4Slx~ki8^+5RBtY>$}F2KTkbIEG~@}5@<bnN-Z~8wV<pb7e4KwqReOVyg^k6<y-4Y z+B<VveS+kMtUSJ^?tfuvY?$fi-?ZH_CO>!=X)DK?G8D(!<cIRX@>BC6-3zed{?~f+ z<4a7r0M=nMaD?H4z<>hl@y`_dcUAs9(LjMuqQG(YfA&|IlB{$O14<kGa|nZ5x+^B? zyfZ!Np~?X=%s?I0A_WQa=gU<*>Si7F8EJZOyI}W|kv`WOR-_GZ^s7!laX1=;2fFnM zH>BOj#Rxcz;ZZrEzc?g1+Ts2|=@C3qniKkWzW9EcEDVmFTS{`Ako>QtBA4GMgIO#` z8C;kwoyG|UWi?iY>b89E13w;?``0x#5~op_ZohmNUc83N_ID?mxWIvx<Uw=?nb?~m z0o-<qUc;QXKAOt9k6Lx+-y>|}mr4_su=08ZI}?ZWixc@!#XD{1rM9S?tUC)m3{rJ0 zp3@9no|tY8^i8h<BmKXo%nTw4A+In9$Za<$2sV)7uNLlPZerr>ME|xhzV`AA<;Ca) z1{CkgDWA|sIkb=^fgdFc(<P;<Hq%Gj^BhR(Jr0)XL$=dCCv)F@10l>&KjCxl4xbG( z*0ux`w-S6z8}f**A|j2MR({v2J2Ejw6qAqdz7X3?oK!ZC-^LJi{O)9R<XXw*GL3N) zRJeTC+(w2O5lnVg2IXidc)IGN6nUthcs-nRJ~kD;gt8z;umv$prQ#5SN~3*$%~m3> zL^Ea?8*P{&CS#6XrF*_7o1k4Tx`<7~NT}2VNN>E_QY(kj7A%*y=Co3r3FI!{+82eB zoHe{oyQLzB1G7|!A}LD^T%s=lsuy=>A3EO?JL_}tzsRz1AYm*zEdC%<xnz^%z-h`O zo4<`R{w-iSRQOd(cX(p8>LHTYkUOw1cl9CUU9G=x$k8{R-a*cL-y*$Q7ST?_9sJ9P z+BUva&tRHtjoxB|SV*$5{vBq(2yZEM1X5>zrBb+=lr{gw*49}BD^;rrR(WNLk}b^( zIzte#D7P*kNCDXIw;ux?5K=Z{5_Sm%v=~CUGjD{5mThjow)!U-Yo&T>JnaN&1gwpZ z*>m8S5$7&G(%lf@=#?WLc9l3S)O~W-PxHSLOeG?3z*koNft>%LsjXXI$I;$l)xn5A zI-aKQv|YS$L1Mz}=#&;s^Eej8(|Bu>L#A>qrv(Yxq5l&jYT^hev8yjk6;`63Ep*kB z#TW*8pN9^}R{|76dfJP8p3Z@KVG{y0!<dYvV2FIqYLpmGJIfyh!a|3!lE)u3INE18 z5quVHei=-vQJ!DC5Bs&Gxi1uUs*nA}d5-5h>Y^4D5ihzp*77@!mgl#=_Liv`-be8l zYzfQdtykItJb4n9KTTSw)B57YHmxf<x0}v)#9cpHnI$ZF6N5oG$Yp;WzmSK-XGz-= zLw^F@FY0){+s*dzd3icn^||}K`f~L0xVh@{?0S10)A2le@^Y_sf3<0Fe;xDUiS6^U z+4pk&(*ANcOXTx>u*&b_c_-g}d6bg<{K@y_0=z9!lE9~M=H+&KyNKv{GbQ`;Z9efR z4x`tDxF|l#nJp?fX}eYrDr$#jPiUyL7(N~!g@`t-p;*rdsa)u7e`s~;HYVy#qy)Uy z>?R^=HV$JWKrG^3%YSOUXUj(;<VE5ADgDx^UV1Q5{8Z^)Lae~$i;NRKI+4%gNyqbZ z<BR*lh0o)SxHN8CB|0(_zYjO<f<O&lqxYr43HN4urFX@<r!>^cqmqfO6a;rGk^&30 zwe=vDtz=JRdRoZI9^_7{ZyVm*MoHslxr<U)0!}Zg4Bd?^a0SWA3lcV7%??EQsw5Mn z8H;@HlorJg9=wmN0!0Sztb%<L&Ea*JAPPi0_nNzVY>u?BZiMYcxsPp&@b|v+GjEND zo9FDll<Sv;#`9L;0W2n-`8*;uMMX4SZ6DM{Y=|Pvj}}oCgX>6fB?RekCd18%p(?p$ zmT1tyZQ_tYa}gb|WMUh<8(cpT^FG*Q`rmw9;1W|0+5Clgh20<(k+su$ZBxn@E7j51 ztzmA+VR2fCGYNMjVd*dst7<NuwrBZ)D}K)oP+&{X80@@GXZjWM-g-4eoXvYAL;r5F zbU<SN=ywAU5Tq!alkLMNt$J^o-1<sX25CxR0U?$La^Pn{-7EoxZE_fy#e9fw6|Ht^ zF@4dJz4;i~<^dbrd&m3uT+c{Nav@|d+lSk=re8PSM;FKlI1_NjTeJxz<pN?WOg{oR z8Pw^-78HoUx*p6-^26V==SVaVK%z;GnO*lkI>+#cm7|dma5Z|<#AUXhSgno{4xpgG z&ihLT`%0MO>1a_%WZGKkvFat4#{FFCO{}BH#_<PpU#x?DAOGp4%l(M4By09oxy{v9 zntSvT<AfHJP0#gFL~DH(!9tYz?2JoTb3(?e6^dfmR>QN@9zw5`eMa(N#rG~#_Kc$w z4<{q5eIv!76s6xb%W5|Z#TQIkPyzdvR*8WadW94c9KO?2WSI3#R}uSjE+s;TA_PA( zQDtXQT4R!5<^_kh&pLh^LMhU>FnMD;j+WAb$`ghu5%QV1XYQ|&cD<|@2F?1K4kKP^ zU&R?5V21{VKkQ58h2fvZHP>{RZ3G}7@_0wlbng$=PW$WDo|k{HRn_H~KeTwaUv=rV zMvblR!RN5fJYKS5X;)if8l!G&Rx568y<vPU0So#=@^EAkpa&0+|D%5A2gqf7bh~g- z+?T7aa+}&tKlBcx!T04oa*y%fBCVM?QEMB+zn$Q+hJ&+Px-JN3LkgRLo`@EZf)mh_ zo>p+O+0Vh^w*uMYVUX=}rh}p7Otmy-AB`K5GWSLBc2(VNASCg2h4pnUHkaUcMgm6( z&yFfv6@F-#nfZ|H_t>oD{-W^-$=8FaGd-HNMmw<YNRtH{J2hOPOvcRG$>$rQ$Wr6W z!jx&z)0@Ac$6jE>Bj*99EP6RTe>{ZBVzybhFtVkexkkzqGbO0-Apv1x4q-cZ>_`*F z;|WNbUuc_W8Cn8(vIlX-qO`C>3ZpF~gONiB`Z_bYzenV<#{D#j|AiBVJyoXDvzKR5 zK};^$_sjtfG!|Xfk?M=<cU*Bh$#5ONxPYVtlS20h`uBW27wr>d%K*Sm-L<{A6;h=h zSQl1SWICCE7)m*`ErbCq{_s4lk)~jz7ezaMpdO#o*BoCdra|@ZNhvmcp?#a+KifvN zGe;+d@QfEXn*<5@01><HGCTTh>v2!TwO}}Bb-GQcF`2#LAB+@uC{~+2cFOr>%CrG3 zF|<P$OO_`Tgw;@94J|1KLkFMdWwQ%|dTK4eO$A9f6kNxg&Jbb@VrD--v>u*QqC^xK zCgPw&M1F#U>g_&B2eUky>nH5PRA=1y)~3R<e<nxqkcw4;Dvu+!F|VskNeBamamF*| zhBPBeIFHE>h(#TfYh7z0*6&S#&G~c-qXU!siQ`(^ETN_7+I9og%6<b|AoDwJ<D}5W zJPmC)G%4g$3pCnE1_btk?qreMp0SfE_Y=0PU)}kqe51oc{k3v=FKxdV@CT-Pw}fCs z_*NVPmO`+m;kA{U6EOP|&Kmx@Hq+Eax!U2GHlNKDk6fgK;qNd0el9y|T=o|7YW1F4 z=AHO`dObZMSV%uGP;4MRV6ypIt$M>~1y9G~WVh$cN)%r`L<N?0*pM50KXk)$rvwG5 ziiBWY)16Tb>zXT_+%;*Pjj(we=qZg3j~aveMSc~FZ;JTwLeJ!pB`9}gC(9HJJ~(b= z3?ck&xIB7EwR4aX-P}#_{PVY&augw)YIayJP0#7~%Mp>*5^JYjD+L*;%L8DfIGldN zp!m<9rDyL4wSPG3hE}vhs-6&VNy2u_j%H#>W#NkUd^XMnC*_Kz)*%mN+bVag!{Ir& zCPF&oRb4pbMbf)iO)+2<9$*|;Sfp9>BkLFFqVWm=*Ms>nNHoVtMXc>U=~oI-{h)rg ztg4$xfIm!VaeikWO*s02JD5OR%f68lpR=y*65?dsLUrlBtH84(`K)QJZkZl35Pmc( z2h0I=rM#wvwrMTy;QTnLLGh~6eFL0h9A7$6w|4DFp>}PirT%*Leg*ntwwk&xCOf7F zoHN5u6B7$9hoLRMp_}7)(9uK;ls2f0;tfUj?J>RSp(@KHjuMzQZ3fUxnv#Xz9Z+x( z*FS%J)&<Qi;7}tK^eQgFSCOP5<oxYgS?6wtpOpQ?6WM}L3O^c+f0+hp$7=;t>c$G& zBSfIOlqmQPrL2i6P?@-veZQN9>&I0*5n9g&tpW6GYxvNHhy)5wYW7xPk60J87kiR@ zjQuuXyUDt8DZgZbD(w5P$OJDHBi{gLT=>BfCb}S==qgte^;gXjx%}nl2O8q|tb})b zpGR8sf~VX1+KrBEvVs7FtA2rTh9N0>FuoYy&Citth(+llTcuE{ofD8nxp#&AIi^U9 z$VTpg+<EA`{3S2~eIp1GtF><5QF<9JI;9+nz}8xF^yP3M1C+M(WkGW>I5o)x#lrKB z^|xd?JRIfLm#3Yzi*Gdq-iv-9I4ypB5o$2SQ7r}GKn7{6Gd|%+G=!*k+Fc_Ng3u0g zr*anfgg&rMEm+rLo0NaFMnVdiFmGoS=g;|xGNfa38j{NE+;uF*%34?Sg4-E4e>QH7 z9zwrGW~bPU`4PI}d+R%?J-}IR>-pl|j~*2>v>pR_*354sG{g&ZavnRydC&x6l_SqY zoE}vu<oUB0VRUETZs0tOg(ES_jck#Laln;WrqfK`p~O<nDieExXlN{4M}-pF6YT0R z{isj@jqA@y98nA+$ojyOVldt1FbC?v84@f!-^Gi}op?q`RlCYWkeKLDj?v$w>Q7d& z_E<bNWi2IFyaL~^nnysS>%wzci%`n6CINAYi*qPSy5E0faOjE}2lKH~1I7<Urt>S< z{E;Cks{cR$6;vz&_AK?UuSXm2UBxiNKH07(8>lGbhZVPZo+-W;TohAafRuv-e+WkZ zkpd<ZR~<nvK!ydgG9~OlvKImY+`6A{UDSj5DU$a^eWBUY@0v@B_dpG^kO>m#tTV)w z&k&%@DUaOH)JlWHsCa0dzB|wo=jE6+Um3B^E`+?1N$B+Lzb@`VCGh-tzeffbch8j# z0S6?oRdt4di~7~hLV`1`3vEh+)-zSRJdt4ytn5Fg%k%_voWm{*Uu$SeP{<kDC<_Mf z?jD+8PjfnKUu*dG@L2%hB4w=0I*$_~L8VPhYW!z<+f;XwpCn5?O54&IAOO|}$0q6@ zr<FA&u;o5^Dp&i9TVD@+0Q)hq`)OIIZU*hk7{nnY?7qV42n~w1_jwB)T955lu+$r$ zZS#bPP+axy`V~=q_6q~=_O)61?tQBaBkTG`4YrlW6A6F4%`UgE0BjQ;I-cy$<e~B% zXgx)GcQW`Hio_KW?X$llY1)%FiL{Ec0`$%Hwl8nEFL5`?(DrtM^q24A0N3=uyuh6G z(1SGhVpU@3eY%2OnC0C~BL}aO<cANXNlMVb?$}wQ@1F7Qu3lljJfHCi(Io?Hvs^@L zFdr`}$$q8F8J--p+^9U&hTQux?cX?fVp<|{2G%ip9M9H54JlIN=+C%0%kyBOo`eZ) zlrwu=I<5A(RXgnN#AR<(i#!GzD`<$6J_yMcu$c!_`4n~C2kf3<Qi#mY{kUul$uf6m zV@6a)2az%O(tf%v8w|;MAFOtx$@Ka+Epgq*&@BbQu_SaM3;p0>?5-?ulbd``h5aSa zPaL^w4HE5E6I=YUnW$Eu?@~YEsInu3805@`BKO7LTJAQeQmB1opu`zXmqIzghTT|m zGWm9l-MOU?2TpE7hd@KjWE-8$PsRUo7w3+nYSN3ucd4mSj|peJv_Jl{=`1%_UqDs+ z$}Nt#;z=zBYoV@jaFPO`C}to94)om}A3Ti7w6gVj`~5<>FYNyFe4C%{=GmtDiW=#i zyjd_)yEiK0&ai?2rF;c>Sq2N#nD*CiIkL)mrd?BLs!+G0EL11YcM;||s&3FN?BiBy zUc2`{Zn&IxMU@$v(zInM1+`_11$IOW)HmY0kzw;jKB@h3P+Tzsod|aDXHE!*b`Gt) z`px<1sT*pzXS!DN;|5L%nnSR&Jw`RAC5{CPMi(x(uMcfML?)#35MMOhdcXX<?g$?b z8~gUc=Y|O(F{)$m=6g+QM&;nnl*GHJjBrXGWJkG~&1`k*T{z7Ok2u=TA-Wg3XsD1E zx|#`RM@Ek8&Z*=BWx<nD=(jR7y;|G0=&>Hg8^3ieD!cjApagJb{fMMCtr&v_nxD}R zM!);lu@KXA+GRzL3y~m~4w8qbfPq=e#r7B%8i2v>$Hj=@0*+*Hze65rpa%(B6c-DI z@S=Zawwt_|nn9XtR9dvU785_si50i7hkz$M+&FEj`T+5g3&6?cGkl2jy%n~EaY z?b%Y?BoI<qQ*qW~v3@ZH1yaUx-39Klw*u>N)w;M%;`xaxPyp93BkAYhvgx-TvI{lV z6O(3&>kcN6<dQIt^_5%AVf~tlr=Dy%UbWZ;WzSr2!Bt~@IH;RocRLK^R&TpGbN?!3 zfLl7t6q%Fk$8C#6ydcoTVDwcl>_U2FLz?cH0A@A(tlX5gP`5o3bQSKWFB*PpioxI< za6P?eYOotH0^7xdqNg18<d1EWrfMdt(T^8y-ArW_99WNnl{#m<;_XPw4k~a^$r(d4 zbZ8>yZBi&7$N|!e@$lj+t##x!aDJcPp|o?Rc_>z?T+HI%z1Ep{Vs47?@yWQAYoC*N zd!)ExwHlS+p^8-OJOMyFy*Q9;Y`(;^(8je7NdMjC=Z9!Y;lEYEO1?v&`TiY(SkNm@ z+h4-RHmT5Nz-I9CTGhSI<c`!JSl;q_8+YRD%9*I+=>n%0Ph*>^s!ioQK^H1T;d6bg zxP}9phCfGonE=I}QnqPAlD^|sV1%(R;dZUBgz92m4*AEG`-{`FCEc}M+!LoG8(jkY zV0UOVG2<@Q9Xm!WFdK76T+R(W0a;ol8;j`C$La$u6WfHCwf<xB$}}HU+uMuCL8h{H zhFe^Nqh*~PUUqE-hLA;nziwK<PNBc0j0n<Zj!LGFmMQ9|HEsqs=0!6LlFZew!kI6c z$DeI=%-hZFE81GR<}SJ*Apr>MvKOPx7((Tv5eE6F!46%J;^;*CC#DT!lR{ng6(J*o zuqPbX4TN=fJgY(&!mZ-Zv4ftF-%u)Z^!G#Ip<ILS`1BxcxP@=mygJrZcUN75Pdo2) zf3{^Jy6C#k61eI%rPaE#YQ?G_VZK*eRH`bW&oFr&UpLVeT(pcZ@FH1P4bHTbxXEu| zv4j1nVrTk5LtA_=JHgbyRp52F%cK#U>nP7`W)ImvSm2*10|7~v;O|GE-yWbXs6ye0 z?TO;@+zdVy;6!k_{AW6i(&qe{9o$JVph5qv2Ok?dkR?w?sh(;KW}d`>pajEO8M-h@ z&2vZ6$n`>je&8#=qZRUMt3Q)Pc(Oyb*T^DYy@k_7n8Mz+s8@(CU&f3a|2q}pHMuW7 zaB;-0Pwzu@ItC{wu-0vAUpy=8<`?;>>>f^U1-3tvTr=77R-RAyFkdc^uR1jzjA!aA zcM5z1TWxH^K!FPe_(GU7y};+G8;%3VxY`GI!^#TZJ%w!y$jn6O=cQ%!V3jim8dQ(+ z+iRXvE@yc!(xH)-Yb6-JTlKLDu=hP59&PyKykXiu@ZGJF%WHp77NBh3IU8T2DtdGW z*(O;#;$P-yg=tguI#M?}EjzI~7JPRO?CpLMC@I{Ov9LK)Me{US`tdQMZUZ18{_vs3 z+wW23^)3!m3|vYb^wB)NFZ?F(u()amKF_Bl$i^b?yw};w;o-z66WFoW;am_g$$a!X z8D0U{TsSHnKO8J>zI@4lneeoHa@d>|s7wM21TSvSMOubM#zH7#(1UB2Kv~6)C!YMK zWnzIIAp3y4BitX)*2VxFsnK)MeLnYTeH{p;+&^!*W9@eB!hWdN8kHH15ZwYc6_p=J zuwhB%D$sf$OOuvmm6L(Lap{x>7VB^~v~A@yKWA@!1=mZ!%H7oUIrPWX+}W}^my09M zp8JD<JF65XX#nyADk>=M9P4+L&y9ueWX_+~Tk=M*G=Zu!@OSq&4`$JhhpL(ZO>Ed6 zQDr$PCMw)+(bkaQi~f~_x)6K%?cO<*I2tO+C1nr^33nF+1LPl?;DG*Wz0f0(h~+8o z^J(Fs$JY#2(Qr^<yd*5XApnZ$@%Ad&qyvJ_SdAwhwUb0y{Z)Esn}?Qqzw_dh5;MC5 zuxZe*L;<4&Jo6|wAZV#&AXAv_)dN<7k%z-00=d-^-kn!%dEs0F-z<g%{W;h^W}9j` zqJpn!dALcYk0ND5inMe~R<;VA=JfA>zxa+&TC*V^Bv_e*S#bB8Mm6MEgUK`GGsDdh z90>+x9}-5tW=+zntSYI>*zD!8|8>tz3DA6FQM4!7{EVDEKp^_Pn;ssTeu5A1UGBUA zEyxfgx%g^X7P~H1+`yqN0-`#BOhCN-!mU)kR&t8T-I)EF&f=nX3yd_3D@8|-#8tug ziYL1Pp|mB&2)f>FQHaeE@qJ|Hp~M~*Sb2XmJ-!f14!GJ^J#z92iqc10(pnk9JD(xo zo0+?~;QO2x<#CF=d8G`!@=_Yrc5(yN6{V{5UNMMhFSj!#b-}YLA2Pwi)v1sLRbAi@ z2w++P3trOCwZ7)H91fFeFyxnb4Kr6}F?X#f-pO7SIpX^xp=J4m9Vj3cr<gw@ARI0Q z{K~wUdqMXZzjs~I;V_ulsnnf3**yY8kncrjenNAIy6cAWVd5m>p8^KB_I9MyQz1o7 zN7ov-*7~c9N(+of*MQ@N?iKThryB54X3Y$Ao$lf}@D8&J`H9pD9C61}4Su4C)JpP; zjwyk+6}An_M!!#)Jyn^n_T9>+ia$q;8j&S>s>!+evzfpoTMNxc(m2kEQ1Kdr2yB;Z z(qw}xjLwPBg%-DP5HuPl!Op`Pe?f~=x&-2DXYx=t4U=!-GQ3~!x<N(LPe{Dpp@a>8 zYxe#q7`97y&Qum28GtrEq`LN+by?8lgSTu(o-FK-a4=f~jnoxM31aoPq+R9yY>FC$ zG2&bfD*$k>HP2V(=wl{p9S5Y1tlZg(TU~`b;8b;nhf+%r0Y1XHIz#pctGy1@#hjiA z?ZX6w@loKL<pP0R=EdTyKiW_gH2_HpSm)Dkj0s7IQus0210P}h1nx9@ReS@>tYJ3# zXEFI8R>hyAr*+PIaL&L;&umIyaL(8<{XP*o=)CqfLGVk>vm;UB{c+y2dH-NCwMac+ zz7ievl|ne&Rp|fjcR2#S7hh32a#e^^5u;_Jqj>?5BT3J{Be&OnX+_Zqvg(Cq$JndW z4LJ_8E8n)$rTRM6i~@G%kU6X3+jFdSw@gzQDt1bQy+jUfT52No9`M2U@@p41!EPuU zRHtOlh0s*WwC-abk_{X#$CNGuB~&!NWbC{pDO%T!maTtbKGjn^aqaY!Gmsf2Y%FZL z{o8&h(pfzTVl-7YR-TI2B`$C*I3ZwEBMizWoe}eXydxLPpo}AyOH_7Ej~X#~AVM>i z3qGiab7E2^NBWH{l|3!rUQYt`9JzzzF%Rzze0K<nJ{2MHHDnMMM$KBIE-lS@kB|i` zKlQ;JvOD`cQ9CW);431xscm~jh*?C45&p|Bzecu()4}?caVwMQXx5q<x{feujB`qW z6U%TQi1G81uHuGfnU;6j(YA3ak7M{Qoke=e$FIQmj*O*CyQy5I<jBeo0?`us?0wcN z)#=-HSNDak04S3mb`((?Y6)UzjP{!)gHnthELb1d&aFo#JM<z5&L3}+`=)z$=fGSe zdhP6l=6bQNAXvI94-lH}Ga#lYN5P~pJWm>rQq!if1fee0on^C_{Q%)?5t|oZ`QN`x z_O)F!sn}}Q*#ER8X>7ypW&5<d*XA!^>-F4Wj&W38Dm0%m@l%zI9rYW-3tvv^+I>H! zsH0QHa(6`Y=d-27k<F4N4o$yhAzRP0aGTSLC6OL~y(mdrxZW_4s12EoH`YD|B7>Bz zyY#JWK={_qr|%(HE=L>g$GkD6j++dSuIcochK=<Jd8+=Ss{qJ3Tf0Xa`lt=#JTV8_ z^Pf&+Y>M=q<Qz9qt=^J?ktFj=?Rl-+%DQ&4_U_6|t~U6BG|#$U4DecQa1$!k1%XCa zDHI3X1-A=P8JQU(hX2a{#y?qhzV0bH@ztRVF(jo@C#QdN|LZy)#vJWd1D4|))XAXi z?XjH~l%8b$Wc_v}T;Wy&)AAv%76+r_Io}cP(0+ft#K2q_NB84K4-OJN_4v3Gr8OC1 zYv-@ewP*fu9T8bbJDw@@7>G{pK9KePICprUzjf-HZ__CvwG$FYvEf9&a%3XPA_jfd zTzHW5(#=>u%>zRm%jb31Ugq&iH9WA*PSb^vgz<z#4G(rOQbU3BqgORg<Yg!xhk*8B zYe?fY4j?1*5#fRDj3@doLUlxf>iz|{6eKRBd#L*+DunR7iJC8(*LwM3V-a465?9EJ zt&71?RCPfZuJ<MbbH6``%L2JvhJB+pH#DxJDYd8Q%No}%rf6lw(U34@dq8vT*<;p@ z0ghU)nLk>+r<#{Q5B>uLqSLhLHn=O1kLE$1Vg}+2<#Tr2(E$6|x1#M*YB$*|@NGbN z&+gI&2Y&l?c?eHM_*fw8yBbz?IqK`^{PLwNHQ6!@0qcwxDZ|=TKWt7E_i0KamIE?Y z!`jGbuVE=etyG4-tAKD>=i8>CCKs2F!*JfI7ohjwm8i>~ZSC`}k24?OU{Y2CFW(RT z`KHzyIbU4sG3PsO=cBE$96bo)ImSKVr};&M{rM=fK5`MlEDwF09-<L1vpC=;4;?bF z)Bx!a&ZHeBU2T2WP9Q=$#THO<S1~>_h3$3`r!JdCwhIV{*iCDp7yE!@Ln0DxoJufz z4c~b*t%y&3woG6Kpc13|B?Tp)dl+3yxo)A-kVas(iJpHqRc7kX&rp@O$GeU3jR=Xl zW@6ofcC&$?FNKR~`93c%N$P8jGGgRasrqUo2{%;?6H;R^Y_oJCY%>5ujlIyubQ7ok z+q|jvaH6ifRaA&K@3&%+5Th#;iztdh^Q3v2F1_9RZ*`Z4dqqi&;N|jK0#%n}1H3jE zsEBJ_1<p(gl$*bB<@hm*$b76BXrH83=-S|DE;A4oz6ihxr52jqaF;V9<dWu=H@bhb z->Xyjfys_!En2?wp0*MO2WF&!Bw)~~bY5GnCa!U)R0xW9Xwl<=O4T?y<>Jo5eUapH zMFQ7m*|zJk+0fqo2;k{5lD>_((yXrgF(9W2*FB&7$j0=2_UXD=jr3|9I7gZ8;W-wh z*By1H)%=<4&>~W<PFC`4bFZs=&_`>&j}1zeeD4}r>!l>j&Wux1ca8CB)bgn;18^MN ziB^dp2G8j>8{BfwzFWPN2%QY=j+Rh;5PtSPSY|{DqBK7-9(EA5Sty0lJYwbXp{x+Q zm~X_ahe=GniJ&_h-`W3&5fmkSWS8v5-lhkANLzVoKLWjq6r@zzR&Sx^i8yBA9`tKy z+RyDvTyje0$`f)me(;PIYlZER%{v!@DmHS_`mDTaaL9mg%N0Y+X-Z3qcG_c`bUSV? z_;+F#IQ1?$lTxmnZYf8z-Lc-i&dplxO`#2?=F(kOeesubejY!?uCZege<jZ`*n~wj zM9t~Dt>NHp<0F?EETG|irLCT5K*jSC`utODfDZI^|9aa7ue!6S*UWkg9TTp%j+{+K z%P`-DjO|wWDl#hmgYPs@)T>1E#n7muOU9?$&@w(FvW{p6Rv=+FkbZ&9cypaHsnHn= z5B_=A?nkgq3!(KQ!7I7VOrIFrNq?|~wDp&U9<fC+Yirexm?&%IxPM`sD>Em;>k227 z{Ugo`;IZ`Q4jqet9vbjO2(SF7sp!KTis~h0S+R|D>AKd$=ARqRxt*mXWt3~?tZaaV zzTm1naRX5sEltGLa6<M!H{cO<5e-B^#Y<7^{v0YP8i?j1&SM9tI(H^u*4xYm*t8ho zRRfRntMVFXtAXO`Q1Ju-TyOx(#Xsu*+rt=+kLTakr%i$M8#Hh>J!0eG(OuyS4Lv|a z<6_nj<$G_ytwU@78`&gyAIHP#J}D_Ky7JC7a08<S1OoeCfF%4El+DjpUI%pZ|I&0X zzV{>ebdQ$qcksys{mWja(NCSetSh1)euxh5>YI9kectIjgK~EPp&h(9*p-pz!T{iG z-Y4c@>byAPstRX_($bZ`5w&vE;C6*q`1m6H<zs)<y2lgxRs$O?v~Zwd!PYD<&`X7R z+jh2oi2nlI{9I~PiuW&9YCg|ks0n|%e3zoyeY2P1vyD)^cTb;Hh1-?i2m}O#>BE6z z0MtCoUvBLdZX<1dtLl6=_7eu^P0i<<YE<P(Aod`($*46A=cfZ9l<?39O>Ip?e!AvI zSUqFb9^hRvew1*I2(V~XvQO`5ee^@PMSI>1A;QvmPNA*A-JofHZp14CTJ76CZT@^# zJ_NK(XJ-GOY<+b=Is6=ogJJ{_fWyT0NfDS3m5&-^v%%t|<!k6BEFs474)_^6Enxtb z4i>ClfQ3i1kJ+{`fad2Rh0@pT0jB2mm>sDQs;cu7IDx*fy5f⋙&36A?yQnzj~lC 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 Y{a;N96ZIGX07R%yF6uF{&HAhN9~am_^#A|> diff --git a/datasets/xlsxTOjson.ipynb b/datasets/xlsxTOjson.ipynb index a9447ce..22e75ae 100644 --- a/datasets/xlsxTOjson.ipynb +++ b/datasets/xlsxTOjson.ipynb @@ -2,19 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "86f8df89-a483-4093-9098-41196f891c64", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", - "import simplejson as json" + "import json" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "id": "efd2d705-f64e-433e-a26f-ed8d7c78c667", "metadata": {}, "outputs": [], @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "id": "b6873712-56e4-46a9-8bec-031093dd28b1", "metadata": {}, "outputs": [], @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "id": "8cc123c3-8fd7-4c82-ba85-3ca5d7d7bfa2", "metadata": {}, "outputs": [ @@ -53,7 +53,7 @@ " dtype='object')" ] }, - "execution_count": 4, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -64,53 +64,94 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 52, + "id": "b7d12c35-c334-4beb-ba2a-a8753e8100e7", + "metadata": {}, + "outputs": [], + "source": [ + "COLOR_PALETTE = [\n", + " \"rgb(104, 169, 77)\",\n", + " \"rgb(102, 75, 154)\",\n", + " \"rgb(41, 171, 226)\",\n", + " \"rgb(224, 133, 35)\",\n", + " \"rgb(214, 207, 126)\",\n", + " \"rgb(239, 65, 35)\",\n", + " \"rgb(255, 255, 255)\",\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 53, "id": "e9481135-3734-45ed-9847-8f9426bd0f00", "metadata": {}, "outputs": [], "source": [ "nds = []\n", - "lks = []" + "lks = []\n", + "object_groups = []\n", + "name_to_group = {}\n", + "id_map = {}\n", + "node_ids = 0\n", + "group_ids = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "3b4f6841-2c52-4bc4-a03e-005eb7153881", + "metadata": {}, + "outputs": [], + "source": [ + "for idx, row in table.iterrows():\n", + " id_map[row[\"id\"]] = node_ids\n", + " node_ids += 1\n", + " if row[\"Art\"] not in name_to_group:\n", + " name_to_group[row[\"Art\"]] = group_ids\n", + " group = {\"id\": group_ids, \"name\": row[\"Art\"], \"color\": COLOR_PALETTE[group_ids % len(COLOR_PALETTE)]}\n", + " object_groups.append(group)\n", + " group_ids += 1" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 55, "id": "a138d20d-4dc3-4eb8-8ebd-71d1fb3f0cbf", "metadata": {}, "outputs": [], "source": [ "for idx, row in table.iterrows():\n", - " node = {'id':row[\"id\"], 'name':row[\"name\"], 'description':row[\"description\"], 'type':row[\"Art\"], 'video': row[\"Videodatei\"]}\n", + " node = {'id':id_map[row[\"id\"]], 'name':row[\"name\"], 'description':row[\"description\"], 'type':name_to_group[row[\"Art\"]], 'video': row[\"Videodatei\"]}\n", " nds.append({k: v for k, v in node.items() if check_value(v)}) # Remove empty attributes\n", " for link in str(row[\"Links\"]).split(', '):\n", " if link != \"nan\": \n", - " lks.append({'source':row[\"id\"], 'target':int(link)})" + " target = id_map[link] if link in id_map else id_map[int(link)]\n", + " lks.append({'source':id_map[row[\"id\"]], 'target':target})" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 57, "id": "c06e658c-33d1-4ba8-8a47-ae857984d6ce", "metadata": {}, "outputs": [], "source": [ - "result = {'nodes':nds, 'links':lks}" + "result = {'nodes':nds, 'links':lks, 'objectGroups': object_groups}" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 58, "id": "565d11cd-47b6-402e-a734-b4b8a5a66181", "metadata": {}, "outputs": [], "source": [ - "jr = json.dumps(result, ensure_ascii = True, ignore_nan=True)" + "jr = json.dumps(result, ensure_ascii = True)" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 59, "id": "de7e0bae", "metadata": { "collapsed": false, @@ -128,28 +169,28 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 61, "id": "589984bd-3033-484e-a7a9-bfcaf4547372", "metadata": {}, "outputs": [], "source": [ - "with open(\"aud1.json\", \"w\") as f:\n", + "with open(\"aud5.json\", \"w\") as f:\n", " f.write(jr)" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 60, "id": "5ec60a2a-6703-46e4-a649-be731cfbe428", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'{\"nodes\": [{\"id\": 1, \"name\": \"Begr\\\\u00fc\\\\u00dfung und Organisatorisches\", \"description\": \"Eine Einf\\\\u00fchrung in die Algorithmen und Datenstrukturen\", \"type\": \"Vorlesung\", \"video\": \"https://www.ibr.cs.tu-bs.de/courses/ws2122/aud/videos/VL0.mp4\"}, {\"id\": 2, \"name\": \"Rundreise Problem\", \"description\": \"Gegeben: Ein Graph G = (V, E) mit Kantenl\\\\u00e4ngen we, Gesucht: Eine k\\\\u00fcrzeste Rundreise, welche alle Knoten im Graphen einmal besucht und im Startknoten wieder endet.\", \"type\": \"Beispiel\", \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/2_Bsp_Rundreise-Problem.mp4\"}, {\"id\": 3, \"name\": \"Puzzle\", \"description\": \"Jeder hat schon einmal ein Puzzle gel\\\\u00f6st, doch wie sieht das aus algorithmischer Sicht aus?\", \"type\": \"Beispiel\", \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/3_Bsp_Puzzle.mp4\"}, {\"id\": 4, \"name\": \"Algorithmus-Definition\", \"description\": \"Zitat: \\'Ein Algorithmus ist eine aus endlich vielen Schritten bestehende eindeutige Handlungsvorschrift zur L\\\\u00f6sung eines Problems oder einer Klasse von Problemen.\\'-Wikipedia. Dabei wird als Input eine Problembeschreibung gegeben und durch Anwendung des Algorithmus eine fertige L\\\\u00f6sung des Problems ermittelt. Oft spielt die Laufzeit des Algorithmus eine gro\\\\u00dfe Rolle. Sie beschreibt, wie viele einzelne Schritte n\\\\u00f6tig sind um das Problem zu l\\\\u00f6sen, in Abh\\\\u00e4ngigkeit von der Gr\\\\u00f6\\\\u00dfe des Problems.\", \"type\": \"Definition\", \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/4_Def_Algorithmus.mp4\"}, {\"id\": 5, \"name\": \"Kofferpacken\", \"description\": \"Kann ich alle meine Gep\\\\u00e4ckst\\\\u00fccke auf zwei gleich gro\\\\u00dfe Koffer aufteilen? <br>Gegeben: Eine Menge von n Objekten, jedes mit einer Gr\\\\u00f6\\\\u00dfe li; <br>Gesamtgr\\\\u00f6\\\\u00dfe \\\\u2211 li = 2K<br>Gesucht: Eine Verteilung auf zwei Koffer der Gr\\\\u00f6\\\\u00dfe K\", \"type\": \"Beispiel\"}, {\"id\": 6, \"name\": \"P und NP\", \"description\": \"Die Klassen P und NP teilen algorithmische Probleme in zwei Kategorien auf. Die eine, bei der man mithilfe eines Algorithmus eine L\\\\u00f6sung Pfinden kann (P) und eine zweite, bei der bisher nur das NachPr\\\\u00fcfen einer existierenden L\\\\u00f6sung gelingt (NP). Wenn es allerdings keine L\\\\u00f6sung gibt, so l\\\\u00e4sst sich das bei Problemen der Klasse NP nur schlecht beweisen.\", \"type\": \"Definition\"}, {\"id\": 7, \"name\": \"Einf\\\\u00fchrung des Algorithmusbegriffs\", \"description\": \"In dieser Vorlesung wird der Begriff \\'Algorithmus\\' definiert und erkl\\\\u00e4rt.\", \"type\": \"Vorlesung\", \"video\": \"https://www.ibr.cs.tu-bs.de/courses/ws2122/aud/videos/VL1.mp4\"}, {\"id\": 8, \"name\": \"Datenstrukturen\", \"description\": \"Eine Datenstruktur erlaubt es, die f\\\\u00fcr eine Aufgabe notwendigen Informationen geeignet zu repr\\\\u00e4sentieren und den Zugriff und die Verwaltung w\\\\u00e4hrend der Bearbeitung in effizienter Weise zu erm\\\\u00f6glichen.\", \"type\": \"Definition\"}, {\"id\": 21, \"name\": \"Organisation und Pseudocode\", \"description\": \"In dieser \\\\u00dcbung haben wir noch einmal organisatorische Dinge besprochen und uns mit dem Thema Pseudocode auseinandergesetzt.\", \"type\": \"\\\\u00dcbung\", \"video\": \"https://www.ibr.cs.tu-bs.de/courses/ws2122/aud/videos/U0.mp4\"}, {\"id\": 9, \"name\": \"Pseudocode\", \"description\": \"Pseudocode ist eine Art Algorithmen einigerma\\\\u00dfen einheitlich zu notieren. Dabei werden zwar Schl\\\\u00fcsselw\\\\u00f6rter genutzt um eine gewisse Einheitlichkeit zu bieten und gleichzeitig die Logik zu beschreiben, allerdings geht es noch nicht darum einen compilierbaren Code mit korrekter Syntax zu schreiben.\", \"type\": \"Definition\", \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/9_Def_Pseudocode.mp4\"}, {\"id\": 10, \"name\": \"Einleitung in die Graphen\", \"description\": \"Eine Einleitung in die Welt der Graphen am wohl bekanntesten Beispiel, dem Haus des Nikolaus.\", \"type\": \"Vorlesung\"}, {\"id\": 11, \"name\": \"Haus des Nikolaus\", \"description\": \"Jeder kennt das Haus vom Nikolaus, doch wie wird es gemalt? Wo setzt man den Stift an und wo wieder ab?\", \"type\": \"Beispiel\"}, {\"id\": 12, \"name\": \"Eulertouren\", \"description\": \"Ein Eulerweg ist ein Weg in einem Graphen, welcher alle Kanten nutzt. Eine Eulertour kehrt dar\\\\u00fcber hinaus auch zum Startknoten zur\\\\u00fcck.\", \"type\": \"Definition\"}, {\"id\": 13, \"name\": \"Graphenbegriffe\", \"description\": \"Ein Graph besteht aus Knoten und Kanten das sollte inzwischen jeder wissen, doch was parallele Kanten, Schleifen, (geschlossene) Wege, Pfade, Kreise, Eulerwege/-touren, sowie Hamiltonpfade und -kreise sind wird in dieser Vorlesung noch einmal genau definiert.\", \"type\": \"Vorlesung\"}, {\"id\": 14, \"name\": \"Graph\", \"description\": \"\\\\u00dcber Graphen haben wir bereits viel gesprochen, doch was ein Graph genau ist und wie man ihn definiert erf\\\\u00e4hrst du hier.\", \"type\": \"Definition\"}, {\"id\": 15, \"name\": \"Wege in Graphen\", \"description\": \"Eine Kantenfolge W in einem Graphen G hei\\\\u00dft Weg, wenn sich keine Kante darin wiederholt und geschlossener Weg (Tour), wenn man am Ende wieder am Startknoten ankommt. Wiederholt sich kein Knoten spricht man von einem Pfad. Ein Kreis ist ein geschlossener Pfad. Bei einem Eulerweg/ einer Eulertour werden alle Kanten des Graphen genutzt. Ein Hamiltonpfad/kreis nutzt hingegen alle Knoten.\", \"type\": \"Definition\"}, {\"id\": 16, \"name\": \"Beweistechniken Teil 1\", \"description\": \"In der Mathematik und auch in der Algorithmik spielen Beweise immer wieder eine gro\\\\u00dfe Rolle. Es geht darum Aussagen zu belegen, zu widerlegen oder auf bestimmte Elemente anzuwenden. Dazu gibt es verschiedene Beweistechniken, welche ihr hier finden k\\\\u00f6nnt:\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 17, \"name\": \"Bedingungen f\\\\u00fcr Eulertouren\", \"description\": \"In dieser Vorlesung werden notwendige Bedingungen f\\\\u00fcr Eulertouren erleutert. Zus\\\\u00e4tzlich wird das Kapitel 2 noch einmal zusammengefasst und es werden Algorithmen eingef\\\\u00fchrt um die uns bisher bekannten Probleme zu l\\\\u00f6sen.\", \"type\": \"Vorlesung\"}, {\"id\": 18, \"name\": \"Algorithmus Wegfindung\", \"description\": \"Dieser Algorithmus (2.7) erh\\\\u00e4lt als Input einen Graphen G mit h\\\\u00f6chstens zwei ungeraden Knoten und liefert als Output einen Weg in G\", \"type\": \"Algorithmus\"}, {\"id\": 19, \"name\": \"Algorithmus von Hierholzer\", \"description\": \"Dieser Algorithmus (2.8) erh\\\\u00e4lt als Input einen zusammenh\\\\u00e4ngenden Graphen G mit h\\\\u00f6chstens zwei ungeraden Knoten und liefert als Output einen Eulerweg, bzw. eine Eulertour in G. Dazu wird auch Algorithmus 2.7 zum Finden von Wegen in G verwendet.\", \"type\": \"Algorithmus\"}, {\"id\": 20, \"name\": \"Algorithmus von Fleury\", \"description\": \"Dieser Algorithmus(2.13) erh\\\\u00e4lt als Input einen Graphen G mit h\\\\u00f6chstens 2 ungeraden Knoten und liefert als Output einen Weg in G. Der Algorithmus hat als Grundlage Algorithmus 2.7 zum Finden von Wegen. Auch l\\\\u00e4sst sich zeigen, dass man mit diesem Algorithmus eine Eulertour/einen Eulerweg finden kann.\", \"type\": \"Algorithmus\"}, {\"id\": 22, \"name\": \"Anwendung von Graphen\", \"description\": \"In dieser Vorlesung geht es um den Einsatzzweck von Graphen und es wird am Beispiel der Erd\\\\u00f6s- und der Kevin Bacon Zahl gezeigt, welche Zusammenh\\\\u00e4nge dargestellt werden k\\\\u00f6nnen.\", \"type\": \"Vorlesung\"}, {\"id\": 23, \"name\": \"Beweistechniken Teil 2\", \"description\": \"In dieser \\\\u00dcbung geht es um die Beweistechnik der vollst\\\\u00e4ndigen Induktion. Diese ist die wohl meist benutzte Beweistechnik in der Algorithmik. Auch werden Anwendungsbeispiele wie z.B. die Gau\\\\u00df\\'sche Summenformel oder der Zusammenhang in Graphen erl\\\\u00e4utert.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 24, \"name\": \"Graphenscan\", \"description\": \"In dieser Vorlesung wird der Graphenscanalgorithmus vorgestellt um Zusammenhangskomponenten in Graphen zu finden.\", \"type\": \"Vorlesung\"}, {\"id\": 25, \"name\": \"Algorithmus Graphenscan\", \"description\": \"Dieser Algorithmus (3.7) erh\\\\u00e4hlt als Input einen Graphen G = (V,E) und einen Knoten s darin und liefert als Output eine Knotenmenge Y aus V, die von s aus erreichbar ist, sowie eine Kantenmenge T aus E, welche die Erreichbarkeit sicherstellt\", \"type\": \"Algorithmus\"}, {\"id\": 26, \"name\": \"Datenstrukturen Teil 1\", \"description\": \"In dieser Vorlesung werden die Datenstrukturen Warteschlange (First In - First Out) und Stapel (Last In - First Out) vorgestellt. Au\\\\u00dferdem geht es um ihre Rolle f\\\\u00fcr Algorithmen und wie man sie implementieren kann. Das ganze wird am Beispiel des Graphscan Algorithmus gezeigt und somit werden auch Breiten- und Tiefensuche eingef\\\\u00fchrt.\", \"type\": \"Vorlesung\"}, {\"id\": 27, \"name\": \"Warteschlange\", \"description\": \"Eine Warteschlange ist eine Datenstruktur, welche nach dem Prinzip \\'First In - First Out\\' arbeitet. Man findet sie auch im allt\\\\u00e4glichen Leben oft wieder, wenn man sich beispielsweise an der Kasse anstellen muss. Der Kunde der zuerst da war, wir auch zuerst bedient.\", \"type\": \"Definition\"}, {\"id\": 28, \"name\": \"Stapel\", \"description\": \"Ein Stapel ist eine Datenstruktur, welche nach dem Prinzip \\'Last In - First Out\\' arbeitet. Im allt\\\\u00e4glichen Leben findet man diese Form der Datenstruktur beim Geschirr abwaschen, man stapelt die Teller und der Teller der zuletzt dreckig wurde wird als erstes gereinigt, da man die Teller von oben herunter nimmt.\", \"type\": \"Definition\"}, {\"id\": 29, \"name\": \"Breitensuche\", \"description\": \"Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgef\\\\u00fchrt mithilfe einer Warteschlange als Datenstruktur. Sie breitet sich aus wie eine Welle.\", \"type\": \"Algorithmus\"}, {\"id\": 30, \"name\": \"Tiefensuche\", \"description\": \"Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgef\\\\u00fchrt mithilfe eines Stapels als Datenstruktur. Dabei werden eher einzelne Pfade gelaufen.\", \"type\": \"Algorithmus\"}, {\"id\": 31, \"name\": \"Datenstrukturen Teil 2\", \"description\": \"In dieser Vorlesung geht es einerseits um die Anwendung der Breitensuche, andererseits werden noch 2 weitere Datenstrukturen eingef\\\\u00fchrt: Die Inzidenz/-Adjazenzmatrix, sowie die Kantenliste.\", \"type\": \"Vorlesung\"}, {\"id\": 32, \"name\": \"Inzidenz/-Adjazenzmatrix\", \"description\": \"In einer Inzidenzmatrix wird mithilfe von 1en und 0en dargestellt, welche Knoten mit welchen Kanten inzident (zusammentreffend) sind. Bei einer Adjazenzmatrix wird dargestellt, welche Knoten adjazent (durch eine Kante verbunden) sind.\", \"type\": \"Definition\"}, {\"id\": 33, \"name\": \"Kanten-/Adjazenzliste\", \"description\": \"Eine Kantenliste ist eine Liste bestehend aus eintr\\\\u00e4gen der Form {vx, vy}, welche bedeuten, dass eine Kante zwischen vx und vy im Graphen existiert.\", \"type\": \"Definition\"}, {\"id\": 34, \"name\": \"Wachstum/O-Notation\", \"description\": \"In dieser Vorlesung wird noch einmal mit den Adjazenz- und Kantenlisten abgeschlossen. Au\\\\u00dferdem schauen wir uns einmal das Wachstum von Funktionen an und definieren und die O-Notation um damit zu arbeiten.\", \"type\": \"Vorlesung\"}, {\"id\": 35, \"name\": \"O-Notation\", \"description\": \"Die O-Notation wird genutzt um das Wachstum von Funktionen abzusch\\\\u00e4tzen. Damit k\\\\u00f6nnen Gr\\\\u00f6\\\\u00dfenordnungen und Wachstumsverhalten beschrieben werden.\", \"type\": \"Definition\"}, {\"id\": 36, \"name\": \"Graphscan \\\\u00dcbung\", \"description\": \"Simple Anwengung des Graphscan Algorithmus, einmal als Breiten- und als Tiefensuche. Wann welcher Algorithmus besser geeignet ist wird in dieser \\\\u00dcbung erkl\\\\u00e4rt.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 37, \"name\": \"Wachstum\", \"description\": \"Die O-Notation wird genutzt um das Wachstum von Funktionen abzusch\\\\u00e4tzen. In dieser \\\\u00dcbung werden Zusammenh\\\\u00e4nge zwischen der Gr\\\\u00f6\\\\u00dfe des Inputs und dem Wachstum, sowie Relationen zwischen Laufzeitklassen n\\\\u00e4her beleuchtet. Auch wird die O-Notation an verschiedenen Beispielen erkl\\\\u00e4rt.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 38, \"name\": \"Wiederholung: Suche in Graphen\", \"description\": \"Noch einmal ein R\\\\u00fcckblick auf alles, was bisher in \\'Kapitel 3: Suche in Graphen\\' passiert ist. \", \"type\": \"Vorlesung\"}, {\"id\": 39, \"name\": \"Eigenschaften von DFS und BFS\", \"description\": \"In dieser Vorlesung betrachten wir die Breiten- und Tiefensuche im Hinblick auf ihre Laufzeit. Dabei wird anschaulich, wie die Algorithmen arbeiten, wann man sie am besten nutzen sollte und wie man Laufzeiten beweisen kann.\", \"type\": \"Vorlesung\"}, {\"id\": 40, \"name\": \"Induktionsbeweise Bsp.\", \"description\": \"Einige Beispiele, bei denen der Induktionsbeweis auch in der Graphentheorie zum Einsatz kommt. \", \"type\": \"Beispiel\"}, {\"id\": 41, \"name\": \"Adjazenzliste\", \"description\": \"Wie eine Adjazenzliste f\\\\u00fcr einen Graphen erstellt werden kann wird hier einmal genauer beleuchtet.\", \"type\": \"Beispiel\"}, {\"id\": 42, \"name\": \"Graphscan Beispiel\", \"description\": \"Hier wird der Graphscan Algorithmus einmal mithilfe einer Adjazenzliste als Datenstruktur durchgef\\\\u00fchrt.\", \"type\": \"Beispiel\"}, {\"id\": 43, \"name\": \"Verschiedene dynamische Datenstrukturen\", \"description\": \"In dieser Vorlesung beginnen wir dynamische Datenstrukturen einzuf\\\\u00fchren. Es werden Stapel, Warteschlangen und verkettete Listen vorgestellt. Au\\\\u00dferdem besch\\\\u00e4ftigen wir uns mit bin\\\\u00e4rer Suche.\", \"type\": \"Vorlesung\"}, {\"id\": 44, \"name\": \"Verkettete Liste\", \"description\": \"Eine verkettete Liste ist eine dynamische Datenstruktur. Dabei werden f\\\\u00fcr die einzelnen Elemente jeweils Vorg\\\\u00e4nger und Nachfolger mit gespeichert. Der Vorteil hierbei ist, dass neue Eintr\\\\u00e4ge \\\\u00fcberall eingef\\\\u00fcgt werden k\\\\u00f6nnen.\", \"type\": \"Definition\"}, {\"id\": 45, \"name\": \"Bin\\\\u00e4re Suche\", \"description\": \"Dieser Algorithmus (4.1) erh\\\\u00e4lt als Input einen sortierten Array mit Eintr\\\\u00e4gen S[I], Suchwert WERT, linke Randposition LINKS, rechte Randposition RECHTS und liefert als Output die Position von WERT zwischen Arraypositionen LINKS und RECHTS, falls existent.\", \"type\": \"Algorithmus\"}, {\"id\": 46, \"name\": \"Bin\\\\u00e4re Suche Idee\", \"description\": \"Ein einleitendes Beispiel zur Bin\\\\u00e4ren Suche.\", \"type\": \"Beispiel\"}, {\"id\": 47, \"name\": \"Bin\\\\u00e4re Suche Beispiel\", \"description\": \"Der Algorithmus f\\\\u00fcr die bin\\\\u00e4re Suche einmal an zwei Beispielen angewandt.\", \"type\": \"Beispiel\"}, {\"id\": 48, \"name\": \"Bin\\\\u00e4re Suchb\\\\u00e4ume\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns genauer mit bin\\\\u00e4ren Suchb\\\\u00e4umen und den darauf anwendbaren Operationen, wie Maximum, Minimum, einf\\\\u00fcgen und l\\\\u00f6schen von Knoten, sowie mit der bin\\\\u00e4ren Suche.\", \"type\": \"Vorlesung\"}, {\"id\": 49, \"name\": \"Bin\\\\u00e4rer Suchbaum\", \"description\": \"In dieser Definition werden die Begriffe \\'gerichteter Graph/Baum\\', \\'H\\\\u00f6he eines Baumes\\', \\'(voller/vollst\\\\u00e4ndiger) bin\\\\u00e4rer Baum\\', \\'Blatt eines Baumes\\', \\'Teilbaum eines Knotens\\' und \\'bin\\\\u00e4rer Suchbaum\\' definiert und erkl\\\\u00e4rt.\", \"type\": \"Definition\"}, {\"id\": 50, \"name\": \"Grundoperationen Suchbaum\", \"description\": \"Minimum/Maximum finden, Suche im Baum, Nachfolger finden, Einf\\\\u00fcgen und L\\\\u00f6schen sind die Grundoperationen, welche auf bin\\\\u00e4re Suchb\\\\u00e4ume angewendet werden k\\\\u00f6nnen. Und hier findet ihr die Algorithmen dazu.\", \"type\": \"Algorithmus\"}, {\"id\": 51, \"name\": \"AVL-B\\\\u00e4ume\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit speziellen bin\\\\u00e4ren Suchb\\\\u00e4umen, den AVL-B\\\\u00e4umen und ihren Eigenschaften.\", \"type\": \"Vorlesung\"}, {\"id\": 52, \"name\": \"AVL-Baum\", \"description\": \"Ein bin\\\\u00e4rer Suchbaum ist h\\\\u00f6henbalanciert, wenn sich f\\\\u00fcr jeden Knoten v die H\\\\u00f6he der beiden Kinder von v um h\\\\u00f6chstens 1 unterscheidet. Ein h\\\\u00f6henbalancierter Suchbaum hei\\\\u00dft auch AVL-Baum.\", \"type\": \"Definition\"}, {\"id\": 53, \"name\": \"dyn. Operationen auf AVL-B\\\\u00e4umen\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit dem Erhalt der AVL-Eigenschaft eines bin\\\\u00e4ren Suchbaumes bei Einf\\\\u00fcge- und L\\\\u00f6schoperationen. Au\\\\u00dferdem werfen wir einen Blick auf die Fibonacci-Zahlen.\", \"type\": \"Vorlesung\"}, {\"id\": 54, \"name\": \"AVL-Rotation\", \"description\": \"Dieser Algorithmus (4.9) erh\\\\u00e4lt als Input einen Knoten x eines bin\\\\u00e4ren Suchbaumes T, Vaterknoten y, Gro\\\\u00dfvaterknoten z und liefert als Output den bin\\\\u00e4ren Suchbaum T nach Umstrukturierung mit x, y, z.\", \"type\": \"Algorithmus\"}, {\"id\": 55, \"name\": \"Fibonacci-Zahlen\", \"description\": \"Die Fibonacci-Zahlen sind eine rekursiv definierte Zahlenfolge, bei der sich eine Zahl aus der Summe ihrer zwei Vorg\\\\u00e4nger ergibt. Dabei sind die ersten beiden Elemente gegeben als 1. Die Fibonacci-Zahlen finden sich \\\\u00fcberall in der Natur wieder und haben nicht wenig mit unserer Auffassung von Sch\\\\u00f6nheit zu tun.\", \"type\": \"Definition\"}, {\"id\": 56, \"name\": \"B\\\\u00e4ume-\\\\u00dcbung\", \"description\": \"In dieser \\\\u00dcbung besch\\\\u00e4ftigen wir uns noch einmal genauer mit einigen Datenstrukturen wie verketteten Listen, bin\\\\u00e4ren B\\\\u00e4umen und AVL-B\\\\u00e4umen.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 57, \"name\": \"Laufzeit von Algorithmus 2.7\", \"description\": \"Wir betrachten einmal die Laufzeit des Hierholzer-Algorithmus (2.7) und im Zusammenhang damit auch verkettete Listen.\", \"type\": \"Beispiel\"}, {\"id\": 58, \"name\": \"Beispiel Suchbaumoperationen\", \"description\": \"In diesem Teil der \\\\u00dcbung werden einmal die Operationen Einf\\\\u00fcgen, Suchen, Vorg\\\\u00e4nger/Nachfolger finden, l\\\\u00f6schen und verschmelzen von bin\\\\u00e4ren Suchb\\\\u00e4umen ge\\\\u00fcbt.\", \"type\": \"Beispiel\"}, {\"id\": 59, \"name\": \"AVL-Baum-Operationen\", \"description\": \"Wir schauen uns noch einmal genauer die AVL-B\\\\u00e4ume an und was man damit machen kann. Insbesondere auch die Operationen L\\\\u00f6schen und Einf\\\\u00fcgen.\", \"type\": \"Beispiel\"}, {\"id\": 60, \"name\": \"Dynamische Datenstrukturen 2\", \"description\": \"In dieser Vorlesung schauen wir noch einmal auf das bisher in Kapitel 4 gelernte zur\\\\u00fcck. Au\\\\u00dferdem geben wir einen \\\\u00dcberblick \\\\u00fcber einige weitere dynamische Datenstrukturen wie Rot-Scharz-B\\\\u00e4umme, B-B\\\\u00e4ume und Heaps.\", \"type\": \"Vorlesung\"}, {\"id\": 61, \"name\": \"Rot-Schwarz-B\\\\u00e4ume\", \"description\": \"Ein bin\\\\u00e4rer Suchbaum hei\\\\u00dft Rot-Schwarz-Baum, wenn er die folgenden Eigenschaften erf\\\\u00fcllt:<br>1. Jeder Knoten ist entweder rot oder schwarz.<br>2. Die Wurzel ist schwarz.<br>3. Jedes Blatt (NIL) ist schwarz.<br>4. Wenn ein Knoten rot ist, sind seine beiden Kinder schwarz.<br>5. F\\\\u00fcr jeden Knoten enthalten alle Pfade nach unten zu einem Blatt des Teilbaumes die gleiche Anzahl schwarzer Knoten.\", \"type\": \"Definition\"}, {\"id\": 62, \"name\": \"B-B\\\\u00e4ume\", \"description\": \"B-B\\\\u00e4ume sind bin\\\\u00e4re Suchb\\\\u00e4ume, welche f\\\\u00fcr externen Speicher (HDDs) optimiert sind. Dabei wird die H\\\\u00f6he des Baumes minimiert und es werden den Knoten mehr Schl\\\\u00fcssel zugewiesen.\", \"type\": \"Definition\"}, {\"id\": 63, \"name\": \"Heaps\", \"description\": \"Ein gerichteter bin\\\\u00e4rer Baum hei\\\\u00dft bin\\\\u00e4rer Min/Max-Heap, wenn jeder Knoten einen Schl\\\\u00fcssel hat, alle Ebenen au\\\\u00dfer der \\'letzten\\' genau 2 Knoten haben, auf der \\'letzten\\' Ebene die linken n-(2^h)+1 Positionen besetzt sind und jeder Schl\\\\u00fcssel eines Knotens h\\\\u00f6chstens/mindestens so gro\\\\u00df ist wie die seiner Kinder.\", \"type\": \"Definition\"}, {\"id\": 64, \"name\": \"Einf\\\\u00fchrung in das Sortieren\", \"description\": \"In dieser Vorlesung geben wir eine Einf\\\\u00fchrung in das Oberthema Sortieren. Wir stellen au\\\\u00dferdem einen Sortieralgorithmus mit dem Namen Mergesort vor und stellen grundlegende \\\\u00dcberlegungen zur Laufzeit von Sortieralgorithmen an.\", \"type\": \"Vorlesung\"}, {\"id\": 65, \"name\": \"Merge-Sort\", \"description\": \"Dieser Algorithmus (5.1) erh\\\\u00e4lt als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output ein sortiertes Subarray. Wichtig ist daf\\\\u00fcr auch die Subroutine (5.2), welche als Input zwei sortierte Subarrays von A=[1,...,n], d.h. A[p,...,q] und A[q+1,...,r] erh\\\\u00e4lt und als Output das sortierte Subarray A[p,...,r] liefert.\", \"type\": \"Algorithmus\"}, {\"id\": 66, \"name\": \"Sortier-Laufzeitschranken\", \"description\": \"In dieser Vorlesung leiten wir konkrete Laufzeitschranken f\\\\u00fcr das Problem des Sortierens einer Liste von Zahlen her. Zudem machen wir uns Gedanken \\\\u00fcber das L\\\\u00f6sen von Rekursionsgleichungen.\", \"type\": \"Vorlesung\"}, {\"id\": 67, \"name\": \"Permutation\", \"description\": \"Eine Permutation P ist eine Umsortierung von n Objekten.\", \"type\": \"Definition\"}, {\"id\": 68, \"name\": \"Erzeugende Funktionen\", \"description\": \"Erzeugende Funktionen k\\\\u00f6nnen genutzt werden um Rekursionen zu l\\\\u00f6sen.\", \"type\": \"Definition\"}, {\"id\": 69, \"name\": \"Erzeugende Funktionen/Mastertheorem\", \"description\": \"In dieser Vorlesung besprechen wir weitere Details zu erzeugenden Funktionen und f\\\\u00fchren das Master-Theorem ein.\", \"type\": \"Vorlesung\"}, {\"id\": 70, \"name\": \"erzeugende Funktionen Fibonacci-Zahlen\", \"description\": \"In diesem Beispiel wird einmal die erzeugende Funktion der Fibonacci-Zahlen hergeleitet.\", \"type\": \"Beispiel\"}, {\"id\": 71, \"name\": \"Master-Theorem\", \"description\": \"Das Master-Theorem bietet eine schnelle L\\\\u00f6sung f\\\\u00fcr die Frage, in welcher Laufzeitklasse eine gegebene rekursiv definierte Funktion liegt. Dies funktioniert leider nur, solange einer der drei F\\\\u00e4lle des Theorems auf die Funktion angewandt werden kann, ansonsten liefert das Theorem keine Aussage.\", \"type\": \"Definition\"}, {\"id\": 72, \"name\": \"Master-Theorem Beispiele\", \"description\": \"Einige Beispiele, an denen das Master-Theorem und seine Funktion noch einmal verdeutlicht wird.\", \"type\": \"Beispiel\"}, {\"id\": 73, \"name\": \"Sortieralgorithmen und Master-Theorem\", \"description\": \"Wir betrachten ein weiteres Beispiel f\\\\u00fcr Mergesort und leiten erneut die Laufzeit des Sortieralgorithmus her, indem das Master-Theorem benutzt wird. Au\\\\u00dferdem betrachten wir einen weiteren Sortieralgorithmus: Heapsort.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 74, \"name\": \"Merge-Sort Beispiel\", \"description\": \"Hier wird der Merge-Sort Algorithmus einmal mit einem Beispiel komplett durchgef\\\\u00fchrt und die Laufzeit des Algorithmus betrachtet.\", \"type\": \"Beispiel\"}, {\"id\": 75, \"name\": \"Master-Theorem Beispiel\", \"description\": \"3 weitere Beispiele, welche dabei helfen das Master-Theorem zu verstehen und anzuwenden.\", \"type\": \"Beispiel\"}, {\"id\": 76, \"name\": \"Max-Heaps\", \"description\": \"Hier wir aufgezeigt, wie man mithilfe eines Algorithmus Max-Heaps bildet. \", \"type\": \"Algorithmus\"}, {\"id\": 77, \"name\": \"Max-Heaps Anwendung\", \"description\": \"Hier wird der Algorithmus aus der \\\\u00dcbung 6 zum Erstellen eines Max-Heaps einmal an einem Beispiel angewandt.\", \"type\": \"Beispiel\"}, {\"id\": 78, \"name\": \"Heapsort\", \"description\": \"Heapsort ist ein Algorithmus bei dem mithilfe von Max-Heaps eine Reihe von Elementen sortiert werden kann. Der Algorithmus hat dabei eine Laufzeit von O(n log n), wie auch in \\\\u00dcbung 6 bewiesen wird.\", \"type\": \"Algorithmus\"}, {\"id\": 79, \"name\": \"nichtlineare Rekursionen (Exkurs)\", \"description\": \"In dieser Vorlesung haben wir einen Exkurs in die nichtlineare Rekursion gemacht.\", \"type\": \"Vorlesung\"}, {\"id\": 80, \"name\": \"logistische Rekursion\", \"description\": \"Logistische Rekursion bezeichnet ein Wachstum proportional zu einer Gr\\\\u00f6\\\\u00dfe. Dabei betrachtet man beispielsweise eine Bev\\\\u00f6lkerung, welche zwar durch Fruchtbarkeit immer weiter w\\\\u00e4chst, aber beispielsweise durch Tod auch wieder im Wachstum beschr\\\\u00e4nkt wird.\", \"type\": \"Definition\"}, {\"id\": 81, \"name\": \"Mandelbrot-Menge\", \"description\": \"Die Mandelbrot-Menge, benannt nach Beno\\\\u00eet Mandelbrot, ist eine Menge in den komplexen Zahlen. Interpretiert man sie als geometrische Figur, so ergibt sich ein Fraktal, welches im allgemeinen Sprachgebrauch auch als Apfelm\\\\u00e4nnchen bekannt ist.\", \"type\": \"Definition\"}, {\"id\": 82, \"name\": \"Fraktale\", \"description\": \"Ein Fraktal beschreibt nat\\\\u00fcrliche oder k\\\\u00fcnstliche Gebilde oder geometrische Muster und ist ein von Beno\\\\u00eet Mandelbrot gepr\\\\u00e4gter Begriff. - Wikipedia\", \"type\": \"Definition\"}, {\"id\": 83, \"name\": \"Zellul\\\\u00e4re Automaten\", \"description\": \"Zellul\\\\u00e4re oder auch zellulare Automaten dienen der Modellierung r\\\\u00e4umlich diskreter dynamischer Systeme, wobei die Entwicklung einzelner Zellen zum Zeitpunkt t+1 prim\\\\u00e4r von den Zellzust\\\\u00e4nden in einer vorgegebenen Nachbarschaft und vom eigenen Zustand zum Zeitpunkt t abh\\\\u00e4ngt. - Wikipedia\", \"type\": \"Definition\"}, {\"id\": 84, \"name\": \"Game of Life\", \"description\": \"Das \\'Game of Life\\' ist das wohl bekannteste Beispiel eines zellul\\\\u00e4ren Automaten. \", \"type\": \"Beispiel\"}, {\"id\": 85, \"name\": \"Einf\\\\u00fchrung von Quick-Sort\", \"description\": \"In dieser Vorlesung kehren wir zur\\\\u00fcck zu Sortieralgorithmen und stellen den Quicksort-Algorithmus vor.\", \"type\": \"Vorlesung\"}, {\"id\": 86, \"name\": \"Quick-Sort\", \"description\": \"Dieser Algorithmus (5.14) erh\\\\u00e4lt als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output einen sortierten Subarray. Dabei ist auch Subroutine 5.15 wichtig, welche als Input ein Subarray von A=[1,...,n], d.h. A[p,...,r] erh\\\\u00e4lt und als Output zwei Subarrays A[p,...,q-1] und A[q+1,...,r] mit A[i]\\\\u2264A[q] und A[q]<A[j] f\\\\u00fcr i=p,...,q-1 und j=q+1,...,r liefert.\", \"type\": \"Algorithmus\"}, {\"id\": 87, \"name\": \"Laufzeit von Quick-Sort\", \"description\": \"Die Laufzeit des Quick-Sort Algorithmus l\\\\u00e4sst sich mithilfe vom Master-Theorem ermitteln. Dazu betrachten wir die 3 F\\\\u00e4lle best-case, average-case und worst-case f\\\\u00fcr den Algorithmus.\", \"type\": \"Beispiel\"}, {\"id\": 88, \"name\": \"Mediane\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit Medianen.\", \"type\": \"Vorlesung\"}, {\"id\": 89, \"name\": \"Standortprobleme\", \"description\": \"Was ist der optimale Standort f\\\\u00fcr beispielsweise ein Amazon-Lagerhaus? Idee: Die durchschnittliche Distanz zu den zu beliefernden Geb\\\\u00e4uden minimieren. In Amerika ist dies leicht umgesetzt mit der sogenannten Manhatten-Distanz. Dieses Problem ist die Einf\\\\u00fchrung in das Thema der Mediane.\", \"type\": \"Definition\"}, {\"id\": 90, \"name\": \"Median (diskret)\", \"description\": \"Der Rank k eines Elements x (auch \\'k-tes Element\\') ist definiert durch |{y \\\\u2208 X |y<=x}| = k. Also die Anzahl der Elemente, welche kleiner oder gleich x sind. Speziell hei\\\\u00dft x Median, wenn er das [n/2]-te Element ist. [n/2] wird dabei abgerundet.\", \"type\": \"Definition\"}, {\"id\": 91, \"name\": \"Median (kontinuierlich)\", \"description\": \"Der kontinuierliche Median hat als Eigenschaft, dass das sowohl Integral bis zum Median, als auch ab dem Median gr\\\\u00f6\\\\u00dfer-gleich 1/2 ist.\", \"type\": \"Definition\"}, {\"id\": 92, \"name\": \"Sortieralgorithmen Sonderf\\\\u00e4lle\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit Sonderf\\\\u00e4llen f\\\\u00fcr Sortieralgorithmen, durch die Sortieren in linearer Zeit erm\\\\u00f6glicht wird. Dabei werfen wir einen n\\\\u00e4heren Blick auf die Sortierverfahren Countingsort und Radixsort.\", \"type\": \"Vorlesung\"}, {\"id\": 93, \"name\": \"Counting-Sort\", \"description\": \"Dieser Algorithmus (5.14) erh\\\\u00e4lt als Input ein Array von A=[1],...,A[n] mit Schl\\\\u00fcsselwerten aus {1,\\\\u2026, k} und liefert als Output eine sortierte Kopie B[1],\\\\u2026,B[n] von [1],...,A[n].\", \"type\": \"Algorithmus\"}, {\"id\": 94, \"name\": \"Radix-Sort\", \"description\": \"Dieser Algorithmus (5.18) erh\\\\u00e4lt als Input n Zahlen mit je d Ziffern, die k verschiedene Werte annehmen k\\\\u00f6nnen, [1],...,A[n] und liefert als Output einen sortierten Array. Dabei geht Radix-Sort im Gegensatz zu anderen Sortieralgorithmen ziffernweise vor.\", \"type\": \"Algorithmus\"}, {\"id\": 95, \"name\": \"Quick-Sort, Mediane, kd-B\\\\u00e4ume\", \"description\": \"In dieser \\\\u00dcbung schauen wir uns noch einmal das Sortierverfahren Quicksort an und sprechen \\\\u00fcber die Berechnung von Medianen. Au\\\\u00dferdem schauen wir uns mit den kd-B\\\\u00e4umen eine spezielle Datenstruktur f\\\\u00fcr mehrdimensionale Daten an.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 96, \"name\": \"Quick-Sort Beispiel\", \"description\": \"In diesem Beispiel wird die Funktionsweise von Quick-Sort, sowie die Laufzeit betrachtet.\", \"type\": \"Beispiel\"}, {\"id\": 97, \"name\": \"Mediane Beispiel\", \"description\": \"In diesem Teil der \\\\u00dcbung schauen wir uns noch einmal genauer an, was Mediane sind, wie man sie algorithmisch bestimmen kann und in welcher Laufzeit das m\\\\u00f6glich ist.\", \"type\": \"Beispiel\"}, {\"id\": 98, \"name\": \"kd-B\\\\u00e4ume (Exkurs)\", \"description\": \"kd-B\\\\u00e4ume sind B\\\\u00e4ume mit einer h\\\\u00f6heren Dimension. Mithilfe der Idee den Baum abwechselnd nach x- und y-Koordinate zu durchsuchen und so zu konstruieren entsteht ein Algorithmus mit dem man mehrdimensionale Suchb\\\\u00e4ume erstellen kann. Auch schauen wir uns an, wie man in einem solchen Baum sucht.\", \"type\": \"Definition\"}, {\"id\": 99, \"name\": \"(parallelisierte) Sortierverfahren\", \"description\": \"In dieser Vorlesung beenden wir das Kapitel zum Thema Sortieralgorithmen und werfen abschlie\\\\u00dfend einen Blick auf parallelisierte Sortierverfahren.\", \"type\": \"Vorlesung\"}, {\"id\": 100, \"name\": \"Bubble-Sort Beispiel\", \"description\": \"Einige Beispiele, wie Bubble-Sort funktioniert, inklusive einiger verschiedener Darstellungen/Animationen und dem Vergleich mit Quick-Sort.\", \"type\": \"Algorithmus\"}, {\"id\": 101, \"name\": \"paralleles Bubble-Sort\", \"description\": \"Mithilfe von Parallelisierung l\\\\u00e4sst sich Bubble-Sort auch in linearer Zeit umsetzen. Die Idee daf\\\\u00fcr wird hier einmal erl\\\\u00e4utert.\", \"type\": \"Definition\"}, {\"id\": 102, \"name\": \"Bogo-Sort\", \"description\": \"Bogo-Sort ist ein eher als Scherz gemeinter Sortieralgorithmus. Dabei wird die gegebene Menge solange zuf\\\\u00e4llig durchpermutiert und \\\\u00fcberpr\\\\u00fcft bis die korrekte L\\\\u00f6sung erreicht ist.\", \"type\": \"Algorithmus\"}, {\"id\": 103, \"name\": \"Zusammenfassung\", \"description\": \"Diese Vorlesung markiert das Ende der Vorlesungszeit. Wir gehen deshalb noch einmal R\\\\u00fcckblickend \\\\u00fcber die verschiedenen Themen die in den vergangenen Monaten behandelt wurden und geben die M\\\\u00f6glichkeit Fragen zu stellen.\", \"type\": \"Vorlesung\"}, {\"id\": 104, \"name\": \"Klausurvorbereitung\", \"description\": \"Die letzte gro\\\\u00dfe \\\\u00dcbung von AuD mit Spiel, Spa\\\\u00df, Spannung und vielen Fragen.\", \"type\": \"\\\\u00dcbung\"}, {\"id\": 105, \"name\": \"Einleitung\", \"description\": \"Eine Einleitung in die Welt der Algorithmen und Datenstrukturen. Was ist ein Algorithmus und wozu wird er ben\\\\u00f6tigt? Und was haben Datenstrukturen damit zu tun?\", \"type\": \"Kapitel\"}, {\"id\": 106, \"name\": \"Graphen\", \"description\": \"Graphen sind eine wichtige Darstellungsform von Daten in der Informatik. Wie Graphen aufgebaut sind und was man alles mit ihnen machen kann wird in diesem Kapitel behandelt.\", \"type\": \"Kapitel\"}, {\"id\": 107, \"name\": \"Suche in Graphen\", \"description\": \"Die Suche in Graphen ist ein wichtiges Werkzeug. Allerdings gibt es mehrere Wege, welche zum Ziel f\\\\u00fchren und nicht alle funktionieren gleich gut. Wie man effizient in Graphen sucht wird in diesem Kapitel behandelt.\", \"type\": \"Kapitel\"}, {\"id\": 108, \"name\": \"Dynamische Datenstrukturen\", \"description\": \"Im Laufe der Vorlesung wurden bereits einige Datenstrukturen vorgestellt. In diesem Kapitel besch\\\\u00e4ftigen wir uns mit einer weiteren Klasse der Datenstrukturen, den dynamischen Datenstrukturen. Und damit, welche M\\\\u00f6glichkeiten sie bieten.\", \"type\": \"Kapitel\"}, {\"id\": 109, \"name\": \"Sortieren\", \"description\": \"Neben der Suche von Elementen spielt auch das Sortieren in der Informatik eine gro\\\\u00dfe Rolle. Wie man das macht wird in diesem Kapitel behandelt.\", \"type\": \"Kapitel\"}, {\"id\": 0, \"name\": \"AuD1\", \"description\": \"Algorithmen und Datenstrukturen 1\", \"type\": \"Kapitel\"}], \"links\": [{\"source\": 1, \"target\": 105}, {\"source\": 2, \"target\": 1}, {\"source\": 3, \"target\": 1}, {\"source\": 4, \"target\": 105}, {\"source\": 4, \"target\": 7}, {\"source\": 5, \"target\": 1}, {\"source\": 6, \"target\": 1}, {\"source\": 7, \"target\": 105}, {\"source\": 8, \"target\": 7}, {\"source\": 21, \"target\": 105}, {\"source\": 9, \"target\": 105}, {\"source\": 9, \"target\": 21}, {\"source\": 10, \"target\": 106}, {\"source\": 11, \"target\": 14}, {\"source\": 12, \"target\": 106}, {\"source\": 12, \"target\": 15}, {\"source\": 12, \"target\": 17}, {\"source\": 12, \"target\": 19}, {\"source\": 12, \"target\": 20}, {\"source\": 13, \"target\": 14}, {\"source\": 13, \"target\": 15}, {\"source\": 14, \"target\": 106}, {\"source\": 15, \"target\": 106}, {\"source\": 16, \"target\": 106}, {\"source\": 17, \"target\": 18}, {\"source\": 18, \"target\": 106}, {\"source\": 19, \"target\": 18}, {\"source\": 20, \"target\": 18}, {\"source\": 22, \"target\": 107}, {\"source\": 23, \"target\": 107}, {\"source\": 23, \"target\": 16}, {\"source\": 24, \"target\": 25}, {\"source\": 25, \"target\": 107}, {\"source\": 26, \"target\": 27}, {\"source\": 26, \"target\": 28}, {\"source\": 26, \"target\": 29}, {\"source\": 26, \"target\": 30}, {\"source\": 26, \"target\": 31}, {\"source\": 27, \"target\": 107}, {\"source\": 28, \"target\": 107}, {\"source\": 29, \"target\": 107}, {\"source\": 29, \"target\": 25}, {\"source\": 30, \"target\": 107}, {\"source\": 30, \"target\": 25}, {\"source\": 31, \"target\": 32}, {\"source\": 31, \"target\": 33}, {\"source\": 32, \"target\": 107}, {\"source\": 33, \"target\": 107}, {\"source\": 34, \"target\": 33}, {\"source\": 34, \"target\": 35}, {\"source\": 35, \"target\": 107}, {\"source\": 36, \"target\": 30}, {\"source\": 36, \"target\": 29}, {\"source\": 36, \"target\": 24}, {\"source\": 37, \"target\": 35}, {\"source\": 38, \"target\": 107}, {\"source\": 39, \"target\": 35}, {\"source\": 39, \"target\": 29}, {\"source\": 39, \"target\": 30}, {\"source\": 40, \"target\": 23}, {\"source\": 41, \"target\": 33}, {\"source\": 42, \"target\": 25}, {\"source\": 42, \"target\": 33}, {\"source\": 43, \"target\": 26}, {\"source\": 43, \"target\": 44}, {\"source\": 44, \"target\": 108}, {\"source\": 45, \"target\": 108}, {\"source\": 46, \"target\": 45}, {\"source\": 47, \"target\": 45}, {\"source\": 48, \"target\": 49}, {\"source\": 48, \"target\": 50}, {\"source\": 49, \"target\": 108}, {\"source\": 50, \"target\": 108}, {\"source\": 50, \"target\": 49}, {\"source\": 51, \"target\": 52}, {\"source\": 52, \"target\": 49}, {\"source\": 52, \"target\": 108}, {\"source\": 53, \"target\": 52}, {\"source\": 54, \"target\": 108}, {\"source\": 54, \"target\": 53}, {\"source\": 54, \"target\": 52}, {\"source\": 55, \"target\": 108}, {\"source\": 56, \"target\": 44}, {\"source\": 56, \"target\": 45}, {\"source\": 56, \"target\": 49}, {\"source\": 56, \"target\": 50}, {\"source\": 56, \"target\": 52}, {\"source\": 56, \"target\": 54}, {\"source\": 57, \"target\": 18}, {\"source\": 57, \"target\": 44}, {\"source\": 58, \"target\": 50}, {\"source\": 58, \"target\": 49}, {\"source\": 59, \"target\": 54}, {\"source\": 59, \"target\": 52}, {\"source\": 60, \"target\": 48}, {\"source\": 60, \"target\": 61}, {\"source\": 60, \"target\": 62}, {\"source\": 60, \"target\": 63}, {\"source\": 61, \"target\": 108}, {\"source\": 61, \"target\": 49}, {\"source\": 62, \"target\": 108}, {\"source\": 62, \"target\": 49}, {\"source\": 63, \"target\": 108}, {\"source\": 64, \"target\": 65}, {\"source\": 64, \"target\": 66}, {\"source\": 65, \"target\": 109}, {\"source\": 66, \"target\": 67}, {\"source\": 66, \"target\": 68}, {\"source\": 67, \"target\": 109}, {\"source\": 68, \"target\": 109}, {\"source\": 69, \"target\": 68}, {\"source\": 70, \"target\": 68}, {\"source\": 70, \"target\": 55}, {\"source\": 71, \"target\": 109}, {\"source\": 72, \"target\": 71}, {\"source\": 73, \"target\": 65}, {\"source\": 73, \"target\": 71}, {\"source\": 74, \"target\": 65}, {\"source\": 75, \"target\": 71}, {\"source\": 76, \"target\": 63}, {\"source\": 76, \"target\": 77}, {\"source\": 76, \"target\": 109}, {\"source\": 76, \"target\": 74}, {\"source\": 77, \"target\": 76}, {\"source\": 78, \"target\": 109}, {\"source\": 78, \"target\": 76}, {\"source\": 78, \"target\": 74}, {\"source\": 79, \"target\": 80}, {\"source\": 79, \"target\": 81}, {\"source\": 79, \"target\": 82}, {\"source\": 79, \"target\": 83}, {\"source\": 80, \"target\": 109}, {\"source\": 81, \"target\": 109}, {\"source\": 82, \"target\": 109}, {\"source\": 82, \"target\": 81}, {\"source\": 83, \"target\": 109}, {\"source\": 84, \"target\": 83}, {\"source\": 85, \"target\": 86}, {\"source\": 86, \"target\": 109}, {\"source\": 87, \"target\": 86}, {\"source\": 87, \"target\": 71}, {\"source\": 88, \"target\": 90}, {\"source\": 88, \"target\": 91}, {\"source\": 89, \"target\": 88}, {\"source\": 90, \"target\": 109}, {\"source\": 91, \"target\": 109}, {\"source\": 91, \"target\": 90}, {\"source\": 92, \"target\": 93}, {\"source\": 92, \"target\": 94}, {\"source\": 93, \"target\": 109}, {\"source\": 94, \"target\": 109}, {\"source\": 95, \"target\": 86}, {\"source\": 95, \"target\": 90}, {\"source\": 95, \"target\": 91}, {\"source\": 96, \"target\": 86}, {\"source\": 97, \"target\": 90}, {\"source\": 97, \"target\": 91}, {\"source\": 98, \"target\": 109}, {\"source\": 98, \"target\": 49}, {\"source\": 98, \"target\": 95}, {\"source\": 99, \"target\": 100}, {\"source\": 99, \"target\": 101}, {\"source\": 99, \"target\": 102}, {\"source\": 100, \"target\": 109}, {\"source\": 100, \"target\": 86}, {\"source\": 101, \"target\": 100}, {\"source\": 102, \"target\": 109}, {\"source\": 103, \"target\": 0}, {\"source\": 104, \"target\": 103}, {\"source\": 105, \"target\": 0}, {\"source\": 106, \"target\": 0}, {\"source\": 107, \"target\": 0}, {\"source\": 108, \"target\": 0}, {\"source\": 109, \"target\": 0}]}'" + "'{\"nodes\": [{\"id\": 0, \"name\": \"Begr\\\\u00fc\\\\u00dfung und Organisatorisches\", \"description\": \"Eine Einf\\\\u00fchrung in die Algorithmen und Datenstrukturen\", \"type\": 0, \"video\": \"https://www.ibr.cs.tu-bs.de/courses/ws2122/aud/videos/VL0.mp4\"}, {\"id\": 1, \"name\": \"Rundreise Problem\", \"description\": \"Gegeben: Ein Graph $G = (V, E)$ mit Kantenl\\\\u00e4ngen $w_e$, Gesucht: Eine k\\\\u00fcrzeste Rundreise, welche alle Knoten im Graphen einmal besucht und im Startknoten wieder endet.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/2_Bsp_Rundreise-Problem.mp4\"}, {\"id\": 2, \"name\": \"Puzzle\", \"description\": \"Jeder hat schon einmal ein Puzzle gel\\\\u00f6st, doch wie sieht das aus algorithmischer Sicht aus?\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/3_Bsp_Puzzle.mp4\"}, {\"id\": 3, \"name\": \"Algorithmus-Definition\", \"description\": \"Zitat: \\'Ein Algorithmus ist eine aus endlich vielen Schritten bestehende eindeutige Handlungsvorschrift zur L\\\\u00f6sung eines Problems oder einer Klasse von Problemen.\\'-Wikipedia. Dabei wird als Input eine Problembeschreibung gegeben und durch Anwendung des Algorithmus eine fertige L\\\\u00f6sung des Problems ermittelt. Oft spielt die Laufzeit des Algorithmus eine gro\\\\u00dfe Rolle. Sie beschreibt, wie viele einzelne Schritte n\\\\u00f6tig sind um das Problem zu l\\\\u00f6sen, in Abh\\\\u00e4ngigkeit von der Gr\\\\u00f6\\\\u00dfe des Problems.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/4_Def_Algorithmus.mp4\"}, {\"id\": 4, \"name\": \"P und NP\", \"description\": \"Die Klassen P und NP teilen algorithmische Probleme in zwei Kategorien auf. Die eine, bei der man mithilfe eines Algorithmus eine L\\\\u00f6sung Pfinden kann (P) und eine zweite, bei der bisher nur das NachPr\\\\u00fcfen einer existierenden L\\\\u00f6sung in polynomieller gelingt (NP). Wenn es allerdings keine L\\\\u00f6sung gibt, so l\\\\u00e4sst sich das bei Problemen der Klasse NP nur schlecht beweisen.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/6_Def_P-und-NP.mp4\"}, {\"id\": 5, \"name\": \"Einf\\\\u00fchrung des Algorithmusbegriffs\", \"description\": \"In dieser Vorlesung wird der Begriff \\'Algorithmus\\' definiert und erkl\\\\u00e4rt.\", \"type\": 0, \"video\": \"https://www.ibr.cs.tu-bs.de/courses/ws2122/aud/videos/VL1.mp4\"}, {\"id\": 6, \"name\": \"Datenstrukturen\", \"description\": \"Eine Datenstruktur erlaubt es, die f\\\\u00fcr eine Aufgabe notwendigen Informationen geeignet zu repr\\\\u00e4sentieren und den Zugriff und die Verwaltung w\\\\u00e4hrend der Bearbeitung in effizienter Weise zu erm\\\\u00f6glichen.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/8_Def_Datenstrukturen.mp4\"}, {\"id\": 7, \"name\": \"Organisation und Pseudocode\", \"description\": \"In dieser \\\\u00dcbung haben wir noch einmal organisatorische Dinge besprochen und uns mit dem Thema Pseudocode auseinandergesetzt.\", \"type\": 3, \"video\": \"https://www.ibr.cs.tu-bs.de/courses/ws2122/aud/videos/U0.mp4\"}, {\"id\": 8, \"name\": \"Pseudocode\", \"description\": \"Pseudocode ist eine Art Algorithmen theoretisch zu formulieren, ohne dabei auf die Besonderheiten einer Programmiersprache achten zu m\\\\u00fcssen. Das Ziel ist es Algorithmen klar und eindeutig darzustellen. Da Pseudocode meist \\\\u00e4hnliche Schl\\\\u00fcsselw\\\\u00f6rter wie tats\\\\u00e4chliche Programmiersprachen nutzt, l\\\\u00e4sst sich der entspehende Code oft einfach in eine tats\\\\u00e4chliche Implementierung \\\\u00fcbersetzen.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/9_Def_Pseudocode.mp4\"}, {\"id\": 9, \"name\": \"Einleitung in die Graphen\", \"description\": \"Eine Einleitung in die Welt der Graphen am wohl bekanntesten Beispiel, dem Haus des Nikolaus.\", \"type\": 0}, {\"id\": 10, \"name\": \"Haus des Nikolaus\", \"description\": \"Jeder kennt das Haus vom Nikolaus, doch wie wird es gemalt? Wo setzt man den Stift an und wo wieder ab?\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/11_Bsp_Haus-des-Nikolaus.mp4\"}, {\"id\": 11, \"name\": \"Eulertouren\", \"description\": \"Ein Eulerweg ist ein Weg in einem Graphen, welcher alle Kanten nutzt. Eine Eulertour kehrt dar\\\\u00fcber hinaus auch zum Startknoten zur\\\\u00fcck.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/12_Def_Eulertouren.mp4\"}, {\"id\": 12, \"name\": \"Graphenbegriffe\", \"description\": \"Ein Graph besteht aus Knoten und Kanten, doch was parallele Kanten, Schleifen, (geschlossene) Wege, Pfade, Kreise, Eulerwege/-touren, sowie Hamiltonpfade und -kreise sind wird in dieser Vorlesung noch einmal genau definiert.\", \"type\": 0}, {\"id\": 13, \"name\": \"Graph\", \"description\": \"Um mit Graphen arbeiten zu k\\\\u00f6nnen ist eine formale Definition besonders wichtig. Diese gibt es in diesem Video.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/14_Def_Graph.mp4\"}, {\"id\": 14, \"name\": \"Wege in Graphen\", \"description\": \"Eine Kantenfolge $W$ in einem Graphen $G$ hei\\\\u00dft Weg, wenn sich keine Kante darin wiederholt und geschlossener Weg (Tour), wenn man am Ende wieder am Startknoten ankommt. Wiederholt sich kein Knoten spricht man von einem Pfad. Ein Kreis ist ein geschlossener Pfad. Bei einem Eulerweg/ einer Eulertour werden alle Kanten des Graphen genutzt. Ein Hamiltonpfad/kreis nutzt hingegen alle Knoten.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/15_Def_Wege-in-Graphen.mp4\"}, {\"id\": 15, \"name\": \"Beweistechniken Teil 1\", \"description\": \"In der Mathematik und auch in der Algorithmik spielen Beweise immer wieder eine gro\\\\u00dfe Rolle. Es geht darum Aussagen zu belegen, zu widerlegen oder auf bestimmte Elemente anzuwenden. Dazu gibt es verschiedene Beweistechniken, welche ihr hier finden k\\\\u00f6nnt:\", \"type\": 3}, {\"id\": 16, \"name\": \"Direkter Beweis\", \"description\": \"Aussagen oft in der Form $A \\\\\\\\Rightarrow B$. Unterscheide zwischen Voraussetzung ($A$) und Schlussfolgerung ($B$). Wird die Schlussfolgerung durch eine logische Folgerungskette aus den Voraussetzungen hergeleitet, so spricht man von einem direkten Beweis.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/16a_Bsp_Direkter-Beweis.mp4\"}, {\"id\": 17, \"name\": \"Kontraposition\", \"description\": \"Ein direkter Beweis kann schwierig sein, sodass sich die Kontraposition anbietet. Es gilt $(A \\\\\\\\Righrarrow B) \\\\\\\\Leftrightarrow (-B \\\\\\\\Rightarrow -A)$. Wir k\\\\u00f6nnen also Annehmen, dass $B$ nicht gilt und folgern daraus, dass auch $A$ nicht gelten kann.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/16b_Bsp_Kontraposition.mp4\"}, {\"id\": 18, \"name\": \"Widerspruchsbeweis\", \"description\": \"Mathematische Aussagen sind entweder wahr oder falsch. Um eine wahre Aussage zu beweisen, k\\\\u00f6nnen wir zeigen, dass die Negation nicht gilt. Diese Beweistechnik nennt man Widerspruchsbeweis.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/16c_Bsp_Widerspruchsbeweis.mp4\"}, {\"id\": 19, \"name\": \"\\\\u00c4quivalenzbeweis\", \"description\": \"Aussagen der Form A <=> B k\\\\u00f6nnen bewiesen werden, indem sowohl<br>A => B und B => A gezeigt werden.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/16d_Bsp_\\\\u00c4quivalenzbeweis.mp4\"}, {\"id\": 20, \"name\": \"Bedingungen f\\\\u00fcr Eulertouren\", \"description\": \"In dieser Vorlesung werden notwendige Bedingungen f\\\\u00fcr Eulertouren erleutert. Zus\\\\u00e4tzlich wird das Kapitel 2 noch einmal zusammengefasst und es werden Algorithmen eingef\\\\u00fchrt um die uns bisher bekannten Probleme zu l\\\\u00f6sen.\", \"type\": 0}, {\"id\": 21, \"name\": \"Algorithmus Wegfindung\", \"description\": \"Dieser Algorithmus (2.7) erh\\\\u00e4lt als Input einen Graphen G mit h\\\\u00f6chstens zwei ungeraden Knoten und liefert als Output einen Weg in G\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/18_Alg_Wegfindung.mp4\"}, {\"id\": 22, \"name\": \"Algorithmus von Hierholzer\", \"description\": \"Dieser Algorithmus (2.8) erh\\\\u00e4lt als Input einen zusammenh\\\\u00e4ngenden Graphen G mit h\\\\u00f6chstens zwei ungeraden Knoten und liefert als Output einen Eulerweg, bzw. eine Eulertour in G. Dazu wird auch Algorithmus 2.7 zum Finden von Wegen in G verwendet.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/19_Alg_Hierholzer.mp4\"}, {\"id\": 23, \"name\": \"Algorithmus von Fleury\", \"description\": \"Dieser Algorithmus(2.13) erh\\\\u00e4lt als Input einen Graphen G mit h\\\\u00f6chstens 2 ungeraden Knoten und liefert als Output einen Weg in G. Der Algorithmus hat als Grundlage Algorithmus 2.7 zum Finden von Wegen. Auch l\\\\u00e4sst sich zeigen, dass man mit diesem Algorithmus eine Eulertour/einen Eulerweg finden kann.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/20_Alg_Fleury.mp4\"}, {\"id\": 24, \"name\": \"Anwendung von Graphen\", \"description\": \"In dieser Vorlesung geht es um den Einsatzzweck von Graphen und es wird am Beispiel der Erd\\\\u00f6s- und der Kevin Bacon Zahl gezeigt, welche Zusammenh\\\\u00e4nge dargestellt werden k\\\\u00f6nnen.\", \"type\": 0}, {\"id\": 25, \"name\": \"Beweistechniken Teil 2\", \"description\": \"In dieser \\\\u00dcbung geht es um die Beweistechnik der vollst\\\\u00e4ndigen Induktion. Diese ist die wohl meist benutzte Beweistechnik in der Algorithmik. Auch werden Anwendungsbeispiele wie z.B. die Gau\\\\u00df\\'sche Summenformel oder der Zusammenhang in Graphen erl\\\\u00e4utert.\", \"type\": 3}, {\"id\": 26, \"name\": \"Graphenscan\", \"description\": \"In dieser Vorlesung wird der Graphenscanalgorithmus vorgestellt um Zusammenhangskomponenten in Graphen zu finden.\", \"type\": 0}, {\"id\": 27, \"name\": \"Algorithmus Graphenscan\", \"description\": \"Dieser Algorithmus (3.7) erh\\\\u00e4hlt als Input einen Graphen G = (V,E) und einen Knoten s darin und liefert als Output eine Knotenmenge Y aus V, die von s aus erreichbar ist, sowie eine Kantenmenge T aus E, welche die Erreichbarkeit sicherstellt\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/25_Alg_Graphenscan.mp4\"}, {\"id\": 28, \"name\": \"Datenstrukturen Teil 1\", \"description\": \"In dieser Vorlesung werden die Datenstrukturen Warteschlange (First In - First Out) und Stapel (Last In - First Out) vorgestellt. Au\\\\u00dferdem geht es um ihre Rolle f\\\\u00fcr Algorithmen und wie man sie implementieren kann. Das ganze wird am Beispiel des Graphscan Algorithmus gezeigt und somit werden auch Breiten- und Tiefensuche eingef\\\\u00fchrt.\", \"type\": 0}, {\"id\": 29, \"name\": \"Warteschlange\", \"description\": \"Eine Warteschlange ist eine Datenstruktur, welche nach dem Prinzip \\'First In - First Out\\' arbeitet. Man findet sie auch im allt\\\\u00e4glichen Leben oft wieder, wenn man sich beispielsweise an der Kasse anstellen muss. Der Kunde der zuerst da war, wir auch zuerst bedient.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/27_Def_Warteschlange.mp4\"}, {\"id\": 30, \"name\": \"Stapel\", \"description\": \"Ein Stapel ist eine Datenstruktur, welche nach dem Prinzip \\'Last In - First Out\\' arbeitet. Im allt\\\\u00e4glichen Leben findet man diese Form der Datenstruktur beim Geschirr abwaschen, man stapelt die Teller und der Teller der zuletzt dreckig wurde wird als erstes gereinigt, da man die Teller von oben herunter nimmt.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/28_Def_Stapel.mp4\"}, {\"id\": 31, \"name\": \"Breitensuche\", \"description\": \"Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgef\\\\u00fchrt mithilfe einer Warteschlange als Datenstruktur. Sie breitet sich aus wie eine Welle.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/29_Alg_Breitensuche.mp4\"}, {\"id\": 32, \"name\": \"Tiefensuche\", \"description\": \"Die Breitensuche ist im Prinzip der Graphscan Algorithmus, ausgef\\\\u00fchrt mithilfe eines Stapels als Datenstruktur. Dabei werden eher einzelne Pfade gelaufen.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/30_Alg_Tiefensuche.mp4\"}, {\"id\": 33, \"name\": \"Datenstrukturen Teil 2\", \"description\": \"In dieser Vorlesung geht es einerseits um die Anwendung der Breitensuche, andererseits werden noch 2 weitere Datenstrukturen eingef\\\\u00fchrt: Die Inzidenz/-Adjazenzmatrix, sowie die Kantenliste.\", \"type\": 0}, {\"id\": 34, \"name\": \"Inzidenz/-Adjazenzmatrix\", \"description\": \"In einer Inzidenzmatrix wird mithilfe von 1en und 0en dargestellt, welche Knoten mit welchen Kanten inzident (zusammentreffend) sind. Bei einer Adjazenzmatrix wird dargestellt, welche Knoten adjazent (durch eine Kante verbunden) sind.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/32_Def_Inzidenz-Adjazenzmatrix.mp4\"}, {\"id\": 35, \"name\": \"Kanten-/Adjazenzliste\", \"description\": \"Eine Kantenliste ist eine Liste bestehend aus eintr\\\\u00e4gen der Form {vx, vy}, welche bedeuten, dass eine Kante zwischen vx und vy im Graphen existiert.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/33_Def_Kantenliste.mp4\"}, {\"id\": 36, \"name\": \"Wachstum/O-Notation\", \"description\": \"In dieser Vorlesung wird noch einmal mit den Adjazenz- und Kantenlisten abgeschlossen. Au\\\\u00dferdem schauen wir uns einmal das Wachstum von Funktionen an und definieren und die O-Notation um damit zu arbeiten.\", \"type\": 0}, {\"id\": 37, \"name\": \"O-Notation\", \"description\": \"Die O-Notation wird genutzt um das Wachstum von Funktionen abzusch\\\\u00e4tzen. Damit k\\\\u00f6nnen Gr\\\\u00f6\\\\u00dfenordnungen und Wachstumsverhalten beschrieben werden.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/35_Def_O-Notation.mp4\"}, {\"id\": 38, \"name\": \"Graphscan \\\\u00dcbung\", \"description\": \"Simple Anwengung des Graphscan Algorithmus, einmal als Breiten- und als Tiefensuche. Wann welcher Algorithmus besser geeignet ist wird in dieser \\\\u00dcbung erkl\\\\u00e4rt.\", \"type\": 3}, {\"id\": 39, \"name\": \"Breitensuche Beispiel\", \"description\": \"Ein Beispiel f\\\\u00fcr die Anwendung des Graphenscan Algorithmus in Form der Breitensuche mithilfe einer Warteschlange als Datenstruktur.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/36a_Bsp_Breitensuche.mp4\"}, {\"id\": 40, \"name\": \"Tiefensuche Beispiel\", \"description\": \"Ein Beispiel f\\\\u00fcr die Anwendung des Graphenscan Algorithmus in Form der Tiefensuche mithilfe eines Stapels als Datenstruktur.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/36b_Bsp_Tiefensuche.mp4\"}, {\"id\": 41, \"name\": \"Wachstum\", \"description\": \"Die O-Notation wird genutzt um das Wachstum von Funktionen abzusch\\\\u00e4tzen. In dieser \\\\u00dcbung werden Zusammenh\\\\u00e4nge zwischen der Gr\\\\u00f6\\\\u00dfe des Inputs und dem Wachstum, sowie Relationen zwischen Laufzeitklassen n\\\\u00e4her beleuchtet. Auch wird die O-Notation an verschiedenen Beispielen erkl\\\\u00e4rt.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/36c_Bsp_O-Notation.mp4\"}, {\"id\": 42, \"name\": \"Wiederholung: Suche in Graphen\", \"description\": \"Noch einmal ein R\\\\u00fcckblick auf alles, was bisher in \\'Kapitel 3: Suche in Graphen\\' passiert ist. \", \"type\": 0}, {\"id\": 43, \"name\": \"Eigenschaften von DFS und BFS\", \"description\": \"In dieser Vorlesung betrachten wir die Breiten- und Tiefensuche im Hinblick auf ihre Laufzeit. Dabei wird anschaulich, wie die Algorithmen arbeiten, wann man sie am besten nutzen sollte und wie man Laufzeiten beweisen kann.\", \"type\": 0}, {\"id\": 44, \"name\": \"Induktionsbeweis Beispiel\", \"description\": \"Ein Beispiel, bei dem der Induktionsbeweis auch in der Graphentheorie zum Einsatz kommt. Weitere Beispiele dieser Art finden sich in Vorlesung 12.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/40_Bsp_Induktionsbeweis.mp4\"}, {\"id\": 45, \"name\": \"Graphscan Adjazenzliste\", \"description\": \"Hier wird zuerst ein Graph in der Form einer Adjazenzliste dargestellt und dann mithilfe dieser als Datenstruktur der Graphscan Algorithmus durchgef\\\\u00fchrt.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/42_Bsp_Graphenscan-Adjazenzliste.mp4\"}, {\"id\": 46, \"name\": \"Verschiedene dynamische Datenstrukturen\", \"description\": \"In dieser Vorlesung beginnen wir dynamische Datenstrukturen einzuf\\\\u00fchren. Es werden Stapel, Warteschlangen und verkettete Listen vorgestellt. Au\\\\u00dferdem besch\\\\u00e4ftigen wir uns mit bin\\\\u00e4rer Suche.\", \"type\": 0}, {\"id\": 47, \"name\": \"Verkettete Liste\", \"description\": \"Eine verkettete Liste ist eine dynamische Datenstruktur. Dabei werden f\\\\u00fcr die einzelnen Elemente jeweils Vorg\\\\u00e4nger und Nachfolger mit gespeichert. Der Vorteil hierbei ist, dass neue Eintr\\\\u00e4ge \\\\u00fcberall eingef\\\\u00fcgt werden k\\\\u00f6nnen.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/44_Def_Verkettete-Listen.mp4\"}, {\"id\": 48, \"name\": \"Bin\\\\u00e4re Suche\", \"description\": \"Dieser Algorithmus (4.1) erh\\\\u00e4lt als Input einen sortierten Array mit Eintr\\\\u00e4gen S[I], Suchwert WERT, linke Randposition LINKS, rechte Randposition RECHTS und liefert als Output die Position von WERT zwischen Arraypositionen LINKS und RECHTS, falls existent.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/45_Alg_Bin\\\\u00e4re-Suche.mp4\"}, {\"id\": 49, \"name\": \"Bin\\\\u00e4re Suche Beispiel\", \"description\": \"Der Algorithmus f\\\\u00fcr die bin\\\\u00e4re Suche einmal an zwei Beispielen angewandt.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/46_Bsp_Bin\\\\u00e4re_Suche.mp4\"}, {\"id\": 50, \"name\": \"Bin\\\\u00e4re Suchb\\\\u00e4ume\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns genauer mit bin\\\\u00e4ren Suchb\\\\u00e4umen und den darauf anwendbaren Operationen, wie Maximum, Minimum, einf\\\\u00fcgen und l\\\\u00f6schen von Knoten, sowie mit der bin\\\\u00e4ren Suche.\", \"type\": 0}, {\"id\": 51, \"name\": \"Bin\\\\u00e4rer Suchbaum\", \"description\": \"In dieser Definition werden die Begriffe \\'gerichteter Graph/Baum\\', \\'H\\\\u00f6he eines Baumes\\', \\'(voller/vollst\\\\u00e4ndiger) bin\\\\u00e4rer Baum\\', \\'Blatt eines Baumes\\', \\'Teilbaum eines Knotens\\' und \\'bin\\\\u00e4rer Suchbaum\\' definiert und erkl\\\\u00e4rt.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/49_Def_Bin\\\\u00e4rer-Suchbaum.mp4\"}, {\"id\": 52, \"name\": \"Grundoperationen Suchbaum\", \"description\": \"Minimum/Maximum finden, Suche im Baum, Nachfolger finden, Einf\\\\u00fcgen und L\\\\u00f6schen sind die Grundoperationen, welche auf bin\\\\u00e4re Suchb\\\\u00e4ume angewendet werden k\\\\u00f6nnen. Und hier findet ihr die Algorithmen dazu.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/50_Alg_Bin\\\\u00e4rer-Suchbaum-Grundoperationen.mp4\"}, {\"id\": 53, \"name\": \"Bin\\\\u00e4rer Suchbaum Min/Max\", \"description\": \"In einem bin\\\\u00e4ren Suchbaum lassen sich leicht das Minimum, sowie das Maximum finden. Wie das funktioniert, kannst du dir hier noch einmal anschauen.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/50a_Bsp_Bin\\\\u00e4rer-Suchbaum-Min-Max.mp4\"}, {\"id\": 54, \"name\": \"Bin\\\\u00e4rer Suchbaum Suche\", \"description\": \"Auch die Suche in einem bin\\\\u00e4ren Suchbaum ist recht simpel, wie der Name schon verr\\\\u00e4t. Wie das genau funktioniert siehst du hier.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/50b_Bsp_Bin\\\\u00e4rer-Suchbaum-Suche.mp4\"}, {\"id\": 55, \"name\": \"Bin\\\\u00e4rer Suchbaum Nachfolger\", \"description\": \"Oft kann es helfen den Nachfolger eines Schl\\\\u00fcsselwertes in einem bin\\\\u00e4ren Suchbaum zu finden (Zum Beispiel beim L\\\\u00f6schen von Elementen). Wie das geht kannst du hier nachschauen.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/50c_Bsp_Bin\\\\u00e4rer-Suchbaum-Nachfolger.mp4\"}, {\"id\": 56, \"name\": \"Bin\\\\u00e4rer Suchbaum Einf\\\\u00fcgen\", \"description\": \"Das Einf\\\\u00fcgen in einen bin\\\\u00e4ren Suchbaum ist recht simpel, man muss allerdings darauf achten, dass die Struktur erhalten bleibt. Wie das geht siehst du hier.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/50d_Bsp_Bin\\\\u00e4rer-Suchbaum-Einf\\\\u00fcgen.mp4\"}, {\"id\": 57, \"name\": \"Bin\\\\u00e4rer Suchbaum L\\\\u00f6schen\", \"description\": \"Das L\\\\u00f6schen von Elementen kann sehr einfach sein, es kann sich jedoch auch als sehr komplex entpuppen, je nachdem wie viele Kinder der zu l\\\\u00f6schende Knoten hat. Solltest du dir hier noch unsicher sein schau dir das Video dazu an.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/50e_Bsp_Bin\\\\u00e4rer-Suchbaum-L\\\\u00f6schen.mp4\"}, {\"id\": 58, \"name\": \"AVL-B\\\\u00e4ume\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit speziellen bin\\\\u00e4ren Suchb\\\\u00e4umen, den AVL-B\\\\u00e4umen und ihren Eigenschaften.\", \"type\": 0}, {\"id\": 59, \"name\": \"AVL-Baum\", \"description\": \"Ein bin\\\\u00e4rer Suchbaum ist h\\\\u00f6henbalanciert, wenn sich f\\\\u00fcr jeden Knoten v die H\\\\u00f6he der beiden Kinder von v um h\\\\u00f6chstens 1 unterscheidet. Ein h\\\\u00f6henbalancierter Suchbaum hei\\\\u00dft auch AVL-Baum.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/52_Def_AVL-Baum.mp4\"}, {\"id\": 60, \"name\": \"dyn. Operationen auf AVL-B\\\\u00e4umen\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit dem Erhalt der AVL-Eigenschaft eines bin\\\\u00e4ren Suchbaumes bei Einf\\\\u00fcge- und L\\\\u00f6schoperationen. Au\\\\u00dferdem werfen wir einen Blick auf die Fibonacci-Zahlen.\", \"type\": 0}, {\"id\": 61, \"name\": \"AVL-Rotation\", \"description\": \"Dieser Algorithmus (4.9) erh\\\\u00e4lt als Input einen Knoten x eines bin\\\\u00e4ren Suchbaumes T, Vaterknoten y, Gro\\\\u00dfvaterknoten z und liefert als Output den bin\\\\u00e4ren Suchbaum T nach Umstrukturierung mit x, y, z.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/54_Alg_AVL-Restructure.mp4\"}, {\"id\": 62, \"name\": \"Fibonacci-Zahlen\", \"description\": \"Die Fibonacci-Zahlen sind eine rekursiv definierte Zahlenfolge, bei der sich eine Zahl aus der Summe ihrer zwei Vorg\\\\u00e4nger ergibt. Dabei sind die ersten beiden Elemente gegeben als 1. Die Fibonacci-Zahlen finden sich \\\\u00fcberall in der Natur wieder und haben nicht wenig mit unserer Auffassung von Sch\\\\u00f6nheit zu tun.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/55_Def_Fibonacci-Zahlen.mp4\"}, {\"id\": 63, \"name\": \"Induktionsbeweis-\\\\u00dcbung\", \"description\": \"In dieser \\\\u00dcbung schauen wir uns eine Beweistechnik an: die vollst\\\\u00e4ndige Induktion.\", \"type\": 3}, {\"id\": 64, \"name\": \"Induktionsbeweise\", \"description\": \"Eine Reihe von Beispielen zum Thema Induktionsbeweis. Es wird in verschiedenen Szenarien gezeigt, wie man Den Induktionsanfang erh\\\\u00e4lt, damit die Induktionsbehauptung aufstellt und diese dann nutzt um den Induktionsschritt durchzuf\\\\u00fchren.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/57_Bsp_Induktionsbeweise.mp4\"}, {\"id\": 65, \"name\": \"Fehler bei Induktionsbeweisen\", \"description\": \"In diesem Video wird einmal auf beliebte Fehler bei Induktionsbeweisen eingegangen, welche man unbedingt vermeiden sollte.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/58_Bsp_Fehler-bei-Induktionsbeweisen.mp4\"}, {\"id\": 66, \"name\": \"\\\\u00dcbung dynamische Datenstrukturen\", \"description\": \"In dieser \\\\u00dcbung betrachten wir noch einmal verschiedene Aspekte von Datenstrukturen und stellen \\\\u00dcberlegungen an, wie die Auswahl von Datenstrukturen die Laufzeit von Algorithmen beeinflussen kann.\", \"type\": 3}, {\"id\": 67, \"name\": \"Laufzeit Hierholzer Algorithmus\", \"description\": \"Wir betrachten einmal die Laufzeit des Hierholzer-Algorithmus (2.8) und im Zusammenhang damit auch verkettete Listen.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/59a_Bsp_Laufzeit-Hierholzer.mp4\"}, {\"id\": 68, \"name\": \"Suchbaummerge\", \"description\": \"In diesem Teil der \\\\u00dcbung betrachten wir einmal das Verschmelzen von bin\\\\u00e4ren Suchb\\\\u00e4umen und dessen Laufzeit.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/59b_Bsp_Suchbaummerge.mp4\"}, {\"id\": 69, \"name\": \"Beispiel AVL-Baum-Operationen\", \"description\": \"Wir schauen uns noch einmal genauer die AVL-B\\\\u00e4ume an und was man damit machen kann. Insbesondere auch die Operationen L\\\\u00f6schen und Einf\\\\u00fcgen.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/59c_Bsp_AVL-Baum-Operationen.mp4\"}, {\"id\": 70, \"name\": \"Dynamische Datenstrukturen 2\", \"description\": \"In dieser Vorlesung schauen wir noch einmal auf das bisher in Kapitel 4 gelernte zur\\\\u00fcck. Au\\\\u00dferdem geben wir einen \\\\u00dcberblick \\\\u00fcber einige weitere dynamische Datenstrukturen wie Rot-Scharz-B\\\\u00e4umme, B-B\\\\u00e4ume und Heaps.\", \"type\": 0}, {\"id\": 71, \"name\": \"Rot-Schwarz-B\\\\u00e4ume\", \"description\": \"Ein bin\\\\u00e4rer Suchbaum hei\\\\u00dft Rot-Schwarz-Baum, wenn er die folgenden Eigenschaften erf\\\\u00fcllt:<br>1. Jeder Knoten ist entweder rot oder schwarz.<br>2. Die Wurzel ist schwarz.<br>3. Jedes Blatt (NIL) ist schwarz.<br>4. Wenn ein Knoten rot ist, sind seine beiden Kinder schwarz.<br>5. F\\\\u00fcr jeden Knoten enthalten alle Pfade nach unten zu einem Blatt des Teilbaumes die gleiche Anzahl schwarzer Knoten.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/61_Def_Rot-Schwarz-B\\\\u00e4ume.mp4\"}, {\"id\": 72, \"name\": \"B-B\\\\u00e4ume\", \"description\": \"B-B\\\\u00e4ume sind bin\\\\u00e4re Suchb\\\\u00e4ume, welche f\\\\u00fcr externen Speicher (HDDs) optimiert sind. Dabei wird die H\\\\u00f6he des Baumes minimiert und es werden den Knoten mehr Schl\\\\u00fcssel zugewiesen.<br>Mehr dazu in Cormen, Kapitel 18 oder der Vorlesung RDB 2.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/62_Def_B-B\\\\u00e4ume.mp4\"}, {\"id\": 73, \"name\": \"Heaps\", \"description\": \"Ein gerichteter bin\\\\u00e4rer Baum hei\\\\u00dft bin\\\\u00e4rer Min/Max-Heap, wenn jeder Knoten einen Schl\\\\u00fcssel hat, alle Ebenen au\\\\u00dfer der \\'letzten\\' genau 2 Knoten haben, auf der \\'letzten\\' Ebene die linken n-(2^h)+1 Positionen besetzt sind und jeder Schl\\\\u00fcssel eines Knotens h\\\\u00f6chstens/mindestens so gro\\\\u00df ist wie die seiner Kinder.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/63_Def_Heaps.mp4\"}, {\"id\": 74, \"name\": \"Einf\\\\u00fchrung in das Sortieren\", \"description\": \"In dieser Vorlesung geben wir eine Einf\\\\u00fchrung in das Oberthema Sortieren. Wir stellen au\\\\u00dferdem einen Sortieralgorithmus mit dem Namen Mergesort vor und stellen grundlegende \\\\u00dcberlegungen zur Laufzeit von Sortieralgorithmen an.\", \"type\": 0}, {\"id\": 75, \"name\": \"Merge-Sort\", \"description\": \"Dieser Algorithmus (5.1) erh\\\\u00e4lt als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output ein sortiertes Subarray. Wichtig ist daf\\\\u00fcr auch die Subroutine (5.2), welche als Input zwei sortierte Subarrays von A=[1,...,n], d.h. A[p,...,q] und A[q+1,...,r] erh\\\\u00e4lt und als Output das sortierte Subarray A[p,...,r] liefert.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/65_Alg_Merge-Sort.mp4\"}, {\"id\": 76, \"name\": \"Sortier-Laufzeitschranken\", \"description\": \"In dieser Vorlesung leiten wir konkrete Laufzeitschranken f\\\\u00fcr das Problem des Sortierens einer Liste von Zahlen her. Zudem machen wir uns Gedanken \\\\u00fcber das L\\\\u00f6sen von Rekursionsgleichungen.\", \"type\": 0}, {\"id\": 77, \"name\": \"Permutation\", \"description\": \"Eine Permutation P ist eine Umsortierung von n Objekten.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/67_Def_Permutation.mp4\"}, {\"id\": 78, \"name\": \"Erzeugende Funktionen\", \"description\": \"Erzeugende Funktionen k\\\\u00f6nnen genutzt werden um Rekursionen zu l\\\\u00f6sen. Wie das genau aussieht wird an einem simplen Beispiel hier einmal angef\\\\u00fchrt.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/68_Def_erzeugende-Funktionen.mp4\"}, {\"id\": 79, \"name\": \"Erzeugende Funktionen/Mastertheorem\", \"description\": \"In dieser Vorlesung besprechen wir weitere Details zu erzeugenden Funktionen und f\\\\u00fchren das Master-Theorem ein.\", \"type\": 0}, {\"id\": 80, \"name\": \"erzeugende Funktionen Fibonacci-Zahlen\", \"description\": \"In diesem Beispiel wird einmal die erzeugende Funktion der Fibonacci-Zahlen hergeleitet.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/70_Bsp_Erzeugende-Funktionen-Fibonacci.mp4\"}, {\"id\": 81, \"name\": \"Master-Theorem\", \"description\": \"Das Master-Theorem bietet eine schnelle L\\\\u00f6sung f\\\\u00fcr die Frage, in welcher Laufzeitklasse eine gegebene rekursiv definierte Funktion liegt. Dies funktioniert leider nur, solange einer der drei F\\\\u00e4lle des Theorems auf die Funktion angewandt werden kann, ansonsten liefert das Theorem keine Aussage.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/71_Def_Master-Theorem.mp4\"}, {\"id\": 82, \"name\": \"Master-Theorem Beispiele\", \"description\": \"Einige Beispiele, an denen das Master-Theorem und seine Funktion noch einmal verdeutlicht wird.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/72_Bsp_Master-Theorem-Beispiele.mp4\"}, {\"id\": 83, \"name\": \"Sortieralgorithmen und Master-Theorem\", \"description\": \"Wir betrachten ein weiteres Beispiel f\\\\u00fcr Mergesort und leiten erneut die Laufzeit des Sortieralgorithmus her, indem das Master-Theorem benutzt wird. Au\\\\u00dferdem betrachten wir einen weiteren Sortieralgorithmus: Heapsort.\", \"type\": 3}, {\"id\": 84, \"name\": \"Merge-Sort Beispiel\", \"description\": \"Hier wird der Merge-Sort Algorithmus einmal mit einem Beispiel komplett durchgef\\\\u00fchrt und die Laufzeit des Algorithmus betrachtet.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/74_Bsp_Merge-Sort-Beispiel.mp4\"}, {\"id\": 85, \"name\": \"Master-Theorem Beispiel\", \"description\": \"3 weitere Beispiele, welche dabei helfen das Master-Theorem zu verstehen und anzuwenden.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/75_Bsp_Master-Theorem-Beispiel.mp4\"}, {\"id\": 86, \"name\": \"Max-Heaps\", \"description\": \"Hier wir aufgezeigt, wie man mithilfe eines Algorithmus Max-Heaps bildet. \", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/76_Alg_Max-Heaps.mp4\"}, {\"id\": 87, \"name\": \"Max-Heaps Anwendung\", \"description\": \"Hier wird der Algorithmus aus der \\\\u00dcbung 6 zum Erstellen eines Max-Heaps einmal an einem Beispiel angewandt.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/77_Bsp_Max-Heaps-Anwendung.mp4\"}, {\"id\": 88, \"name\": \"Heapsort\", \"description\": \"Heapsort ist ein Algorithmus bei dem mithilfe von Max-Heaps eine Reihe von Elementen sortiert werden kann. Der Algorithmus hat dabei eine Laufzeit von O(n log n), wie auch in \\\\u00dcbung 6 bewiesen wird.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/78_Alg_Heapsort.mp4\"}, {\"id\": 89, \"name\": \"nichtlineare Rekursionen (Exkurs)\", \"description\": \"In dieser Vorlesung haben wir einen Exkurs in die nichtlineare Rekursion gemacht.\", \"type\": 0}, {\"id\": 90, \"name\": \"logistische Rekursion\", \"description\": \"Logistische Rekursion bezeichnet ein Wachstum proportional zu einer Gr\\\\u00f6\\\\u00dfe. Dabei betrachtet man beispielsweise eine Bev\\\\u00f6lkerung, welche zwar durch Fruchtbarkeit immer weiter w\\\\u00e4chst, aber beispielsweise durch Tod auch wieder im Wachstum beschr\\\\u00e4nkt wird.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/80_Def_Logistische-Rekursion.mp4\"}, {\"id\": 91, \"name\": \"Mandelbrot-Menge\", \"description\": \"Die Mandelbrot-Menge, benannt nach Beno\\\\u00eet Mandelbrot, ist eine Menge in den komplexen Zahlen. Interpretiert man sie als geometrische Figur, so ergibt sich ein Fraktal, welches im allgemeinen Sprachgebrauch auch als Apfelm\\\\u00e4nnchen bekannt ist.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/81_Def_Mandelbrot-Menge.mp4\"}, {\"id\": 92, \"name\": \"Fraktale\", \"description\": \"Ein Fraktal beschreibt nat\\\\u00fcrliche oder k\\\\u00fcnstliche Gebilde oder geometrische Muster und ist ein von Beno\\\\u00eet Mandelbrot gepr\\\\u00e4gter Begriff. - Wikipedia\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/82_Def_Fraktale.mp4\"}, {\"id\": 93, \"name\": \"Zellul\\\\u00e4re Automaten\", \"description\": \"Zellul\\\\u00e4re oder auch zellulare Automaten dienen der Modellierung r\\\\u00e4umlich diskreter dynamischer Systeme, wobei die Entwicklung einzelner Zellen zum Zeitpunkt t+1 prim\\\\u00e4r von den Zellzust\\\\u00e4nden in einer vorgegebenen Nachbarschaft und vom eigenen Zustand zum Zeitpunkt t abh\\\\u00e4ngt. - Wikipedia\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/83_Def_Zellul\\\\u00e4re-Automaten.mp4\"}, {\"id\": 94, \"name\": \"Game of Life\", \"description\": \"Das \\'Game of Life\\' ist das wohl bekannteste Beispiel eines zellul\\\\u00e4ren Automaten. \", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/84_Bsp_Game-of-Life.mp4\"}, {\"id\": 95, \"name\": \"Einf\\\\u00fchrung von Quick-Sort\", \"description\": \"In dieser Vorlesung kehren wir zur\\\\u00fcck zu Sortieralgorithmen und stellen den Quicksort-Algorithmus vor.\", \"type\": 0}, {\"id\": 96, \"name\": \"Quick-Sort\", \"description\": \"Dieser Algorithmus (5.14) erh\\\\u00e4lt als Input ein Subarray von A=[1,...,n], der bei Index p beginnt und bei Index r endet, d.h. A[p,...,r] und liefert als Output einen sortierten Subarray. Dabei ist auch Subroutine 5.15 wichtig, welche als Input ein Subarray von A=[1,...,n], d.h. A[p,...,r] erh\\\\u00e4lt und als Output zwei Subarrays A[p,...,q-1] und A[q+1,...,r] mit A[i]\\\\u2264A[q] und A[q]<A[j] f\\\\u00fcr i=p,...,q-1 und j=q+1,...,r liefert.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/86_Alg_Quick-Sort.mp4\"}, {\"id\": 97, \"name\": \"Laufzeit von Quick-Sort\", \"description\": \"Die Laufzeit des Quick-Sort Algorithmus l\\\\u00e4sst sich mithilfe vom Master-Theorem ermitteln. Dazu betrachten wir die 3 F\\\\u00e4lle best-case, average-case und worst-case f\\\\u00fcr den Algorithmus.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/87_Bsp_Quick-Sort-Laufzeit.mp4\"}, {\"id\": 98, \"name\": \"Mediane\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit Medianen.\", \"type\": 0}, {\"id\": 99, \"name\": \"Standortprobleme\", \"description\": \"Was ist der optimale Standort f\\\\u00fcr beispielsweise ein Amazon-Lagerhaus? Idee: Die durchschnittliche Distanz zu den zu beliefernden Geb\\\\u00e4uden minimieren. In Amerika ist dies leicht umgesetzt mit der sogenannten Manhatten-Distanz. Dieses Problem ist die Einf\\\\u00fchrung in das Thema der Mediane.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/89_Def_Standortprobleme.mp4\"}, {\"id\": 100, \"name\": \"Median (diskret)\", \"description\": \"Der Rank k eines Elements x (auch \\'k-tes Element\\') ist definiert durch |{y \\\\u2208 X |y<=x}| = k. Also die Anzahl der Elemente, welche kleiner oder gleich x sind. Speziell hei\\\\u00dft x Median, wenn er das [n/2]-te Element ist. [n/2] wird dabei abgerundet.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/90_Def_Median-diskret.mp4\"}, {\"id\": 101, \"name\": \"Median (kontinuierlich)\", \"description\": \"Der kontinuierliche Median hat als Eigenschaft, dass das sowohl Integral bis zum Median, als auch ab dem Median gr\\\\u00f6\\\\u00dfer-gleich 1/2 ist.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/91_Def_Median-kontinuierlich.mp4\"}, {\"id\": 102, \"name\": \"Sortieralgorithmen Sonderf\\\\u00e4lle\", \"description\": \"In dieser Vorlesung besch\\\\u00e4ftigen wir uns mit Sonderf\\\\u00e4llen f\\\\u00fcr Sortieralgorithmen, durch die Sortieren in linearer Zeit erm\\\\u00f6glicht wird. Dabei werfen wir einen n\\\\u00e4heren Blick auf die Sortierverfahren Countingsort und Radixsort.\", \"type\": 0}, {\"id\": 103, \"name\": \"Counting-Sort\", \"description\": \"Dieser Algorithmus (5.14) erh\\\\u00e4lt als Input ein Array von A=[1],...,A[n] mit Schl\\\\u00fcsselwerten aus {1,\\\\u2026, k} und liefert als Output eine sortierte Kopie B[1],\\\\u2026,B[n] von [1],...,A[n].\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/93_Alg_Counting-Sort.mp4\"}, {\"id\": 104, \"name\": \"Radix-Sort\", \"description\": \"Dieser Algorithmus (5.18) erh\\\\u00e4lt als Input n Zahlen mit je d Ziffern, die k verschiedene Werte annehmen k\\\\u00f6nnen, [1],...,A[n] und liefert als Output einen sortierten Array. Dabei geht Radix-Sort im Gegensatz zu anderen Sortieralgorithmen ziffernweise vor.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/94_Alg_Radix-Sort.mp4\"}, {\"id\": 105, \"name\": \"Quick-Sort, Mediane, kd-B\\\\u00e4ume\", \"description\": \"In dieser \\\\u00dcbung schauen wir uns noch einmal das Sortierverfahren Quicksort an und sprechen \\\\u00fcber die Berechnung von Medianen. Au\\\\u00dferdem schauen wir uns mit den kd-B\\\\u00e4umen eine spezielle Datenstruktur f\\\\u00fcr mehrdimensionale Daten an.\", \"type\": 3}, {\"id\": 106, \"name\": \"Quick-Sort Beispiel\", \"description\": \"In diesem Beispiel wird die Funktionsweise von Quick-Sort, sowie die Laufzeit betrachtet.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/96_Bsp_Quick-Sort-Beispiel.mp4\"}, {\"id\": 107, \"name\": \"Mediane Beispiel\", \"description\": \"In diesem Teil der \\\\u00dcbung schauen wir uns noch einmal genauer an, was Mediane sind, wie man sie algorithmisch bestimmen kann und in welcher Laufzeit das m\\\\u00f6glich ist.\", \"type\": 1, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/97_Bsp_Mediane-Beispiel.mp4\"}, {\"id\": 108, \"name\": \"kd-B\\\\u00e4ume (Exkurs)\", \"description\": \"kd-B\\\\u00e4ume sind B\\\\u00e4ume mit einer h\\\\u00f6heren Dimension. Mithilfe der Idee den Baum abwechselnd nach x- und y-Koordinate zu durchsuchen und so zu konstruieren entsteht ein Algorithmus mit dem man mehrdimensionale Suchb\\\\u00e4ume erstellen kann. Auch schauen wir uns an, wie man in einem solchen Baum sucht.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/98_Def_kd-B\\\\u00e4ume-Exkurs.mp4\"}, {\"id\": 109, \"name\": \"(parallelisierte) Sortierverfahren\", \"description\": \"In dieser Vorlesung beenden wir das Kapitel zum Thema Sortieralgorithmen und werfen abschlie\\\\u00dfend einen Blick auf parallelisierte Sortierverfahren.\", \"type\": 0}, {\"id\": 110, \"name\": \"Bubble-Sort Beispiel\", \"description\": \"Einige Beispiele, wie Bubble-Sort funktioniert, inklusive einiger verschiedener Darstellungen/Animationen und dem Vergleich mit Quick-Sort.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/100_Alg_Bubble-Sort-Beispiel.mp4\"}, {\"id\": 111, \"name\": \"paralleles Bubble-Sort\", \"description\": \"Mithilfe von Parallelisierung l\\\\u00e4sst sich Bubble-Sort auch in linearer Zeit umsetzen. Die Idee daf\\\\u00fcr wird hier einmal erl\\\\u00e4utert.\", \"type\": 2, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/101_Def_Paralleles-Bubble-Sort.mp4\"}, {\"id\": 112, \"name\": \"Bogo-Sort\", \"description\": \"Bogo-Sort ist ein eher als Scherz gemeinter Sortieralgorithmus. Dabei wird die gegebene Menge solange zuf\\\\u00e4llig durchpermutiert und \\\\u00fcberpr\\\\u00fcft bis die korrekte L\\\\u00f6sung erreicht ist.\", \"type\": 4, \"video\": \"https://www.ibr.cs.tu-bs.de/alg/videos/aud/ws2122/102_Alg_Bogo-Sort.mp4\"}, {\"id\": 113, \"name\": \"Zusammenfassung\", \"description\": \"Diese Vorlesung markiert das Ende der Vorlesungszeit. Wir gehen deshalb noch einmal R\\\\u00fcckblickend \\\\u00fcber die verschiedenen Themen die in den vergangenen Monaten behandelt wurden und geben die M\\\\u00f6glichkeit Fragen zu stellen.\", \"type\": 0}, {\"id\": 114, \"name\": \"Klausurvorbereitung\", \"description\": \"Die letzte gro\\\\u00dfe \\\\u00dcbung von AuD mit Spiel, Spa\\\\u00df, Spannung und vielen Fragen.\", \"type\": 3}, {\"id\": 115, \"name\": \"Einleitung\", \"description\": \"Eine Einleitung in die Welt der Algorithmen und Datenstrukturen. Was ist ein Algorithmus und wozu wird er ben\\\\u00f6tigt? Und was haben Datenstrukturen damit zu tun?\", \"type\": 5}, {\"id\": 116, \"name\": \"Graphen\", \"description\": \"Graphen sind eine wichtige Darstellungsform von Daten in der Informatik. Wie Graphen aufgebaut sind und was man alles mit ihnen machen kann wird in diesem Kapitel behandelt.\", \"type\": 5}, {\"id\": 117, \"name\": \"Suche in Graphen\", \"description\": \"Die Suche in Graphen ist ein wichtiges Werkzeug. Allerdings gibt es mehrere Wege, welche zum Ziel f\\\\u00fchren und nicht alle funktionieren gleich gut. Wie man effizient in Graphen sucht wird in diesem Kapitel behandelt.\", \"type\": 5}, {\"id\": 118, \"name\": \"Dynamische Datenstrukturen\", \"description\": \"Im Laufe der Vorlesung wurden bereits einige Datenstrukturen vorgestellt. In diesem Kapitel besch\\\\u00e4ftigen wir uns mit einer weiteren Klasse der Datenstrukturen, den dynamischen Datenstrukturen. Und damit, welche M\\\\u00f6glichkeiten sie bieten.\", \"type\": 5}, {\"id\": 119, \"name\": \"Sortieren\", \"description\": \"Neben der Suche von Elementen spielt auch das Sortieren in der Informatik eine gro\\\\u00dfe Rolle. Wie man das macht wird in diesem Kapitel behandelt.\", \"type\": 5}, {\"id\": 120, \"name\": \"AuD1\", \"description\": \"Algorithmen und Datenstrukturen 1\", \"type\": 5}], \"links\": [{\"source\": 0, \"target\": 115}, {\"source\": 1, \"target\": 0}, {\"source\": 2, \"target\": 0}, {\"source\": 3, \"target\": 115}, {\"source\": 3, \"target\": 5}, {\"source\": 4, \"target\": 0}, {\"source\": 5, \"target\": 115}, {\"source\": 6, \"target\": 5}, {\"source\": 7, \"target\": 115}, {\"source\": 8, \"target\": 115}, {\"source\": 8, \"target\": 7}, {\"source\": 9, \"target\": 116}, {\"source\": 10, \"target\": 13}, {\"source\": 11, \"target\": 116}, {\"source\": 11, \"target\": 14}, {\"source\": 11, \"target\": 20}, {\"source\": 11, \"target\": 22}, {\"source\": 11, \"target\": 23}, {\"source\": 12, \"target\": 13}, {\"source\": 12, \"target\": 14}, {\"source\": 13, \"target\": 116}, {\"source\": 14, \"target\": 116}, {\"source\": 15, \"target\": 116}, {\"source\": 16, \"target\": 15}, {\"source\": 17, \"target\": 15}, {\"source\": 18, \"target\": 15}, {\"source\": 19, \"target\": 15}, {\"source\": 20, \"target\": 21}, {\"source\": 21, \"target\": 116}, {\"source\": 22, \"target\": 21}, {\"source\": 23, \"target\": 21}, {\"source\": 24, \"target\": 117}, {\"source\": 25, \"target\": 117}, {\"source\": 25, \"target\": 15}, {\"source\": 26, \"target\": 27}, {\"source\": 27, \"target\": 117}, {\"source\": 28, \"target\": 29}, {\"source\": 28, \"target\": 30}, {\"source\": 28, \"target\": 31}, {\"source\": 28, \"target\": 32}, {\"source\": 28, \"target\": 33}, {\"source\": 29, \"target\": 117}, {\"source\": 30, \"target\": 117}, {\"source\": 31, \"target\": 117}, {\"source\": 31, \"target\": 27}, {\"source\": 32, \"target\": 117}, {\"source\": 32, \"target\": 27}, {\"source\": 33, \"target\": 34}, {\"source\": 33, \"target\": 35}, {\"source\": 34, \"target\": 117}, {\"source\": 35, \"target\": 117}, {\"source\": 36, \"target\": 35}, {\"source\": 36, \"target\": 37}, {\"source\": 37, \"target\": 117}, {\"source\": 38, \"target\": 32}, {\"source\": 38, \"target\": 31}, {\"source\": 38, \"target\": 27}, {\"source\": 39, \"target\": 31}, {\"source\": 39, \"target\": 27}, {\"source\": 40, \"target\": 32}, {\"source\": 40, \"target\": 27}, {\"source\": 41, \"target\": 37}, {\"source\": 42, \"target\": 117}, {\"source\": 43, \"target\": 37}, {\"source\": 43, \"target\": 31}, {\"source\": 43, \"target\": 32}, {\"source\": 44, \"target\": 25}, {\"source\": 44, \"target\": 46}, {\"source\": 45, \"target\": 27}, {\"source\": 45, \"target\": 35}, {\"source\": 46, \"target\": 28}, {\"source\": 46, \"target\": 47}, {\"source\": 47, \"target\": 118}, {\"source\": 48, \"target\": 118}, {\"source\": 49, \"target\": 48}, {\"source\": 50, \"target\": 51}, {\"source\": 50, \"target\": 52}, {\"source\": 51, \"target\": 118}, {\"source\": 52, \"target\": 118}, {\"source\": 52, \"target\": 51}, {\"source\": 53, \"target\": 52}, {\"source\": 54, \"target\": 52}, {\"source\": 55, \"target\": 52}, {\"source\": 56, \"target\": 52}, {\"source\": 57, \"target\": 52}, {\"source\": 58, \"target\": 59}, {\"source\": 59, \"target\": 51}, {\"source\": 59, \"target\": 118}, {\"source\": 60, \"target\": 59}, {\"source\": 61, \"target\": 118}, {\"source\": 61, \"target\": 60}, {\"source\": 61, \"target\": 59}, {\"source\": 62, \"target\": 118}, {\"source\": 63, \"target\": 25}, {\"source\": 64, \"target\": 63}, {\"source\": 64, \"target\": 25}, {\"source\": 65, \"target\": 63}, {\"source\": 65, \"target\": 25}, {\"source\": 66, \"target\": 47}, {\"source\": 66, \"target\": 48}, {\"source\": 66, \"target\": 51}, {\"source\": 66, \"target\": 52}, {\"source\": 66, \"target\": 59}, {\"source\": 66, \"target\": 61}, {\"source\": 67, \"target\": 22}, {\"source\": 67, \"target\": 47}, {\"source\": 68, \"target\": 52}, {\"source\": 68, \"target\": 51}, {\"source\": 69, \"target\": 61}, {\"source\": 69, \"target\": 59}, {\"source\": 70, \"target\": 50}, {\"source\": 70, \"target\": 71}, {\"source\": 70, \"target\": 72}, {\"source\": 70, \"target\": 73}, {\"source\": 71, \"target\": 58}, {\"source\": 71, \"target\": 51}, {\"source\": 72, \"target\": 58}, {\"source\": 72, \"target\": 51}, {\"source\": 73, \"target\": 118}, {\"source\": 74, \"target\": 75}, {\"source\": 74, \"target\": 76}, {\"source\": 75, \"target\": 119}, {\"source\": 76, \"target\": 77}, {\"source\": 76, \"target\": 78}, {\"source\": 77, \"target\": 119}, {\"source\": 78, \"target\": 119}, {\"source\": 79, \"target\": 78}, {\"source\": 80, \"target\": 78}, {\"source\": 80, \"target\": 62}, {\"source\": 81, \"target\": 119}, {\"source\": 82, \"target\": 81}, {\"source\": 83, \"target\": 75}, {\"source\": 83, \"target\": 81}, {\"source\": 84, \"target\": 75}, {\"source\": 85, \"target\": 81}, {\"source\": 86, \"target\": 73}, {\"source\": 86, \"target\": 87}, {\"source\": 86, \"target\": 119}, {\"source\": 86, \"target\": 84}, {\"source\": 87, \"target\": 86}, {\"source\": 88, \"target\": 119}, {\"source\": 88, \"target\": 86}, {\"source\": 88, \"target\": 84}, {\"source\": 89, \"target\": 90}, {\"source\": 89, \"target\": 91}, {\"source\": 89, \"target\": 92}, {\"source\": 89, \"target\": 93}, {\"source\": 90, \"target\": 119}, {\"source\": 91, \"target\": 119}, {\"source\": 92, \"target\": 119}, {\"source\": 92, \"target\": 91}, {\"source\": 93, \"target\": 119}, {\"source\": 94, \"target\": 93}, {\"source\": 95, \"target\": 96}, {\"source\": 96, \"target\": 119}, {\"source\": 97, \"target\": 96}, {\"source\": 97, \"target\": 81}, {\"source\": 98, \"target\": 100}, {\"source\": 98, \"target\": 101}, {\"source\": 99, \"target\": 98}, {\"source\": 100, \"target\": 119}, {\"source\": 101, \"target\": 119}, {\"source\": 101, \"target\": 100}, {\"source\": 102, \"target\": 103}, {\"source\": 102, \"target\": 104}, {\"source\": 103, \"target\": 119}, {\"source\": 104, \"target\": 119}, {\"source\": 105, \"target\": 96}, {\"source\": 105, \"target\": 100}, {\"source\": 105, \"target\": 101}, {\"source\": 106, \"target\": 96}, {\"source\": 107, \"target\": 100}, {\"source\": 107, \"target\": 101}, {\"source\": 108, \"target\": 119}, {\"source\": 108, \"target\": 51}, {\"source\": 108, \"target\": 105}, {\"source\": 109, \"target\": 110}, {\"source\": 109, \"target\": 111}, {\"source\": 109, \"target\": 112}, {\"source\": 110, \"target\": 119}, {\"source\": 110, \"target\": 96}, {\"source\": 111, \"target\": 110}, {\"source\": 112, \"target\": 119}, {\"source\": 113, \"target\": 120}, {\"source\": 114, \"target\": 113}, {\"source\": 115, \"target\": 120}, {\"source\": 116, \"target\": 120}, {\"source\": 117, \"target\": 120}, {\"source\": 118, \"target\": 120}, {\"source\": 119, \"target\": 120}], \"objectGroups\": [{\"id\": 0, \"name\": \"Vorlesung\", \"color\": \"rgb(104, 169, 77)\"}, {\"id\": 1, \"name\": \"Beispiel\", \"color\": \"rgb(102, 75, 154)\"}, {\"id\": 2, \"name\": \"Definition\", \"color\": \"rgb(41, 171, 226)\"}, {\"id\": 3, \"name\": \"\\\\u00dcbung\", \"color\": \"rgb(224, 133, 35)\"}, {\"id\": 4, \"name\": \"Algorithmus\", \"color\": \"rgb(214, 207, 126)\"}, {\"id\": 5, \"name\": \"Kapitel\", \"color\": \"rgb(239, 65, 35)\"}]}'" ] }, - "execution_count": 11, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -169,7 +210,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -183,7 +224,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.11" + "version": "3.10.4" } }, "nbformat": 4, -- GitLab