Advertisement
csmine

TD3 - Preparation

Mar 8th, 2019
607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.65 KB | None | 0 0
  1. (* TD n°3 : Nombre d'inversion dans une permutation ou une liste*)
  2.  
  3. (* Vocabulaire :
  4. - permutation = application bijective de (1,...n) dans (1,...,n)
  5. - une liste est associée à une permutation si, après tri, elle devient [1;2;...;n]
  6. - le i-ème élément d'une telle liste est "o(i)" (à 2 on associe o(2), à i on associe o(i) )
  7. - on appelle inversion un couple (i,j) tel que i < j et o(i) > o(j) *)
  8.  
  9. (* Exercice 1 :
  10. 1. Pour compter le nombre d'inversions dans une liste associée à une permutation, on peut parcourir tous les couples (i,j) possibles avec i < j, et compter à chaque fois qu'on a o(i) > o(j).
  11.  
  12. 2. En comptant que la complexité est la vérification " o(i) > o(j) ", la complexité équivaut aux nombres de couples possibles (i,j) avec i < j.
  13. for j=0 to (n-1) do
  14. for i=0 to j do
  15. qui en calculant équivaut à n + (n*(n-1))/2 = (n² + n)/2 = O(n²)
  16.  
  17. 3. *)
  18.  
  19. List.nth [1;2] 2;;
  20.  
  21. let calcul_inversion sigma =
  22. let n = List.length sigma in
  23. let compteur= ref 0 in
  24. for j=0 to n-1 do
  25.     for i=0 to j do
  26.         if (List.nth sigma i) > (List.nth sigma j) then incr compteur;
  27.         done;
  28.         done;
  29.         !compteur;;
  30.        
  31. calcul_inversion [1;2;3;4;5;6];;
  32. calcul_inversion [1; 3;2 ;4;5;6];;
  33. calcul_inversion [1;3;2 ;5;4 ;6];;
  34. calcul_inversion [1;3; 5;2 ;4;6];;
  35.  
  36.        
  37. (* Exercice 2
  38. 1. Dans l'algorithme de tri par fusion, on divise en deux les listes jusqu'à obtenir des singletons. A partir des singletons, on doit faire une comparaison pour les remettre dans l'ordre, puis à nouveau jusqu'à récupérer la liste de la même longueur.
  39. Lors de ces comparaisons, on ajoute 1 au compteur pour chaque "permutation" à faire (lorsqu'ils ne sont pas dans le bon ordre)
  40.  
  41. 2. La complexité du tri par fusion est en n*log(n). En l'adaptant, on ne rajoute que des additions car les comparaisons y sont déjà. On ne modifie pas la complexité (multiplication par 2 qui ne change rien). *)
  42.  
  43. let rec division liste=
  44.     match liste with
  45.     |[]->[],[]
  46.     |a::[]->liste,[]
  47.     |a::b::c->
  48.         let (l1,l2)=division c in
  49.         a::l1,b::l2;;
  50. (* val division : 'a list -> 'a list * 'a list = <fun> *)
  51.  
  52. let rec fusion liste1 liste2=
  53.     match liste1,liste2 with
  54.     |[],_->liste2;
  55.     |_,[]->liste1;
  56.     |t1::q1,t2::q2->
  57.         if t1<t2 then
  58.             t1::(fusion q1 liste2)
  59.         else
  60.             t2::(fusion liste1 q2);;
  61. (* val fusion : 'a list -> 'a list -> 'a list = <fun> *)
  62.  
  63. let rec tri_fusion liste=
  64.     match liste with
  65.     |[]->[];
  66.     |a::[]->liste;
  67.     |_ ->
  68.         begin
  69.             let (liste1,liste2)=division liste in
  70.             fusion (tri_fusion(liste1)) (tri_fusion(liste2));
  71.         end;;
  72. (* val tri_fusion : 'a list -> 'a list = <fun> *)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement