JALLAT_DS2.ml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. type ensemble = int list;;
  2. (*Insérer dans un ensemble*)
  3. let rec insere x (e:ensemble) = match e with
  4. | [] -> [x]
  5. | t::q -> if t=x then e else t::(insere x q);;
  6. (*Evaluation de la complexité, en fonction du nombre d'éléments de E, ne prendra en compte*)
  7. (*que le nombre d'appels récursifs*)
  8. (*Complexité linéaire*)
  9. (*Recherche dans un ensemble*)
  10. let rec recherche x (e:ensemble) = match e with
  11. | [] -> false
  12. | t::q -> if t=x then true else recherche x q;;
  13. (*Exemples de valeurs pour x et e, tels que l'on soit dans le pire ou le meilleur des cas*)
  14. (*x = 1, e = [1;2;3;4;5;6;7;8;9;10]*)
  15. (*x = 11, e = [1;2;3;4;5;6;7;8;9;10]*)
  16. (*Complexité linéaire*)
  17. (*Nous travaillons avec des arbres binaires entiers*)
  18. (*Profondeur d'un arbre avec la profondeur du sous-arbre gauche, noté G, et la profondeur du sous-arbre*)
  19. (*droit, noté D*)
  20. (*Si l'arbre est l'arbre vide, alors sa profondeur est de zéro*)
  21. (*Sinon, c'est le maximum entre la profondeur du sous-arbre gauche et celle du droit, +1*)
  22. (*On définit un arbre binaire d'entiers, par le déséquilibre du noeud, son sous-fil gauche, l'étiquette associé*)
  23. (*à la racine, puis le sous-fil droit*)
  24. type arbre = Vide | Noeud of int * arbre * int * arbre;;
  25. let ex1 = Noeud(0,
  26. Noeud(-1,
  27. Vide,
  28. 9,
  29. Noeud(0,Vide,6,Vide)),
  30. 7,
  31. Noeud(1,
  32. Noeud(0,Vide,3,Vide),
  33. 8,
  34. Vide));;
  35. (*Troisième arbre de l'exemple II.3*)
  36. let ex3 = Noeud(-1, Noeud(0, Noeud(0, Vide, 1, Vide), 3, Noeud(0,Vide,4,Vide)), 6,
  37. Noeud(1,Noeud(-1,Vide,7,Noeud(0,Vide,8,Vide)),9,Noeud(0,Vide,10,Vide)));;
  38. let rec profondeur a = match a with
  39. | Vide -> 0
  40. | Noeud(_,g,_,d) -> 1 + max (profondeur g) (profondeur d);;
  41. profondeur ex1;;
  42. let rec valider_decoration a = match a with
  43. | Vide -> true
  44. | Noeud(deco,g,_,d) -> ((profondeur g) - (profondeur d)) = deco && valider_decoration g && valider_decoration d;;
  45. ;;
  46. valider_decoration ex1;;
  47. (*Estimation de la complexité, en fonction du nombre d'appels récursifs*)
  48. (*Complexité logarithmique*)
  49. (*On considère des arbres binaires de recherche*)
  50. (*Je crée une fonction auxiliaire racine, ce qui me permet d'observer la racine des sous-arbres*)
  51. (*On considère des entiers naturels strictement positifs, donc Vide ne renvoit rien*)
  52. let rec racine a = match a with
  53. | Vide -> failwith "Arbre vide"
  54. | Noeud(_,g,e,d) -> e;;
  55. racine ex1;;
  56. racine ex3;;
  57. let rec valider_abr a = match a with
  58. | Vide -> true
  59. | Noeud(_,Vide,_,Vide) -> true
  60. | Noeud(_,Vide,_,d) -> (racine d) > (racine a) && valider_abr d
  61. | Noeud(_,g,_,Vide) -> (racine g) < (racine a) && valider_abr g
  62. | Noeud(_,g,_,d) -> (racine g) < (racine a) && (racine d) > (racine a) && valider_abr g && valider_abr d;;
  63. valider_abr ex3;;
  64. let rec recherche_abr x a = match a with
  65. | Vide -> false
  66. | Noeud(_,g,e,d) -> if x=e then true else if x<e then recherche_abr x g else recherche_abr x d;;
  67. recherche_abr 1 ex3;;
  68. (*Exemples de valeurs de paramètres de x et a pour les meilleurs et pires cas*)
  69. (*x = 6, a = ex3*)
  70. (*x = 11, a = ex3*)
  71. (*Evaluation de la complexité, en fonction du nombre d'appels récursifs*)
  72. (*Complexité logarithmique*)
  73. (*Insertion dans un ABR*)
  74. (*Cette fonction doit calculer le nouveau déséquilibre pour les noeuds où il change*)
  75. let rec insere_abr x a = match a with
  76. | Vide -> Noeud(0,Vide,x,Vide)
  77. | Noeud(deco,g,e,d) -> if x=e then a else if x<e then Noeud(deco+1,insere_abr x g,e,d) else Noeud(deco-1,g,e,insere_abr x d);;
  78. insere_abr 11 ex3;;
  79. (*Exemples de valeurs de paramètres de x et a pour les meilleurs et pires cas*)
  80. (*x = 6, a = ex3*)
  81. (*x = 11, a = ex3*)
  82. (*Evaluation de la complexité, en fonction du nombre d'appels récursifs*)
  83. (*Complexité logarithmique*)
  84. (*Rotations d'un ABR*)
  85. (*Rotation simple de type D*)
  86. let rec rotationSD a = match a with
  87. | Vide -> failwith "Arbre vide"
  88. | Noeud(_,Vide,_,_) -> failwith "Rotation impossible"
  89. | Noeud(_,Noeud(_,Vide,_,_),_,_) -> failwith "Rotation impossible"
  90. | Noeud(_,Noeud(_,Noeud(_,Vide,_,_),_,_),_,_) -> failwith "Rotation impossible"
  91. | Noeud(_,Noeud(_,Noeud(_,g1,e1,d1),e2,d2),e3,d3) -> Noeud(0,g1,e1,Noeud(0,d1,e2,Noeud(0,d2,e3,d3)));;
  92. (*Rotation simple de type G*)
  93. let rec rotationSG a = match a with
  94. | Vide -> failwith "Arbre vide"
  95. | Noeud(_,_,_,Vide) -> failwith "Rotation impossible"
  96. | Noeud(_,_,_,Noeud(_,_,_,Vide)) -> failwith "Rotation impossible"
  97. | Noeud(_,_,_,Noeud(_,_,_,Noeud(_,_,_,Vide))) -> failwith "Rotation impossible"
  98. | Noeud(_,g3,e3,Noeud(_,g2,e2,Noeud(_,g1,e1,d1))) -> Noeud(0,Noeud(0,Noeud(0,g3,e3,g2),e2,g1),e1,d1);;
  99. (*Rotation double de type D*)
  100. let rec rotationDD a = match a with
  101. | Vide -> failwith "Arbre vide"
  102. | Noeud(_,Vide,_,_) -> failwith "Rotation impossible"
  103. | Noeud(_,Noeud(_,Vide,_,_),_,_) -> failwith "Rotation impossible"
  104. | Noeud(_,Noeud(_,Noeud(_,Vide,_,_),_,_),_,_) -> failwith "Rotation impossible"
  105. | Noeud(_,Noeud(_,Noeud(_,g1,e1,d1),e2,d2),e3,d3) -> Noeud(0,Noeud(0,g1,e1,Noeud(0,d1,e2,d2)),e3,d3);;
  106. (*Rotation double de type G*)
  107. let rec rotationDG a = match a with
  108. | Vide -> failwith "Arbre vide"
  109. | Noeud(_,_,_,Vide) -> failwith "Rotation impossible"
  110. | Noeud(_,_,_,Noeud(_,_,_,Vide)) -> failwith "Rotation impossible"
  111. | Noeud(_,_,_,Noeud(_,_,_,Noeud(_,_,_,Vide))) -> failwith "Rotation impossible"
  112. | Noeud(_,g3,e3,Noeud(_,g2,e2,Noeud(_,g1,e1,d1))) -> Noeud(0,Noeud(0,g3,e3,Noeud(0,g2,e2,d1)),e1,d1);;
  113. (*On considère des arbres qui sont en plus équilibrés*)
  114. (*Donner les différentes formes possibles pour le noeud déséquilibré le plus profond produit lors de*)
  115. (*l'insertion d'une nouvelle étiquette dans un arbre binaire équilibré en précisant la valeur du déséquilibre*)
  116. (*de ce noeud*)
  117. (*Equilibrage d'un arbre*)
  118. (*equilibrage a, a un abr dont la racine est déséquilibré, mais dont les sous-fils sont équilibrés*)
  119. let equilibrage a = match a with
  120. | Vide -> failwith "Arbre vide"
  121. | Noeud(_,Vide,_,_) -> failwith "Arbre équilibré"
  122. | Noeud(_,Noeud(_,Vide,_,_),_,_) -> failwith "Arbre équilibré"
  123. | Noeud(_,Noeud(_,Noeud(_,Vide,_,_),_,_),_,_) -> failwith "Arbre équilibré"
  124. | Noeud(_,Noeud(_,Noeud(_,g1,e1,d1),e2,d2),e3,d3) -> if (profondeur g1) > (profondeur d1) then rotationSD a else rotationDD a;;
  125. equilibrage ex3;;
  126. (*Insertion dans un ABR équilibré*)
  127. (*On réequilibre à chaque fois*)
  128. let rec insere_abr_equilibre x a = match a with
  129. | Vide -> Noeud(0,Vide,x,Vide)
  130. | Noeud(deco,g,e,d) -> if x=e then a
  131. else if x<e then equilibrage (Noeud(deco+1,insere_abr_equilibre x g,e,d))
  132. else equilibrage (Noeud(deco-1,g,e,insere_abr_equilibre x d));;