ebook img

Fragments de supports de cours Algorithmique et complexité Master d'informatique, premi`ere année PDF

237 Pages·2015·1.07 MB·French
by  
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Fragments de supports de cours Algorithmique et complexité Master d'informatique, premi`ere année

Fragments de supports de cours Algorithmique et complexit(cid:19)e Master d’informatique, premi(cid:18)ere ann(cid:19)ee D. Michelucci1 4 novembre 2015 1. Merci aux auteurs de Linux, Latex, Ocaml, H(cid:19)ev(cid:19)ea, gcc... 2 Lalecturedecesnotesnedispensepasd’assisterauxcours,auxTD,auxTP. Venir en cours, et ^etre attentif, ne dispense pas de lire la Bible : "Introduction (cid:18)a l’algorithmique", de Thomas H. Cormen, Charles H. Leiserson, Ronald L. Rivest, Cli(cid:11)ord Stein, chez Dunod, empruntable (cid:18)a la biblioth(cid:19)eque. N’h(cid:19)esitez pas (cid:18)a me signaler les erreurs. Chapitre 1 Quelques petits probl(cid:18)emes combinatoires 1.1 Sous ensembles de cardinalit(cid:19)e k d’un en- semble let rec k subsets ensemble k = if k=0 then [ [] ] else let n=List.length ensemble in if n<k then [] else if k=n then [ ensemble ] else match ensemble with j t::q (cid:0)> (k subsets q k) @ (List.map (function e (cid:0)> t::e) (k subsets q (k(cid:0)1))) j [] (cid:0)> failwith "impossible" ;; # k subsets [1;2;3;4] 2;; (cid:0) : int list list = [[3; 4]; [2; 4]; [2; 3]; [1; 4]; [1; 3]; [1; 2]] 1.2 Sous ensembles d’un ensemble let rec subsets ensemble = match ensemble with j [] (cid:0)> [ [] ] j t::q (cid:0)> let parts of q = subsets q in let tete union parts of q = List.map (function ens(cid:0)> t::ens) parts of q in parts of q @ tete union parts of q ;; # subsets [1;2];; (cid:0) : int list list = [[]; [2]; [1]; [1; 2]] 1.3 Permutations ((cid:3) insn‘ere e [a; b; c]: rend la liste [ [e;a;b;c]; [a;e;b;c]; [a;b;e;c]; [a;b;c;e]] (cid:3)) let rec insert e liste = match liste with j [] (cid:0)> [[ e]] j t::q (cid:0)> (e:: liste )::( List.map (function y (cid:0)> t::y) 3 4 CHAPITRE 1. QUELQUES PETITS PROBLE(cid:18)MES COMBINATOIRES (insert e q));; let rec permutations l = match l with [] (cid:0)> [[]] j t::q (cid:0)> List. flatten (List.map (function permu sans t(cid:0)> insert t permu sans t) (permutations q));; # permutations [1;2;3];; (cid:0) : int list list = [[1; 2; 3]; [2; 1; 3]; [2; 3; 1]; [1; 3; 2]; [3; 1; 2]; [3; 2; 1]] Chapitre 2 Petits programmes graphiques 2.1 La courbe de von Koch Figure 2.1 { La courbe de Von Koch open Graphics ;; open graph " 400x400";; set color black ;; let iof = int of float ;; let fractal niv (x0,y0) (x4,y4) = let rec von koch niv (x0,y0) (x4,y4) = if niv=0 then ( moveto (iof x0) (iof y0); lineto (iof x4) (iof y4)) else let (x1, y1)= ( (2. (cid:3). x0 +. x4) /. 3. , (2. (cid:3). y0 +. y4) /. 3.) in let (x3, y3)= ( (x0 +. 2. (cid:3). x4) /. 3. , (y0 +. 2. (cid:3). y4) /. 3.) in let (xm, ym)= ( (x0 +. x4) /. 2., (y0 +. y4) /. 2. ) in let (x2, y2)= ( xm (cid:0). (sqrt 3.) (cid:3). (ym (cid:0). y1), ym +. (sqrt 3.) (cid:3). (xm (cid:0). x1)) in ( von koch (niv(cid:0)1) (x0, y0) (x1, y1); 5 6 CHAPITRE 2. PETITS PROGRAMMES GRAPHIQUES von koch (niv(cid:0)1) (x1, y1) (x2, y2); von koch (niv(cid:0)1) (x2, y2) (x3, y3); von koch (niv(cid:0)1) (x3, y3) (x4, y4); ) in clear graph (); set color black; von koch niv (x0,y0) (x4,y4);; fractal 8 (10. , 10.) (390., 10.);; 2.2 Fractales et IFS Dans ce programme, des fractales sont d(cid:19)ecrites par des IFS (iterated func- tions systems), et trac(cid:19)ees par la m(cid:19)ethode de marche al(cid:19)eatoire. Les courbes de Bernsteinpeuventellesaussi^etred(cid:19)ecritespardesIFS,l’exempled’uneparabole est donn(cid:19)ee. Ici les fonctions des IFS sont des transformations a(cid:14)nes contrac- tantes.Le(cid:12)chierlu decompose.mlestutilis(cid:19)epourinverserlamatricedespoints de contr^ole de la courbe de B(cid:19)ezier. Cf chapitre sur l’alg(cid:18)ebre lin(cid:19)eaire. 2.2.1 Fichier fractal.ml ((cid:3) a partir d’un fichier de E Mostacci , etudiante MIGS2, 2007(cid:0)2008 (cid:3)) module A=Array;; module L=List ;; let iof=int of float ;; type mat=float array array ;; type ifs=mat array ;; let rec summation i0 i1 f= let rec addition i accu= if i>i1 then accu else addition (i+1) (accu +. (f i )) in addition 0 0.;; let matrice nl nc f = A. init nl (function l(cid:0)> A. init nc (function c(cid:0)> f l c) );; let mult a b = let la=A.length a and ca=A.length a.(0) and lb=A.length b and cb=A.length b.(0) in assert (ca=lb); matrice la cb (fun line col (cid:0)> summation 0 (ca(cid:0)1) (function k(cid:0)> a.( line ).(k) (cid:3). b.(k).( col )));; let rotation thetadeg= let pi=acos((cid:0)1.) in let theta= thetadeg /. 180. (cid:3). pi in [j [j cos theta; sin theta ;0.j]; [j sin(0.(cid:0).theta);cos(theta );0.j]; [j 0.; 0.; 1.j] j] ;; 2.2. FRACTALES ET IFS 7 let trans tx ty = [j [j 1.;0.;0.j]; [j 0.;1.;0.j]; [j tx;ty ;1.j] j] ;; let affine kx ky = [j [j kx;0.;0.j]; [j 0.;ky;0.j]; [j 0.;0.;1.j] j] ;; let homot k= affine k k;; let transpt v m = let n=A.length v in let nl=A.length m in let nc=A.length m.(0) in assert (n=nl); A. init nc (function c (cid:0)> summation 0 (n(cid:0)1) (fun lig (cid:0)> v.( lig) (cid:3). m.( lig ).(c)));; open Graphics ;; open graph" 400x400";; let afficher v = match v with j [jx;y; j] (cid:0)> let xx=x (cid:3). 300. in ((cid:3) a la louche (cid:3)) let yy=y (cid:3). 300. in draw rect (iof xx) (iof yy) 0 0 j (cid:0)> () ;; let montecarlo ifs n= clear graph (); let pt=ref [j0.;0.;1.j] in let nt=A.length ifs in for i=0 to n do let t=Random. int nt in pt:=transpt !pt ifs .(t); if i>10 then afficher !pt done;; ((cid:3)produit d’une liste de matrice(cid:3)) let multl mats= L. fold left mult (L.hd mats)(L. tl mats);; let vonkoch= [j affine (1./.3.) (1./.3.); multl[ affine (1./.3.) (1./.3.); trans (2./.3.) (0.) ]; multl[ affine (1./.3.) (1./.3.); rotation 60.; trans (1./.3.)( 0.)]; multl[ trans ((cid:0)1.) (0.); rotation ((cid:0)60.); affine (1./.3.) (1./.3.); trans (2./.3.) (0.) ] j];; let sierpinsky= 8 CHAPITRE 2. PETITS PROGRAMMES GRAPHIQUES [j homot 0.5; multl[homot 0.5; trans (0.5) (0.)]; multl[homot 0.5 ; trans (1./.4.) (sqrt (3.)/.4.)] j];; let menger = let h= homot (1. /. 3. ) in [j h; mult (trans 1. 0.) h; mult (trans 2. 0.) h; mult (trans 0. 1.) h; mult (trans 2. 1.) h; mult (trans 0. 2.) h; mult (trans 1. 2.) h; mult (trans 2. 2.) h j];; ((cid:3) Les points de controle de la courbe de Bezier (quadratique) sont P0= [j x0; y0; 1 j] P1= [j x1; y1; 1 j] P2= [j x2; y2; 1 j] On pose P= [j P0; P1; P2 j] La methode de de Castejau donne les points de la "moitie gauche" Q =[j Q0; Q1; Q2 j] = mat left P et les points de la moitie droite R =[j R0; R1; R2 j] = mat right P Les matrices de l ’IFS sont M1 qui transforme P en Q: Q=P M1 et M2 qui transforme P en R: R=P M2. Donc M1= P^((cid:0)1) Q = P^((cid:0)1) mat left P et M2= P^((cid:0)1) R= P^((cid:0)1) mat right P mat left et mat right sont appelees matrice de de Casteljau . Elles dependent du degre et contiennent le triangle de Pascal , elles sot divisees par une puissance de 2. (cid:3)) let parabole pts controle= ((cid:3) pts controle= [j pt0; pt1; pt2 j] (cid:3)) let module Lin = Lu decompose in let mat left = [j [j1.; 0.; 0.j]; [j1./.2.; 1./.2.; 0.j]; [j1./.4.; 2./.4.; 1./.4.j]j] in let mat right = [j [j1./.4.; 2./.4.; 1./.4.j]; [j0.; 1./.2.; 1./.2.j]; [j0.; 0.; 1.j] j] in let inv pts ctrl = Lin.inverse mat pts controle in [j multl [ inv pts ctrl ; mat left ; pts controle ]; multl [ inv pts ctrl ; mat right; pts controle ] j];; let similitude (x,y) thetadeg echelle= multl [ trans ((cid:0). x) ((cid:0). y); rotation thetadeg; homot echelle ; trans x y];; let dragon = let k= sqrt 0.5 in [j similitude (0. , 1.) ((cid:0)45.) k; multl [ trans ((cid:0)1.) 1. ; similitude ((cid:0)1., 0.) ((cid:0)135.) k ] j];; montecarlo dragon 100000;; 2.3. ARBRESDECONSTRUCTION(CSG:CONSTRUCTIVESOLIDGEOMETRY)EN2D9 let dragon2 = let k= sqrt 0.5 in [j multl [ homot k; rotation 45. ]; multl [ homot k; rotation 135.; trans 1. 0. ] j];; montecarlo dragon2 100000;; montecarlo sierpinsky 10000;; montecarlo vonkoch 10000;; montecarlo menger 100000;; montecarlo (parabole [j [j0.;0.;1.j]; [j1./.2.;3./.4.;1.j]; [j1.;0.;1.j] j] ) 5000;; 2.2.2 (cid:12)chier make(cid:12)le ok: lu decompose.cmo fractal lu decompose.cmi: lu decompose.mli ocamlc (cid:0)c lu decompose.mli lu decompose.cmo: lu decompose.ml lu decompose.cmi ocamlc (cid:0)c lu decompose.ml fractal : fractal .ml lu decompose.cmo ocamlc graphics.cma lu decompose.cmo fractal .ml (cid:0)o fractal clean: rm (cid:0)fr lu decompose.cmi lu decompose.cmo fractal fractal .cmo fractal .cmi 2.3 Arbres de construction (CSG : constructive solid geometry) en 2D 2.3.1 Enonc(cid:19)e Une forme est soit { le carr(cid:19)e unit(cid:19)e [0;1]2, { le cercle unit(cid:19)e, les points (x;y) tels que 1(cid:0)x2(cid:0)y2(cid:0)1(cid:21)0, { un demi plan (a;b;c) : les points (x;y) tels que ax+by+c(cid:21)0 { l’union de deux formes (a\b), { l’intersection de deux formes (a[b), { la di(cid:11)(cid:19)erence de deux formes (a(cid:0)b) { la translation de vecteur (u;v) d’une forme, { la rotation de (cid:18) degr(cid:19)es autour de l’origine d’une forme, { l’a(cid:14)nit(cid:19)e de facteurs a;b d’une forme (x0 =ax;y =by), { tout (si c’est commode d’avoir une telle forme), { rien (si c’est commode d’avoir une telle forme). Pour une forme donn(cid:19)ee, d(cid:19)etaillez une m(cid:19)ethode pour calculer si un point (x;y) se trouve (cid:18)a l’int(cid:19)erieur (ou sur la fronti(cid:18)ere...) ou (cid:18)a l’ext(cid:19)erieur de la forme. En d(cid:19)eduire une premi(cid:18)ere m(cid:19)ethode pour visualiser la forme, ie la convertir en une image binaire carr(cid:19)ee I(i;j) avec i;j 20::n(cid:0)1; les pixels dont le centre appartient (cid:18)a la forme sont a(cid:14)ch(cid:19)es en noir, les autres sont a(cid:14)ch(cid:19)es en blanc. Le carr(cid:19)e de l’image (cid:19)echantillonne l’espace du carr(cid:19)e unit(cid:19)e, par d(cid:19)e(cid:12)nition. 10 CHAPITRE 2. PETITS PROGRAMMES GRAPHIQUES D(cid:19)etaillez une m(cid:19)ethode pour calculer l’intersection entre une droite, sous forme param(cid:19)etrique, et une forme donn(cid:19)ee (on pourra repr(cid:19)esenter cette intersec- tionparunelisted’intervalles).End(cid:19)eduireunesecondem(cid:19)ethodepourvisualiser la forme, ie la convertir en une image binaire carr(cid:19)ee etc. Vous aurez (cid:18)a programmer au moins l’une de ces m(cid:19)ethodes en TP. Ecrivez aussi une fonction rendant une (cid:12)gure fractale ((cid:19)eponge de Menger, triangle de Sierpinski, (cid:13)ocon de Von Koch, etc), avec un niveau prescrit de r(cid:19)ecursion. La visualiser. 2.3.2 Le source solution ((cid:3) on voxellise un arbre CSG, en 2D (eval un point un csg) rend un nb negatif si le point est dehors , positif si le point est dedans , nul si on est sur la frontiere eval fast est une optimisation de eval; par exemple si on est hors de A, ce n’est pas la peine de se demander si on est dans A(cid:0)B, ou dans A inter B (cid:3)) open Graphics ;; type pt= f x: float ; y: float g;; type figure = Union of figure(cid:3)figure j Inter of figure(cid:3)figure j Diff of figure(cid:3)figure j Carre j Cercle j Tout j Rien j Half of float(cid:3)float(cid:3)float j Trans of float(cid:3)float(cid:3)figure j Rota of float(cid:3)figure j Affin of float(cid:3)float(cid:3)figure ;; let pi = 4.0 (cid:3). (atan 1.) ;; let tourne pt fx=x;y=yg thetadeg = let theta=thetadeg /. 180. (cid:3). pi in f x= x(cid:3).(cos theta)+. y(cid:3).(sin theta); y= (cid:0). x(cid:3).(sin theta) +. y(cid:3).(cos theta) g;; ((cid:3) positif = dedans , negatif = dehors (cid:3)) let rec eval xy fig = match fig with j Tout (cid:0)> 1000. j Rien (cid:0)> ((cid:0)1000.) j Union (a, b) (cid:0)> max (eval xy a) (eval xy b) j Inter (a, b) (cid:0)> min (eval xy a) (eval xy b) j Diff (a, b) (cid:0)> min (eval xy a) (0. (cid:0). (eval xy b)) j Trans (tx ,ty ,b) (cid:0)> eval fx=xy.x (cid:0). tx; y=xy.y (cid:0). tyg b j Rota (theta ,b) (cid:0)> eval (tourne pt xy (0. (cid:0). theta)) b j Affin (kx,ky,b) (cid:0)> eval fx=xy.x /. kx; y=xy.y /. ky g b

Description:
avec des tableaux, qui a été vue en cours. 3.4 Le tri par base (radix sort). Note : le tri par base utilise le tri par partition (bucket sort). module A=Array ; ;.
See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.