Test-arbre.ml
De wiki-prog
Ce programme utilise les implantations des AVL (avl.ml) et des ARN (arn.ml) afin de comparer les transformations effectuées lors des insertions (notamment lors des insertions massives.)
Utilisation:
./test-arbre [type] [graine] [taille] ./test-arbre [type] [graine] [taille] off
- Le premier type d'appel, engendre un arbre de type [type] (avl ou arn) de taille [taille], la graine n'est pas utilisée. Le programme sort sur la sortie standard le code à insérer dans un fichier LaTeX (arbre et informations sur les transformations.)
- Le second type d'appel, engendre un arbre de type [type] (avl ou arn) de taille [taille] où les clefs insérées sont générées aléatoirement (en utilisant la graine.) Seules les informations sur les transformations sont affichées.
Le premier type d'appel, sert surtout à visualiser le résultat avec un arbre de taille raisonable, tandis que le second type permet plutôt d'observer ce qui se passe avec un très grand nombre d'insertions (où l'affichage de l'arbre n'est plus pertinent.)
Code
(* Test d'arbre ... *) (* La signature des modules de representation des arbres *) module type Arbre = sig type t val empty : t val is_empty : t -> bool val add : (string -> 'a) -> int -> t -> t val print : t -> unit val print_tex : t -> unit val mem : int -> t -> bool end (* Le foncteur pour tester les arbres *) module Testeur (T:Arbre) = struct type t = T.t (* La fonction "enregistrant" les transformations *) let update = (* Donnees statique *) let data = Hashtbl.create 7 in let get s = try Hashtbl.find data s with Not_found -> 0 in fun b s -> if b then begin Hashtbl.replace data s (1 + get s); data end else data (* Ajout en mass dans un arbre depuis une liste *) let mass_add l = List.fold_left (fun t k -> T.add (update true) k t) T.empty l (* Execution des tests *) let perform_test flag l = begin let t = (mass_add l) in Hashtbl.iter (Format.printf "%s: %i\\\\@.") (update false ""); Format.printf "@."; List.iter (fun k -> ignore (T.mem k t)) l; if (not flag) then T.print_tex t; Format.printf "@."; end end let rec gen_list_lin acu = function 0 -> acu | n when n>0 -> gen_list_lin (n::acu) (n-1) | _ -> assert false let rec gen_list_rand acu = function 0 -> acu | n when n>0 -> gen_list_rand (Random.int 65536::acu) (n-1) | _ -> assert false let choose_gen_list b = if b then gen_list_rand else gen_list_lin let main () = begin if (Array.length Sys.argv)>3 then begin let flag = (Array.length Sys.argv)>4 in let gen_list = choose_gen_list flag in Random.init (int_of_string (Sys.argv.(2))); let l = gen_list [] (int_of_string Sys.argv.(3)) in (match Sys.argv.(1) with "avl" -> let module MyTreeTest = Testeur (Avl) in MyTreeTest.perform_test flag l | "arn" -> let module MyTreeTest = Testeur (Arn) in MyTreeTest.perform_test flag l | _ -> (Printf.fprintf stderr "Wrong tree type ... \n"; exit 2)); exit 0 end else begin Printf.fprintf stderr "Miss some args ...\n"; exit 1 end end let _ = main ()
Fichiers suplémetaires
Makefile
Voici mon Makefile pour ce programme.
# Au besoin on peut changer les compilateurs par défaut OCAMLC=ocamlc.opt OCAMLOPT=ocamlopt.opt all: test-arbre test-arbre: avl.cmx arn.cmx test-arbre.cmx ${OCAMLOPT} -o $@ $> test-arbre.cmx: avl.cmi arn.cmi arn.tex: test-arbre rm -f arn.tex ./test-arbre arn 0 25 > arn.tex avl.tex: test-arbre rm -f avl.tex ./test-arbre avl 0 25 > avl.tex tree.pdf: tree.tex arn.tex avl.tex pdflatex tree.tex pdflatex tree.tex # Le reste n'a pas de raison de changer .SUFFIXES: .ml .mli .cmo .cmi .cmx .opt # Generation d'un exécutable à partir d'un .ml (bytecode) .ml: ${OCAMLC} -o $@ $< # Generation d'un exécutable à partir d'un .ml (natif) .ml.opt: ${OCAMLOPT} -o $@ $< .mli.cmi: ${OCAMLC} -c $< .ml.cmo: ${OCAMLC} -c $< .ml.cmx: ${OCAMLOPT} -c $< # some cleaning ... clean:: rm -f *~ # do we use emacs ;) rm -f *.cm[iox] *.o # remove comp prod rm -f test-arbre rm -f tree.aux tree.log # THE END (do not delete)
tree.tex
Et le fichier tree.tex:
\documentclass[a4paper,pdftex,french,landscape]{article} \usepackage{fullpage} \usepackage[utf8]{inputenc} \usepackage{txfonts} \usepackage{tikz} \usetikzlibrary{trees} \begin{document} \noindent\input{arn} \pagebreak \noindent\input{avl} \end{document}