dm2.ml 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. type arbre_bin =
  2. | Vide
  3. | Noeud of int * arbre_bin * arbre_bin
  4. ;;
  5. let bornesup = 1000000;;
  6. let borneinf = -1000000;;
  7. let ex1 =
  8. Noeud (
  9. 34,
  10. Noeud (
  11. 30,
  12. Noeud (18, Noeud (10, Vide, Vide), Noeud (8, Vide, Vide)),
  13. Noeud (20, Noeud (11, Vide, Vide), Noeud (14, Vide, Vide))
  14. ),
  15. Noeud (32, Noeud (30, Vide, Vide), Noeud (26, Vide, Vide))
  16. )
  17. ;;
  18. let etiquette f =
  19. match f with
  20. | Vide -> failwith "rien"
  21. | Noeud (n, _, _) -> n
  22. ;;
  23. let rec test_file f =
  24. match f with
  25. | Vide -> true
  26. | Noeud (n, g, d) ->
  27. if
  28. n >= etiquette g
  29. && n >= etiquette d
  30. && test_file g
  31. && test_file d
  32. then
  33. true
  34. else
  35. false
  36. ;;
  37. let rec echange_etiquette f x = match f with
  38. | Vide -> Vide
  39. | Noeud(_,g,d)->Noeud(x,g,d)
  40. ;;
  41. let rec percolation arbre =
  42. match arbre with
  43. | Vide -> Vide
  44. | Noeud (n, Vide, Vide) -> Noeud (n, Vide, Vide)
  45. | Noeud (n, g, d) ->
  46. let plus_grand_fils =
  47. if etiquette g >= etiquette d then
  48. g
  49. else
  50. d
  51. in
  52. if etiquette plus_grand_fils > n then
  53. Noeud (etiquette plus_grand_fils, percolation (echange_etiquette g n), d)
  54. else
  55. Noeud (n, percolation g, d)
  56. ;;
  57. let rec supp_feuille arbre =
  58. match arbre with
  59. | Vide -> failwith "Impossible de supprimer une feuille d'un arbre vide"
  60. | Noeud (n, Vide, Vide) -> Vide, n
  61. | Noeud (n, g, Vide) ->
  62. let nouveau_g, feuille_supprimee = supp_feuille g in
  63. Noeud (n, nouveau_g, Vide), feuille_supprimee
  64. | Noeud (n, Vide, d) ->
  65. let nouveau_d, feuille_supprimee = supp_feuille d in
  66. Noeud (n, Vide, nouveau_d), feuille_supprimee
  67. | Noeud (n, g, d) ->
  68. let nouveau_g, feuille_supprimee = supp_feuille g in
  69. Noeud (n, nouveau_g, d), feuille_supprimee
  70. ;;
  71. let supp_racine arbre =
  72. match arbre with
  73. | Vide -> failwith "Impossible de supprimer la racine d'un arbre vide"
  74. | Noeud (n, gauche, droit) ->
  75. let nouvel_arbre = echange_etiquette arbre (etiquette (fst (supp_feuille arbre))) in
  76. percolation nouvel_arbre
  77. ;;
  78. let rec insere x arbre = match arbre with
  79. | Vide -> Noeud(x,Vide,Vide)
  80. | Noeud(r,g,d)-> if x > r then
  81. begin
  82. let rand = Random.int 2 in
  83. if rand = 0 then Noeud(x,insere r g,d)
  84. else Noeud(x,g,insere r d)
  85. end
  86. else
  87. begin
  88. let rand = Random.int 2 in
  89. if rand = 0 then Noeud(r,insere x g,d)
  90. else Noeud(r,g,insere x d)
  91. end
  92. ;;
  93. let rec file_of_liste l = match l with
  94. | [] -> Vide
  95. | t::q-> insere t (file_of_liste q)
  96. ;;
  97. let rec arbre_de_tas_aux i tas = match i>= Array.length tas with
  98. | true -> Vide
  99. | false ->
  100. let x = tas.(i) in
  101. let sous_arbre_gauche = arbre_de_tas_aux (2*i +1) tas in
  102. let sous_arbre_droite = arbre_de_tas_aux (2*i + 2) tas in
  103. Noeud(x,sous_arbre_gauche,sous_arbre_droite)
  104. ;;
  105. let arbre_de_tas tas = arbre_de_tas_aux 0 tas;;
  106. let rec taille arbre = match arbre with
  107. | Vide -> 0
  108. | Noeud(_,g,d)-> 1 + taille g + taille d
  109. ;;
  110. let rec taille arbre =
  111. match arbre with
  112. | Vide -> 0
  113. | Noeud(_, g, d) -> 1 + taille g + taille d
  114. ;;
  115. let rec tas_d_arbre_aux i arbre tas =
  116. match arbre with
  117. | Vide -> ()
  118. | Noeud(x, g, d) ->
  119. tas.(i) <- x;
  120. tas_d_arbre_aux (2 * i + 1) g tas;
  121. tas_d_arbre_aux (2 * i + 2) d tas
  122. ;;
  123. let tas_d_arbre arbre =
  124. let n = taille arbre in
  125. let tas = Array.make n 0 in
  126. tas_d_arbre_aux 0 arbre tas;
  127. ;;
  128. let est_valide_valeur v gauche droite n tas =
  129. if gauche < n && tas.(gauche) > v then
  130. false
  131. else if droite < n && tas.(droite) > v then
  132. false
  133. else
  134. true
  135. ;;
  136. let rec est_tas i n tas =
  137. if i >= n then
  138. true
  139. else
  140. let gauche = 2 * i + 1 in
  141. let droite = 2 * i + 2 in
  142. let v = tas.(i) in
  143. est_valide_valeur v gauche droite n tas && est_tas gauche n tas && est_tas droite n tas
  144. ;;
  145. let verification_tas tas =
  146. let n = Array.length tas in
  147. est_tas 0 n tas
  148. ;;
  149. let echange t i j =
  150. let aux = t.(i) in
  151. t.(i)<-t.(j);
  152. t.(j)<-aux
  153. ;;
  154. let rec remonter_aux i t =
  155. if i = 0 || t.(i) <= t.((i - 1) / 2) then
  156. ()
  157. else
  158. let parent = (i - 1) / 2 in
  159. let temp = t.(i) in
  160. t.(i) <- t.(parent);
  161. t.(parent) <- temp;
  162. remonter_aux parent t
  163. ;;
  164. let remonter n t =
  165. remonter_aux n t
  166. ;;
  167. let insertion x t =
  168. let n = Array.length t in
  169. t.(n)<-x;
  170. remonter n t;
  171. ;;
  172. let creation_tab t =
  173. let resultat = Array.make 100 (-1) in
  174. for i = 0 to Array.length t -1 do
  175. insertion t.(i) resultat
  176. done;
  177. ;;
  178. let fils_max k t =
  179. let fg = 2 * k + 1 in
  180. let fd = 2 * k + 2 in
  181. let n = Array.length t in
  182. if fg < n && fd < n then
  183. if t.(fg) > t.(fd) then
  184. fg
  185. else
  186. fd
  187. else if fg < n then
  188. fg
  189. else
  190. k
  191. ;;
  192. let rec descente_aux k n t=
  193. let max_child_index = fils_max k t in
  194. if max_child_index < n && t.(max_child_index) > t.(k) then
  195. begin
  196. let temp = t.(k) in
  197. t.(k) <- t.(max_child_index);
  198. t.(max_child_index) <- temp;
  199. descente_aux max_child_index n t
  200. end
  201. ;;
  202. let descente t =
  203. let n = Array.length t in
  204. descente_aux 0 n t
  205. ;;
  206. let suppression t =
  207. let n = Array.length t in
  208. if n > 0 then begin
  209. t.(0) <- t.(n - 1);
  210. descente (Array.sub t 0 (n - 1))
  211. end
  212. ;;
  213. let tri_tas t =
  214. let n = Array.length t in
  215. let resultat = Array.make n 0 in
  216. for i = 0 to n - 1 do
  217. insertion t.(i) resultat
  218. done;
  219. for i = 0 to n - 1 do
  220. suppression resultat
  221. done;
  222. for i = 0 to n - 1 do
  223. t.(i) <- resultat.(i)
  224. done
  225. ;;