From 6f2b32d04a80cd78a64ee44b7d3a2b78485cab8d Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 6 Jun 2024 22:56:03 +0200 Subject: [PATCH] Dynamic ABR insert --- a.out | Bin 273471 -> 274623 bytes trees.cmi | Bin 6214 -> 6472 bytes trees.cmo | Bin 13986 -> 15533 bytes trees.ml | 68 +++++++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/a.out b/a.out index 0b6f420666b5ffd1e9d32a39808c95f4abcbabe0..9c51601014de8ea033f5571b3cc9d2de57a862ea 100755 GIT binary patch delta 1524 zcma)*ZERCz6vyv#&)wWhyLEKfEi>+pt=r0Qv?v5|N_jE(65~iFzLA)QHEz;vuyv7r zFoR@?i3vpLSMt#bI3Hll*ee zJa;{c-%78x^zeVIrt$7ey1Ty=svJ-Wb$%~|4 zos|o5gQH~5ORE-@B1AS>&w&uR4<{(1X1F6kTd;V^N#*8Qr!tggr4m>+mTw&UFGX%sKP04Em!$6xN1Foo{~!4#W#{v z{eOcPL9csp)3zLPGsu>sJcIadmneUFo_cuKIGNm>q#@q^5|wiEIo;*_;;+n0iQK^f zud4XxG*;6X4HYZqn-k>Dk*Ydk!7S9(Q9ds~o3rf|$RrmmW8)leoT6I2WsYB&qDDPD$MGrJmh&!j8mrZKv%C~N zR#p4EZRbPZkdD%{Z*SfCpXA*ss`GXH%l+c78QH=m2h*wdJ*3>eZ(wFS=p$??+d)#h zsL|WqbTZvdYM5tIv=a4`KTVrr{&hx)36V4b0qM$97P^uYn{SY-Tw1vd$dC>Z`$2G; zU%N(?>TT=zHTt=(Tdet4N9r2?wK3*?%AR{=-S4^WaIZ-hEZKeconm3 z$8zcniA31kn7l*-N3@tOXw#dBgu04gL^n-E=<9spqHcQO;k@TL&w1YSp2g4F;(P7x z5DbYl_RfeOR(XB~ZzH8&VM9csOIqg8hp?LharA&j{c&uzYKo$CFj^_}9GzgH>Hih& z2^=)7{nT|69WJ1gVhQxa4suL^)6~u`cKJ2I-sHLpF1SVKf>2LANo=6&Nq#?*#2A2? zjwP}6H$%+a*bCfvYI_VfMbh%2S#wpw>jJZcu3ds>{Kpb7y0sd6h;kV4j%pCn<$${ABC52 zKSb!o5{?7?RqQQPi(_(g8Fh81t)lC`?SVNcT@|twv0a?0P)89Dii;JxT*M2eDC-o0 z057aq#2&Y2Q`fDmKVUTRv2XmFf1vIXdc@c|O_s3EQI*|en#7H9~^DKyKQ9$vvujmJ5!V;INDFz(%qD2=RQGfc?jDwaKt`-*~J zSn*O(YDX=KZ9vAiu+dAMZR#*g%1oO&04xr8)EWU%3VPL>T4;XaY-0J@pfwoDmET-h Ymj$nyGK+U%y5m>(3GY*y@~bVs0Q%3=jQ{`u diff --git a/trees.cmi b/trees.cmi index 29e58b8769705ebc105675c73c676e0cdf852e34..d0adebc0fb55a24a0431092f2473c329dd660d95 100644 GIT binary patch literal 6472 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 E6`rmI761SM diff --git a/trees.cmo b/trees.cmo index 6fc67aff33ed6bf32a9af05d9183950ee5021bad..056404793103b02a82d125391de78e0647954fd5 100644 GIT binary patch delta 3598 zcmb7Gdu)@}75C5nKH|i&^z+K5jzj#*r@_7qt3_%>$0_LLwSl|5;w`}BrGvo z($P6BNMjXDaV}+{qR6Zhw1}?hLJ^%1$|U~CB*y5()K!4?08zA2!5@Uu4UwI5jVbFi zZM)J>=iKwY=UmCIeXxd6usukY7rkYcXwjv7v#moG?n@&f5w9t&qKB!v*CE z$tV7ch2(N@AH4)R11&ny#B^G>UWan=$%0xGiP5|&Z!u}O$8G}OhC;%_bLBh*;#+zD zpZ$Az-^WLyNx!0uo5SFwW7=__IF(ksYj7L6@ErthQjz$; zV8^T|E^r!o%G~)L!t68(-U0IdcL#xjA9`sf^L)lOLhf$yz*zR+zKNF#hQ)YcxiA|t zl;JI-d*ScyWrxXj3?D(AzGSpJN=oPE=No9t)$;oCoLJ!ZX*=db&>z&s=fp<;v)Utb z;<$ffwePd}c^+B4wA5(+^69_s-w}@lYM1qYLAw5S*6QIbdnhXh;bM4T9Faz>xj^{> zHkBJ{5b1!OuKrS*^=|^pjodmHf#;!{uBbEMNxsV*m1&T$j8ID8#rK){CA^`vx1*oJRQY zjMARtkFvu>c31%=bwzsQFJ0XmOSH6N_)j53GTjFC zL9@c2H)|J=Kx7gTs&03V|0Rdq#9lk0_TFz+iU&eglR!Trrx3X~qwLG^e`b#n_Sge; zjHw$7tW00S0+Ne}9AIo{C^p*J6Hj)=y1R#vSDGDTo~-mZ@^-Sv`^cld3&jY1;X|I{ zaDy?W_p`@oiNBn9fT^L6JWt zxjYnYA{&}4ind6J5k-?yVn7jxQDH&R9m&{WZkH-6%#@i_tLCYcAH_j!f9q<l7J6jV5iD$$ zk})h?!%?on=4aC=Y@tjhC1{Yg4r#Fqwr$eq71(x3$pmbaD6K4mZB_~HPu9s1cO&w{T=Ldg91{em*L0;{2CmmrF%OZ=h^EJ92A&rpN3N-nN@I>OJ*gUi>3D+ zIM+zYZ8)i7igyoAZlrPqPKujWwF;bP*hH&^Qx=-i7N9&E@ClSB$Y>&%yH!ue2D%6P zQL&Um(4FpPsz=2MrUq18VQNC9o@p^Esex&FNh+y`G`%F1G^w=WKvgMa%)S^sL!HBY zFT^`XP{l1JVTwLNIq4{>lH{UlA3@bES!Dz+MM@rn%gPcQglm(Ow8AwdC5Pd<%MYq> zhk{M0?%<@iQN1B63kO4}=3^=IsLn=Tiy9gP^qWLmdCu&B-OHJ;GdxSI%@^u^B z{O!)}ty|#c(R}_TXypeN?)}nl2Rw!1kKuB$ugT!_l#{RGhsVR|YT=1Wo44ROAYe`jkf0Y4vG z)gFPLe294+0VzIb?lQZdH{`+Y5L_dfw-MZu z$xKYBy7#cCP4qWcT279KT2C8xpZ}Y0(MPYD9{uap)Q#x_%^#!kMn+Y%85KhrReO}^ O<&3HuBmO{?*FOQe2-b-J delta 2370 zcmaJ?e{54#6z;;6<9(?5H=ZL%!~*V5ecPk{tgApMsB21>xmKhmt`c+gH5SkppN2<5*Ej6ywJqingtrq z;q3mS87|I#OHK+!Wn3Mk+cxdVAyRW8E2nGNJS!`w063u=z+h7+Mx@@7(ZYG}^MEHx64R=iY=(7Cj4F zoa1j`+s#eBh3znF${y|B&9w$JB zhTPK<$wMynNGkK-Fi60Igrib&3gC!H$Pb6?a|@2Qn7bN|BV0BG#~DeefrAF5vej^! zBr*%m5K~vd*(`wuIB7-5^r8@XW0XqJmE=vxln;653Z|v`b(yo;I^{p5ZqLk z=39(}J0e#P!rdwt_rbkM%6Guc=c{5n+%z&3d=_p#N97&3sW1V1k*`R~9^|J7-H-fq zz4^$0i#UU|Q@^97vF`SbT_}ii1r-IO>`h1%T;qiWgQI{a$wbLH))}Y4*DS8g4tjj8q*E&4 zTg9D%@X5Ny5Pa7}Z6xUN8#wu9Mr^7jwK1nA2E diff --git a/trees.ml b/trees.ml index d697c4e..c9cd94b 100644 --- a/trees.ml +++ b/trees.ml @@ -251,11 +251,11 @@ let count_per_floor tr = in aux tr 0 ; res ;; let showtree tdt r = - let rec aux t = match t with + let rec aux t side = match t with | Nothing -> () | Tail data -> begin set_line_width 9; - set_color (rgb 48 48 48); + if side = 1 then set_color (rgb 200 48 48) else set_color (rgb 48 48 200) ; draw_poly_line [|(data.parent.x, data.parent.y); (data.self.x, data.self.y)|]; set_color (rgb 192 192 192); @@ -271,11 +271,11 @@ let showtree tdt r = end | Cross (data, g, d) -> begin set_line_width 9; - set_color (rgb 48 48 48); + if side = 1 then set_color (rgb 200 48 48) else set_color (rgb 48 48 200) ; draw_poly_line [|(data.parent.x, data.parent.y); (data.self.x, data.self.y)|]; - aux g; - aux d; + aux g (-1); + aux d 1; set_color (rgb 192 192 192); fill_circle data.self.x data.self.y r; @@ -288,7 +288,7 @@ let showtree tdt r = set_line_width 5; draw_integer data.self.x data.self.y data.tag r; end - in aux tdt ;; + in aux tdt 0 ;; let coords_on_segment a b divsize k = if divsize <> 0 then @@ -301,8 +301,6 @@ let max_of_arr a = if !m < a.(i) then m := a.(i) done; !m ;; - - let pretty_tree_printing_new_version tr r ystep win_w win_h display = let d = depth_of_tree tr in let amt_per_floor = count_per_floor tr in @@ -326,20 +324,64 @@ let pretty_tree_printing_new_version tr r ystep win_w win_h display = visited_fl.(dpth) <- visited_fl.(dpth) + 1; if dpth <> 0 then begin let data = {tag = x ; parent = parent_xy ; self = self} in - Cross (data, build_data_tree g (dpth+1) self, build_data_tree d (dpth+1) self) + let arg_left = build_data_tree g (dpth+1) self in + let arg_right = build_data_tree d (dpth+1) self in + (* PS : this is a good example of OCaml evaluating its arguments from right to left *) + (* if the recursive call were to be directly inside the constructor, the displayed tree would be reversed *) + Cross (data, arg_left, arg_right) end else begin let data = {tag = x ; parent = self ; self = self} in - Cross (data, build_data_tree g (dpth+1) self, build_data_tree d (dpth+1) self) + let arg_left = build_data_tree g (dpth+1) self in + let arg_right = build_data_tree d (dpth+1) self in + Cross (data, arg_left, arg_right) end end in let treedata = build_data_tree tr 0 {x = win_w/2 ; y = win_h - r} in - if display then showtree treedata r ;; + if display then showtree treedata r; treedata ;; + +(* ABR things *) + +let identity n = n ;; + +let rec insert_abr tr e = match tr with + | Empty -> Node (e, Empty, Empty) + | Leaf t when e < t -> Node (t, (Node (e, Empty, Empty)), Empty) + | Leaf t -> Node (t, Empty, (Node (e, Empty, Empty))) + | Node (x, g, d) when e < x -> Node (x, insert_abr g e, d) + | Node (x, g, d) -> Node (x, g, insert_abr d e) ;; + +let successive_insert () = + let cur_tree = ref (Empty) in + open_graph " 1400x1000" ; + set_window_title "Trees" ; + try + while true do + Stdlib.print_endline "What element would you like to insert ? (crash to terminate)"; + let elt = Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity in + + close_graph () ; + open_graph " 1200x1000" ; + set_window_title "Trees" ; + + cur_tree := insert_abr !cur_tree elt; + ignore (pretty_tree_printing_new_version !cur_tree 40 100 1200 1000 true) + done; + () + with + | Stdlib.Scanf.Scan_failure _ -> ignore (pretty_tree_printing_new_version !cur_tree 40 150 1200 1000 true) ;close_graph () ;; (* --------------------------------------| TESTS |-------------------------------------- *) Random.self_init () ;; - -let identity n = n ;; +(* +open_graph " 1800x1000" ;; +set_window_title "Trees" ;; +ignore (pretty_tree_printing_new_version (Node (0, Node (1, (Node (0, Node (1, Empty, Empty), Node (2, Empty, Empty))), Empty), Node (2, Empty, (Node (0, Node (1, Empty, Empty), Node (2, Empty, Empty)))))) 40 150 1800 1000 true) ;; +ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; +close_graph () ;; +failwith "E" ;; +*) +successive_insert () ;; open_graph " 1800x1000" ;; set_window_title "Trees" ;;