JALLAT_tas.ml 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. let ex1 = [|0;35;21; 27;15;13;14;9;5;2;7;1;6|];;
  2. let ex2 = [|35; 21; 27; 15; 13; 14; 9; 5; 2; 7; 1; 6|];;
  3. let est_tas t = let i = ref 0 and n = Array.length t in
  4. while (2* !i + 2)<n && t.(!i)>=t.(2 * !i + 1) && t.(!i)<= t.(2 * !i + 2) do
  5. i:= !i + 1
  6. done;
  7. (2* !i + 2) =n && t.(2 * !i +2)<= t.(!i)||(2* !i + 2) =n
  8. ;;
  9. est_tas ex1;;
  10. est_tas ex2;;
  11. let rec est_tas_aux t i n = match i with
  12. | i when 2 * i+2>n -> true
  13. | i when 2 * i +2 =n -> t.(2 * i + 2)<= t.(i)
  14. | _ -> t.(i)>=t.(2 * i + 1) && t.(i)<= t.(2 * i + 2) && est_tas_aux t (i+1) n
  15. ;;
  16. let est_tas_2 t = est_tas_aux t 0 (Array.length t);;
  17. est_tas_2 ex1;;
  18. est_tas_2 ex2;;
  19. let est_tas_3 t =
  20. let n = Array.length t in
  21. let i = ref (n-1) in
  22. while !i>0 && t.(!i)>=t.((!i-1)/2) do
  23. i:= !i - 1
  24. done;
  25. !i = 0
  26. ;;
  27. est_tas_3 ex1;;
  28. est_tas_3 ex2;;
  29. (*Recursif maintenant*)
  30. let rec est_tas_4_aux t i n = match i with
  31. | i when 2 * i+2>n -> true
  32. | i when 2 * i +2 =n -> t.(2 * i + 2)<= t.(i)
  33. | _ -> t.(i)>=t.(2 * i + 1) && t.(i)<= t.(2 * i + 2) && est_tas_4_aux t (i+1) n
  34. ;;
  35. let est_tas_4 t = est_tas_4_aux t 0 (Array.length t);;
  36. est_tas_4 ex1;;
  37. est_tas_4 ex2;;
  38. let swap t i j = let temp = t.(i) in
  39. t.(i)<-t.(j);
  40. t.(j)<-temp
  41. ;;
  42. let rec insere t k x = match k with
  43. | 0 -> t.(0)<-x
  44. | _ -> if x<t.((k-1)/2) then t.(k)<-x
  45. else
  46. begin
  47. (t.(k)<-t.((k-1)/2);
  48. insere t ((k-1)/2) x)
  49. end;
  50. ;;
  51. let rec insere2 t k x = let n = Array.length t in
  52. match k with
  53. | k when 2 * k+2>n -> t.(k)<-x
  54. | k when 2 * k+2 = n -> if x>=t.(2*k+1) then t.(k)<-x
  55. else
  56. begin
  57. t.(k)<-t.(2*k+1);
  58. t.(2*k+1)<-x
  59. end;
  60. | _ -> let m = if t.(2*k+1)>t.(2*k+2) then 2*k+1 else 2*k+2 in
  61. if x>=t.(m) then t.(k)<-x
  62. else insere2 t m x
  63. ;;
  64. let remontee_sommets t =
  65. for k = 1 to Array.length t - 1 do
  66. insere2 t k t.(k)
  67. done
  68. ;;
  69. let descente_peres t =
  70. let n = Array.length t in
  71. for k = n/2-1 downto 0 do
  72. percolation_descendante t n k
  73. done
  74. ;;
  75. type ('a,'b) sommet = {valeur : 'a; mutable priorite : 'b};;
  76. let sommet1_ex = {valeur = 1; priorite = 23};;
  77. sommet1_ex.priorite <- 24;;
  78. type ('a,'b) file_priorite = {mutable taille : int; tab : ('a,'b) sommet array};;
  79. let n = 10;;
  80. let creer_file_vide (v,p) =
  81. {taille = 0; tab = Array.make n {valeur = v; priorite = p}}
  82. ;;
  83. (*Ajout d'un élément dans la file de priorité*)
  84. let ajoute f (v,p) =
  85. let n = Array.length f.tab in
  86. if f.taille = n then failwith "File pleine"
  87. else
  88. begin
  89. f.tab.(f.taille)<-{valeur = v; priorite = p};
  90. f.taille<-f.taille+1;
  91. remontee_sommets f.tab
  92. end
  93. ;;
  94. (*Suppression du sommet de priorité maximale*)
  95. let supprime_max f =
  96. if f.taille = 0 then failwith "File vide"
  97. else
  98. begin
  99. let max = f.tab.(0) in
  100. f.tab.(0)<-f.tab.(f.taille-1);
  101. f.taille<-f.taille-1;
  102. descente_peres f.tab;
  103. max
  104. end
  105. ;;
  106. (*Augmentation de la priorité d'un élément dans la file*)
  107. let augmente_priorite f i p =
  108. if i<0 || i>=f.taille then failwith "Indice incorrect"
  109. else
  110. begin
  111. f.tab.(i).priorite<-p;
  112. remontee_sommets f.tab
  113. end
  114. ;;