Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (* Type *)
- type 'a element = 'a;;
- (* Type Arbre 2-3-4 *)
- type ab234 = Vide234 | Noeud1 of ((int element)) * ab234 * ab234
- | Noeud2 of ((int element) * (int element)) * ab234 * ab234 * ab234
- | Noeud3 of ((int element) * (int element) * (int element)) * ab234 * ab234 * ab234 * ab234;;
- (* Type Arbre Bicolore *)
- type couleur = Rouge | Noir | DoubleNoir;;
- type ab = Videbic | VideNoir | Noeud of couleur * int element * ab * ab;;
- (* Fonctions de transformations abic <=> a234 *)
- (* Arbre d'exemple *)
- let arbrebic = Noeud(Noir,5,
- Noeud(Noir,2, Videbic, Videbic),
- Noeud(Rouge,14,
- Noeud(Noir,13, Videbic, Videbic),
- Noeud(Noir,20,
- Noeud(Rouge,16, Videbic, Videbic),
- Noeud(Rouge,21, Videbic, Videbic))));;
- (* abic -> a234 *)
- let rec abic_vers_a234 a =
- match a with
- | Videbic -> Vide234
- | Noeud(Noir, e2, Noeud(Rouge, e1, b1, b2), Noeud(Rouge, e3, b3, b4)) -> Noeud3((e1, e2, e3), (abic_vers_a234 b1),
- (abic_vers_a234 b2),
- (abic_vers_a234 b3),
- (abic_vers_a234 b4))
- | Noeud(Noir, e2, Noeud(Rouge, e1, b1, b2), b3) -> Noeud2((e1, e2), (abic_vers_a234 b1),
- (abic_vers_a234 b2),
- (abic_vers_a234 b3))
- | Noeud(Noir, e1, b1, Noeud(Rouge, e2, b2, b3)) -> Noeud2((e1, e2), (abic_vers_a234 b1),
- (abic_vers_a234 b2),
- (abic_vers_a234 b3))
- | Noeud(Noir, e, b1, b2) -> Noeud1((e), (abic_vers_a234 b1), (abic_vers_a234 b2))
- | _ -> failwith"";;
- (* Test *)
- let arbre234 = (abic_vers_a234 arbrebic);;
- (* a234 -> abic *)
- let rec a234_vers_abic a =
- match a with
- | Vide234 -> Videbic
- | Noeud1((e), a1, a2) -> Noeud(Noir, e, (a234_vers_abic a1), (a234_vers_abic a2))
- | Noeud2((e1, e2), a1, a2, a3) -> Noeud(Noir, e2,
- Noeud(Rouge, e1, (a234_vers_abic a1), (a234_vers_abic a2)), (a234_vers_abic a3))
- | Noeud3((e1, e2, e3), a1, a2, a3, a4) -> Noeud(Noir, e2,
- Noeud(Rouge, e1, (a234_vers_abic a1), (a234_vers_abic a2)),
- Noeud(Rouge, e3, (a234_vers_abic a3), (a234_vers_abic a4)));;
- (* Test *)
- let arbrebic2 = (a234_vers_abic arbre234);;
- (* -------------------------------- Insertion a234 *)
- (* -------------------------------- Fonction temporaire pour usurper *)
- (* foncteur/module *)
- let est_plus_petit a b = a < b;;
- let inf = est_plus_petit;;
- let eq a b = not (est_plus_petit a b) && not (est_plus_petit b a);;
- (* Prend la direction vers l'élément e dans l'arbre *)
- let get_direction e = function
- | Noeud1((x), _, _) | Noeud2((x, _), _, _, _) | Noeud3((x, _, _), _, _, _, _) when (inf e x) -> 1
- | Noeud1((x), _, _) when (inf x e) -> 2
- | Noeud2((x, y), _, _, _) | Noeud3((x, y, _), _, _, _, _) when (inf x e) && (inf e y) -> 2
- | Noeud2((x, y), _, _, _) when (inf y e) -> 3
- | Noeud3((x, y, z), _, _, _, _) when (inf y e) && (inf e z) -> 3
- | Noeud3((x, y, z), _, _, _, _) when (inf z e) -> 4
- (* e présent dans les étiquettes *)
- | _ -> 0;;
- (* Remplace le fils dans la direction "dir" par l'arbre "t", si la *)
- (* direction existe *)
- let set_subtree dir t = function
- | Vide234 -> failwith "error set_subtree1"
- | Noeud1(e, a, b) ->
- (match dir with
- | 1 -> Noeud1(e, t, b)
- | 2 -> Noeud1(e, a, t)
- | _ -> failwith "error set_subtree2")
- | Noeud2(e, a, b, c) ->
- (match dir with
- | 1 -> Noeud2(e, t, b, c)
- | 2 -> Noeud2(e, a, t, c)
- | 3 -> Noeud2(e, a, b, t)
- | _ -> failwith "error set_subtree3")
- | Noeud3(e, a, b, c, d) ->
- (match dir with
- | 1 -> Noeud3(e, t, b, c, d)
- | 2 -> Noeud3(e, a, t, c, d)
- | 3 -> Noeud3(e, a, b, t, d)
- | 4 -> Noeud3(e, a, b, c, t)
- | _ -> failwith "error set_subtree4");;
- (* Retourne le fils dans la direction "dir" si il existe *)
- let get_subtree dir = function
- | Vide234 -> failwith "error get_subtree1"
- | Noeud1((_), a, b) ->
- (match dir with
- | 1 -> a
- | 2 -> b
- | _ -> failwith "error get_subtree2")
- | Noeud2((_), a, b, c) ->
- (match dir with
- | 1 -> a
- | 2 -> b
- | 3 -> c
- | _ -> failwith "error get_subtree3")
- | Noeud3((_), a, b, c, d) ->
- (match dir with
- | 1 -> a
- | 2 -> b
- | 3 -> c
- | 4 -> d
- | _ -> failwith "error get_subtree4");;
- let is_present e t =
- let rec aux t =
- match t, (get_direction e t) with
- | Vide234, _ -> false
- | _, 0 -> true
- | _, dir -> aux (get_subtree dir t)
- in aux t
- ;;
- let third (a,b,c) = c;;
- (* Gestion des explosions *)
- let a234_explode dir t =
- match dir, t with
- | 1, Noeud1((e1), Noeud3((e2, e3, e4), a1, a2, a3, a4), a5) ->
- (true, 2, Noeud2((e3, e1), Noeud1((e2), a1, a2), Noeud1((e4), a3, a4), a5))
- | 2, Noeud1((e1), a1, Noeud3((e2, e3, e4), a2, a3, a4, a5)) ->
- (true, 3, Noeud2((e1, e3), a1, Noeud1((e2), a2, a3), Noeud1((e4), a4, a5)))
- | 1, Noeud2((e1, e2), Noeud3((e3, e4, e5), a3, a4, a5, a6), a1, a2) ->
- (true, 1, Noeud3((e4, e1, e2), Noeud1((e3), a3, a4), Noeud1((e5), a5, a6), a1, a2))
- | 2, Noeud2((e1, e2), a1, Noeud3((e3, e4, e5), a3, a4, a5, a6), a2) ->
- (true, 3, Noeud3((e1, e4, e2), a1, Noeud1((e3), a3, a4), Noeud1((e5), a5, a6), a2))
- | 3, Noeud2((e1, e2), a1, a2, Noeud3((e3, e4, e5), a3, a4, a5, a6)) ->
- (true, 4, Noeud3((e1, e2, e4), a1, a2, Noeud1((e3), a3, a4), Noeud1((e5), a5, a6)))
- | _, _ -> (false, dir, t);;
- let root t =
- match t with
- | Noeud3((e1, e2, e3), a1, a2, a3, a4) ->
- (Noeud1((e2), Noeud1((e1), a1, a2), Noeud1((e3), a3, a4)))
- | _ -> t;;
- (* Gestion insertion *)
- let a234_insert x t =
- match is_present x t with
- | true -> t
- | false ->
- let rec aux x = function
- | Vide234 -> Noeud1((x), Vide234, Vide234)
- | Noeud1((y), Vide234, Vide234) as t when (eq y x) -> t
- | Noeud1((y), Vide234, Vide234) when (inf y x) -> Noeud2((y, x), Vide234, Vide234, Vide234)
- | Noeud1((y), Vide234, Vide234) when (inf x y) -> Noeud2((x, y), Vide234, Vide234, Vide234)
- | Noeud2((y1, y2), Vide234, Vide234, Vide234) as t when (eq x y1) || (eq x y2) -> t
- | Noeud2((y1, y2), Vide234, Vide234, Vide234) when (inf x y1) -> Noeud3((x, y1, y2), Vide234, Vide234, Vide234, Vide234)
- | Noeud2((y1, y2), Vide234, Vide234, Vide234) when (inf x y2) -> Noeud3((y1, x, y2), Vide234, Vide234, Vide234, Vide234)
- | Noeud2((y1, y2), Vide234, Vide234, Vide234) -> Noeud3((y1, y2, x), Vide234, Vide234, Vide234, Vide234)
- | _ as tt ->
- let dir = get_direction x tt in
- if dir = 0 then
- tt
- else
- let (flag, new_dir, exploded) = a234_explode dir tt in
- if flag then
- (aux x exploded)
- else
- (set_subtree new_dir (aux x (get_subtree new_dir exploded)) exploded)
- in aux x (root t);;
- (* Test *)
- let test =
- let rec aux t i =
- let ii = (Random.int 20) in
- print_string "ii: "; print_int ii;print_string "\n";
- if i > 20 then
- t
- else
- aux (a234_insert ii t) (i +1)
- in aux Vide234 0;;
- (* -------------------------------- Suppression a234 *)
- (* -------------------------------- *)
- (* Outils *)
- let is_vide = function
- | Vide234 -> true
- | _ -> false;;
- let get_element_at_i i t =
- match i, t with
- | 1, Noeud3((e1,e2,e3), _,_,_,_) -> e1
- | 2, Noeud3((e1,e2,e3), _,_,_,_) -> e2
- | 3, Noeud3((e1,e2,e3), _,_,_,_) -> e3
- | 1, Noeud2((e1,e2), _,_,_) -> e1
- | 2, Noeud2((e1,e2), _,_,_) -> e2
- | _ -> failwith "yolo";;
- (* Retourne le maximum, et l'arbre maximum exclu d'un arbre *)
- let get_max = function
- | Vide234 -> failwith "error get_max"
- | Noeud1((x), a, b) -> (x, b, a)
- | Noeud2((x, y), a, b, c) -> (y, c, Noeud1((x), a, b))
- | Noeud3((x, y, z), a, b, c, d) -> (z, d, Noeud2((x, y), a, b, c));;
- (* Retourne le minimum, et l'arbre minimum exclu d'un arbre *)
- let get_min = function
- | Vide234 -> failwith "error get_min"
- | Noeud1((x), a, b) -> (x, a, b)
- | Noeud2((x, y), a, b, c) -> (x, a, Noeud1((y), b, c))
- | Noeud3((x, y, z), a, b, c, d) -> (x, a, Noeud2((y, z), b, c, d));;
- (* Passe le maximum du frère gauche de la cible sur celle-ci + : Avec les *)
- (* sous enfants gérés *)
- let pop_from_left (maxE, maxA, remain) origin = function
- | Noeud1((x), a, Noeud1((b), e, f)) ->
- Noeud1((maxE), remain, Noeud2((x, b), maxA, e, f))
- | Noeud2(_, _, _, _) as t ->
- (match origin, t with
- | 1, Noeud2((x, y), a, Noeud1((b), e, f), c) ->
- Noeud2((maxE, y), remain, Noeud2((x, b), maxA, e, f), c)
- | 2, Noeud2((x, y), a, b, Noeud1((c), e, f)) ->
- Noeud2((x, maxE), a, remain, Noeud2((y, c), maxA, e, f))
- | _, _ -> failwith "error pop_from_left1")
- | Noeud3(_, _, _, _, _) as t ->
- (match origin, t with
- | 1, Noeud3((x, y, z), a, Noeud1((b), e, f), c, d) ->
- Noeud3((maxE, y, z), remain, Noeud2((x, b), maxA, e, f), c, d)
- | 2, Noeud3((x, y, z), a, b, Noeud1((c), e, f), d) ->
- Noeud3((x, maxE, z), a, remain, Noeud2((y, c), maxA, e, f), d)
- | 3, Noeud3((x, y, z), a, b, c, Noeud1((d), e, f)) ->
- Noeud3((x, y, maxE), a, b, remain, Noeud2((z, d), maxA, e, f))
- | _, _ -> failwith "pop_from_left2")
- | _ -> failwith "pop_from_left3";;
- (* Passe le minimum du frère droit de la cible sur celle-ci + : Avec les *)
- (* sous enfants gérés *)
- let pop_from_right (minE, minA, remain) origin = function
- | Noeud1((x), Noeud1((a), e, f), b) ->
- Noeud1((minE), Noeud2((a, x), e, f, minA), remain)
- | Noeud2(_, _, _, _) as t ->
- (match origin, t with
- | 2, Noeud2((x, y), Noeud1((a), e, f), b, c) ->
- Noeud2((minE, y), Noeud2((a, x), e, f, minA), remain, c)
- | 3, Noeud2((x, y), a, Noeud1((b), e, f), c) ->
- Noeud2((x, minE), a, Noeud2((b, y), e, f, minA), remain)
- | _, _ -> failwith "error pop_from_right1")
- | Noeud3(_, _, _, _, _) as t ->
- (match origin, t with
- | 2, Noeud3((x, y, z), Noeud1((a), e, f), b, c, d) ->
- Noeud3((minE, y, z), Noeud2((a, x), e, f, minA), remain, c, d)
- | 3, Noeud3((x, y, z), a, Noeud1((b), e, f), c, d) ->
- Noeud3((x, minE, z), a, Noeud2((b, y), e, f, minA), remain, d)
- | 4, Noeud3((x, y, z), a, b, Noeud1((c), e, f), d) ->
- Noeud3((x, y, minE), a, b, Noeud2((c, z), e, f, minA), remain)
- | _, _ -> failwith "pop_from_right2")
- | _ -> failwith "pop_from_right3";;
- (* Retourne le nombre d'enfant d'un arbre *)
- let nbChild = function
- | Vide234 -> 0
- | Noeud1(_, _, _) -> 2
- | Noeud2(_, _, _, _) -> 3
- | Noeud3(_, _, _, _, _) -> 4;;
- (* Retourne le nombre d'élément d'un arbre *)
- let nbElem a = (nbChild a) - 1;;
- (* Retourne si un frère à plus d'un élément existe, et sa position *)
- let closest_brother source tree =
- let rec aux source add =
- let iright = source + add and ileft = source - add in
- if iright <= (nbChild tree) && (nbElem (get_subtree iright tree)) > 1 then
- (true, iright)
- else if ileft >= 1 && (nbElem (get_subtree ileft tree)) > 1 then
- (true, ileft)
- else
- if (iright +1 > (nbChild tree) && (ileft +1) < 1) then
- (false, 0)
- else
- aux source (add +1)
- in
- aux source 1;;
- let setup_dir2 dir t =
- match (get_subtree dir t) with
- | Noeud1(_, _, _) ->
- let (found, i_brother) = closest_brother dir t in
- (* Au mois un sous arbre n'est pas Noeud1 *)
- if found then
- let rec aux i_brother last_t =
- if i_brother = dir then
- (dir, last_t)
- else
- if i_brother < dir then
- let maxs = get_max (get_subtree i_brother last_t) in
- let new_t = (pop_from_left maxs i_brother last_t) in
- aux (i_brother + 1) new_t
- else
- let mins = get_min (get_subtree i_brother last_t) in
- let new_t = (pop_from_right mins i_brother last_t) in
- aux (i_brother -1) new_t
- in aux i_brother t
- else
- (* Cas des enfants Noeud1 *)
- (match t with
- | Noeud2((e1, e2), Noeud1((e3), a, b), Noeud1((e4), c, d), Noeud1((e5), e, f)) ->
- (match dir with
- | 1 | 2 -> (1, Noeud1((e2), Noeud3((e3, e1, e4), a, b, c, d), Noeud1((e5), e, f)))
- (* 2, 3 *)
- | _ -> (2, Noeud1((e1), Noeud1((e3), a, b), Noeud3((e4, e2, e5), c, d, e, f)))
- )
- | Noeud3((e1, e2, e3), Noeud1((e4), a, b), Noeud1((e5), c, d), Noeud1((e6), e, f), Noeud1((e7), g, h)) ->
- (match dir with
- | 1 -> (1, Noeud2((e2, e3), Noeud3((e4, e1, e5), a, b, c, d), Noeud1((e6), e, f), Noeud1((e7), g, h)))
- | 4 -> (3, Noeud2((e1, e2), Noeud1((e4), a, b), Noeud1((e5), c, d), Noeud3((e6, e3, e7), e, f, g, h)))
- (* 2, 3 *)
- | _ -> (2, Noeud2((e1, e3), Noeud1((e4), a, b), Noeud3((e5, e2, e6), c, d, e, f), Noeud1((e7), g, h))))
- | _ -> failwith "error setup_dir"
- )
- | _ -> (dir, t);;
- (* Prépare une direction à la fonction de suppression -> Fait en sorte que *)
- (* la racine de la direction est + d'un élément *)
- let setup_dir dir t =
- match (get_subtree dir t) with
- | Noeud1(_, _, _) ->
- let (found, i_brother) = closest_brother dir t in
- (* Au mois un sous arbre n'est pas Noeud1 *)
- if found then
- let rec aux i_brother last_t =
- if i_brother = dir then
- (dir, last_t)
- else
- if i_brother < dir then
- let maxs = get_max (get_subtree i_brother last_t) in
- let new_t = (pop_from_left maxs i_brother last_t) in
- aux (i_brother + 1) new_t
- else
- let mins = get_min (get_subtree i_brother last_t) in
- let new_t = (pop_from_right mins i_brother last_t) in
- aux (i_brother -1) new_t
- in aux i_brother t
- else
- (* Cas des enfants Noeud1 *)
- (match t with
- | Noeud2((e1, e2), Noeud1((e3), a, b), Noeud1((e4), c, d), Noeud1((e5), e, f)) ->
- (match dir with
- | 1 -> (1, Noeud1((e2), Noeud3((e3, e1, e4), a, b, c, d), Noeud1((e5), e, f)))
- (* 2, 3 *)
- | _ -> (2, Noeud1((e1), Noeud1((e3), a, b), Noeud3((e4, e2, e5), c, d, e, f)))
- )
- | Noeud3((e1, e2, e3), Noeud1((e4), a, b), Noeud1((e5), c, d), Noeud1((e6), e, f), Noeud1((e7), g, h)) ->
- (match dir with
- | 1 -> (1, Noeud2((e2, e3), Noeud3((e4, e1, e5), a, b, c, d), Noeud1((e6), e, f), Noeud1((e7), g, h)))
- | 4 -> (3, Noeud2((e1, e2), Noeud1((e4), a, b), Noeud1((e5), c, d), Noeud3((e6, e3, e7), e, f, g, h)))
- (* 2, 3 *)
- | _ -> (2, Noeud2((e1, e3), Noeud1((e4), a, b), Noeud3((e5, e2, e6), c, d, e, f), Noeud1((e7), g, h))))
- | _ -> failwith "error setup_dir"
- )
- | _ -> (dir, t);;
- (* Récupère le minimum de l'arbre t, tout en raffinant pour garder l'arbre *)
- (* parfait *)
- let rec find_min t =
- let pop_min = function
- | Noeud2((x, y), Vide234, Vide234, Vide234) -> (x, Noeud1((y), Vide234, Vide234))
- | Noeud3((x, y, z), Vide234, Vide234, Vide234, Vide234) -> (x, Noeud2((y, z), Vide234, Vide234, Vide234))
- | _ -> failwith "error find_min" in
- let left_tree = get_subtree 1 t in
- if (is_vide left_tree) then
- let (min, new_current) = (pop_min t) in
- (min, new_current)
- else
- (* new_dir inutile *)
- let (new_dir, new_racine) = (setup_dir 1 t) in
- let (min, new_left) = find_min (get_subtree 1 new_racine) in
- (min, (set_subtree 1 new_left new_racine));;
- let rec find_max t =
- let pop_max = function
- | Noeud2((x, y), Vide234, Vide234, Vide234) -> (y, Noeud1((x), Vide234, Vide234))
- | Noeud3((x, y, z), Vide234, Vide234, Vide234, Vide234) -> (z, Noeud2((x, y), Vide234, Vide234, Vide234))
- | _ -> failwith "error find_max" in
- let right_tree = get_subtree (nbChild t) t in
- if (is_vide right_tree) then
- let (max, new_current) = (pop_max t) in
- (max, new_current)
- else
- (* new_dir inutile *)
- let (new_dir, new_racine) = (setup_dir (nbChild t) t) in
- let (max, new_left) = find_max (get_subtree (nbChild new_racine) new_racine) in
- (max, (set_subtree (nbChild new_racine) new_left new_racine));;
- let rec setup_root dir t =
- match dir, t with
- | _, Noeud1((e1), Noeud1((e2), a1, a2), Noeud1((e3), a3, a4)) ->
- Noeud3((e2, e1, e3), a1, a2, a3, a4)
- | 0, Noeud1(_, Vide234, Vide234) -> Vide234
- | 0, Noeud1((e1), Noeud2((e2, e3), a1, a2, a3), Noeud1((e4), a4, a5)) -> Noeud1((e3), Noeud1((e2), a1, a2), Noeud2((e1, e4), a3, a4, a5))
- | 0, Noeud1(_, a, b) -> t
- | _, Noeud1((e1), a, b) ->
- let (new_dir, new_root ) = setup_dir dir t in new_root
- | _, _ -> t
- ;;
- let noeud2_eq_x t =
- match t with
- | Noeud2((e1,e2), a1, (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_) as a2), a3) ->
- let (min, new_sub) = find_min a2 in Noeud2((min, e2),a1 , new_sub,a3)
- |Noeud2((e1,e2),(Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_) as a1), (Noeud1(_,_,_) as a2), (Noeud1(_,_,_) as a3)) ->
- let (max, new_sub) = find_max a1 in Noeud2((max, e2), new_sub, a2, a3)
- |Noeud2((e1,e2),(Noeud1(_,_,_)), (Noeud1(_,_,_)), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_))) ->
- let (new_dir, new_t) = setup_dir 2 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud2((min,(get_element_at_i 2 new_t)), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t))
- | Noeud2((e1,e2),(Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), (Noeud1(_,_,_)), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_))) ->
- let (new_dir, new_t) = setup_dir 1 t in
- let ou_chercher_max = (get_subtree new_dir new_t) in
- let (max, new_sub) = (find_max ou_chercher_max ) in
- Noeud2((max,(get_element_at_i 2 new_t)), new_sub, (get_subtree 2 new_t), (get_subtree 3 new_t))
- |_ ->failwith "error noeud2_eq_x";;
- let noeud2_eq_y t=
- match t with
- | Noeud2((e1,e2), a1, a2, (Noeud2(_,_,_,_) as a3)) ->
- let (min, new_sub) = find_min a3 in Noeud2((e1, min), a1, a2,new_sub)
- | Noeud2((e1,e2), a1, a2, _) ->
- let (new_dir, new_t) = setup_dir 2 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud2(((get_element_at_i 1 new_t), min), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t))
- | _ -> failwith "noeud2_eq_y";;
- let noeud3_eq_x t =
- match t with
- | Noeud3((e1,e2,e3), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_) as a1), a2,a3, a4) ->
- let (max, new_sub) = find_max a1 in Noeud3((max, e2, e3), new_sub, a2,a3,a4)
- | Noeud3((e1,e2,e3), a1, a2, a3, a4) ->
- let (new_dir, new_t) = setup_dir 2 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud3((min,(get_element_at_i 2 new_t), (get_element_at_i 3 new_t)), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t), (get_subtree 4 new_t) )
- | _ -> failwith "error noeud3_eq_x";;
- let noeud3_eq_y t =
- match t with
- | Noeud3((e1,e2,e3), a1, a2, (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_) as a3), a4) ->
- let (min, new_sub) = find_min a3 in Noeud3((e1, min, e3), a1, a2,new_sub,a4)
- |Noeud3((e1,e2,e3), Noeud1(_,_,_), Noeud1(_,_,_), Noeud1(_,_,_) ,(Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_))) ->
- let (new_dir, new_t) = setup_dir 3 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud3(((get_element_at_i 1 new_t), min, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), (get_subtree 2 new_t), new_sub, (get_subtree 4 new_t) )
- | Noeud3((e1,e2,e3),(Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), Noeud1(_,_,_),( Noeud1(_,_,_))) ->
- let (new_dir, new_t) = setup_dir 2 t in
- let ou_chercher_max = (get_subtree new_dir new_t) in
- let (max, new_sub) = (find_max ou_chercher_max ) in
- Noeud3(((get_element_at_i 1 new_t), max, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t), (get_subtree 4 new_t))
- | Noeud3((e1,e2,e3),(Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), Noeud1(_,_,_), Noeud1(_,_,_), (Noeud1(_,_,_))) ->
- let (new_dir, new_t) = setup_dir 2 t in
- let ou_chercher_max = (get_subtree new_dir new_t) in
- let (max, new_sub) = (find_max ou_chercher_max ) in
- Noeud3(((get_element_at_i 1 new_t), max, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t), (get_subtree 4 new_t))
- | Noeud3((e1,e2,e3), Noeud1(_,_,_), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), Noeud1(_,_,_), (Noeud1(_,_,_))) ->
- let (new_dir, new_t) = setup_dir 2 t in
- let ou_chercher_max = (get_subtree new_dir new_t) in
- let (max, new_sub) = (find_max ou_chercher_max ) in
- Noeud3(((get_element_at_i 1 new_t), max, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t), (get_subtree 4 new_t))
- | Noeud3((e1,e2,e3), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), Noeud1(_,_,_), Noeud1(_,_,_), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_))) ->
- let (new_dir, new_t) = setup_dir 3 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud3(((get_element_at_i 1 new_t), min, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), (get_subtree 2 new_t), new_sub, (get_subtree 4 new_t) )
- | Noeud3((e1,e2,e3), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), Noeud1(_,_,_), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_))) ->
- let (new_dir, new_t) = setup_dir 3 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud3(((get_element_at_i 1 new_t), min, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), (get_subtree 2 new_t), new_sub, (get_subtree 4 new_t) )
- | Noeud3((e1,e2,e3), Noeud1(_,_,_),(Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_)), Noeud1(_,_,_), (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_))) ->
- let (new_dir, new_t) = setup_dir 3 t in
- let ou_chercher_min = (get_subtree new_dir new_t) in
- let (min, new_sub) = (find_min ou_chercher_min ) in
- Noeud3(((get_element_at_i 1 new_t), min, (get_element_at_i 3 new_t)), (get_subtree 1 new_t), (get_subtree 2 new_t), new_sub, (get_subtree 4 new_t) )
- | _ -> failwith "noeud3_eq_y t";;
- let noeud3_eq_z t =
- match t with
- | Noeud3((e1,e2,e3), a1, a2,a3, (Noeud2(_,_,_,_) | Noeud3(_,_,_,_,_) as a4)) ->
- let (min, new_sub) = find_min a4 in Noeud3((e2, e3, min), a1, a2,a3,new_sub)
- | Noeud3((e1,e2,e3), a1, a2, a3, a4) ->
- let (new_dir, new_t) = setup_dir 3 t in
- let ou_chercher_max = (get_subtree new_dir new_t) in
- let (max, new_sub) = (find_max ou_chercher_max ) in
- Noeud3(((get_element_at_i 1 new_t), (get_element_at_i 2 new_t), max), (get_subtree 1 new_t), (get_subtree 2 new_t), (get_subtree 3 new_t), new_sub)
- | _ -> failwith "error noeud3_eq_z";;
- let keep_setup dir t =
- let (new_dir, new_t) = (setup_dir dir t) in
- let new_sub = get_subtree new_dir new_t in
- new_sub, new_t
- ;;
- let is_noeud1 = function
- | Noeud1(_, _, _) -> true
- | _ -> false;;
- (* Applique la suppression avec les fonctions précédentes + les cas *)
- (* particuliés sur la racine *)
- let remove e t =
- if (not (is_present e t)) then
- t
- else
- let rec aux e t =
- if is_vide t then
- Vide234
- else
- let dir = (get_direction e t) in
- if dir = 0 then
- match t with
- | Noeud2((x, y), Vide234, Vide234, Vide234) when x = e -> Noeud1((y), Vide234, Vide234)
- | Noeud2((x, y), Vide234, Vide234, Vide234) when y = e -> Noeud1((x), Vide234, Vide234)
- | Noeud3((x, y, z), Vide234, Vide234, Vide234, Vide234) when x = e -> Noeud2((y, z), Vide234, Vide234, Vide234)
- | Noeud3((x, y, z), Vide234, Vide234, Vide234, Vide234) when y = e -> Noeud2((x, z), Vide234, Vide234, Vide234)
- | Noeud3((x, y, z), Vide234, Vide234, Vide234, Vide234) when z = e -> Noeud2((x, y), Vide234, Vide234, Vide234)
- (* Subsitituer par le plus petit supérieur *)
- (* Cas racine uniquement *)
- | Noeud1((x), a, b) ->
- let (min, new_sub) = (find_min (get_subtree 2 (setup_root dir t))) in Noeud1((min), a, new_sub )
- | Noeud2((x, y), a, b, c) when (is_noeud1 a) && (is_noeud1 b) && (is_noeud1 c) && eq x e ->
- let (new_dir, new_t) = setup_dir 2 t in
- let (min, new_sub) = (find_min (get_subtree new_dir new_t)) in
- Noeud1((min), (get_subtree 1 new_t), new_sub)
- | Noeud2((x, y), a, b, c) when (is_noeud1 a) && (is_noeud1 b) && (is_noeud1 c) && eq y e ->
- let (new_dir, new_t) = setup_dir2 2 t in
- let (max, new_sub) = (find_max (get_subtree new_dir new_t)) in
- Noeud1((max), new_sub, (get_subtree 2 new_t))
- | Noeud3((x, y, z), a, b, c, d) when (is_noeud1 a) && (is_noeud1 b) && (is_noeud1 c) && (is_noeud1 d) && eq x e ->
- let (new_dir, new_t) = setup_dir 2 t in
- let (min, new_sub) = (find_min (get_subtree new_dir new_t)) in
- Noeud2((min, z), (get_subtree 1 new_t), new_sub, (get_subtree 3 new_t))
- | Noeud3((x, y, z), a, b, c, d) when (is_noeud1 a) && (is_noeud1 b) && (is_noeud1 c) && (is_noeud1 d) && eq y e ->
- let (new_dir, new_t) = setup_dir 4 t in
- let (min, new_sub) = (find_min (get_subtree new_dir new_t)) in
- Noeud2((x, min), (get_subtree 1 new_t), (get_subtree 3 new_t), new_sub)
- | Noeud3((x, y, z), a, b, c, d) when (is_noeud1 a) && (is_noeud1 b) && (is_noeud1 c) && (is_noeud1 d) && eq z e ->
- let (new_dir, new_t) = setup_dir 1 t in
- let (min, new_sub) = (find_min (get_subtree new_dir new_t)) in
- Noeud2((x, min), new_sub, (get_subtree 2 new_t), (get_subtree 3 new_t))
- | Noeud2((x, y), a, b, c) when eq x e -> noeud2_eq_x t
- | Noeud2((x, y), a, b, c) when eq y e -> noeud2_eq_y t
- | Noeud3((x, y, z), a, b, c, d) when eq x e -> noeud3_eq_x t
- | Noeud3((x, y, z), a, b, c, d) when eq y e -> noeud3_eq_y t
- | Noeud3((x, y, z), a, b, c, d) when eq z e -> noeud3_eq_z t
- | _ -> failwith "error remove"
- else
- let (new_dir, new_racine) = (setup_dir dir t) in
- let new_subtree = (aux e (get_subtree new_dir new_racine)) in
- (set_subtree new_dir new_subtree new_racine)
- in aux e (setup_root (get_direction e t) t)
- ;;
- let b = Noeud1 (100,
- Noeud3((30,50,70),
- Noeud2((20,25),
- Noeud1 (5, Vide234, Vide234),
- Noeud1 (22, Vide234, Vide234),
- Noeud1 (26, Vide234, Vide234)),
- Noeud1((33),
- Noeud1(31, Vide234, Vide234),
- Noeud1(37, Vide234, Vide234)),
- Noeud1((55),
- Noeud1 (51, Vide234, Vide234),
- Noeud1 (66, Vide234, Vide234)),
- Noeud2((80,85),
- Noeud1(75, Vide234, Vide234),
- Noeud1(83 ,Vide234, Vide234),
- Noeud1(86, Vide234, Vide234))),
- Noeud2 ((150, 200),
- Noeud1 (110, Noeud1 (105, Vide234, Vide234), Noeud1 (115, Vide234, Vide234)),
- Noeud2 ((160,190),
- Noeud1 (155, Vide234, Vide234),
- Noeud1 (170, Vide234, Vide234),
- Noeud1 (195, Vide234, Vide234)),
- Noeud1 (250, Noeud1 (230, Vide234, Vide234),
- Noeud1 (260, Vide234, Vide234))));;
- let test2 =
- let rec aux t i =
- let ii = (Random.int 100000) in
- if i > 100000 then
- t
- else
- aux (a234_insert ii t) (i +1)
- in aux Vide234 0;;
- let test_supr =
- let rec aux t i =
- let ii = (Random.int 100000) in
- if i > 100000 then
- t
- else
- (aux (remove ii t) (i +1))
- in aux test2 0;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement