Les Snippets

Connexion

arbre 2-3-4

Niveau requis pour utiliser/comprendre cette source : 2 ( Initié )
Créé le 04/12/2008 15:12:11 et initié par coucou747 [Liste]
Vue : 9130
Catégorie(s) : Algorithme
Langage sélectionné : Caml
Langages dispo pour ce code :
- C
- Caml, CamlLight, ObjectiveCaml
- Voir tous les langages pour ce code snippet



Langage : Caml , ObjectiveCaml , CamlLight
Date ajout : 04/12/2008
Posté par coucou747 [Liste]
type 'a arbre = Nil
  | D of 'a arbre * 'a * 'a arbre
  | T of 'a arbre * 'a * 'a arbre * 'a * 'a arbre
  | Q of 'a arbre * 'a * 'a arbre * 'a * 'a arbre * 'a * 'a arbre;;
let split4 = function
| Q(a1, k1, a2, k2, a3, k3, a4) -> (D(a1, k1, a2), k2, D(a3, k3, a4) )
| _ -> failwith("split 4") ;;
let i4 = function
| Q(a1, k1, a2, k2, a3, k3, a4) -> true
| _ -> false ;;
(* O(ln n) *)
let rec insert cmp v = function
| Nil -> failwith("insert")
| Q(a1, k1, a2, k2, a3, k3, a4) -> D(D(a1, k1, a2), k2, D(a3, k3, a4)) (*head*)
| D(Nil, k, Nil) -> if cmp v k = -1
  then T(Nil, v, Nil, k, Nil)
  else T(Nil, k, Nil, v, Nil)
| T(Nil, k1, Nil, k2, Nil) -> if cmp v k1 = -1
  then Q(Nil, v, Nil, k1, Nil, k2, Nil)
  else if cmp v k2 = 1
    then Q(Nil, k1, Nil, k2, Nil, v, Nil)
    else Q(Nil, k1, Nil, v, Nil, k2, Nil)
| D(a1, k1, a2) -> if cmp v k1 = -1
  then if i4 a1
    then let (a1', k1', a1'') = split4 a1
      in insert cmp v (T (a1', k1', a1'', k1, a2))
    else D (insert cmp v a1, k1, a2)
  else if i4 a2
    then let (a2', k2', a2'') = split4 a2
      in insert cmp v (T (a1, k1, a2', k2', a2''))
    else D (a1, k1, insert cmp v a2)
| T(a1, k1, a2, k2, a3) -> if cmp v k1 == -1
  then if i4 a1
    then let (a1', k1', a1'') = split4 a1 in if cmp v k1' = 1
      then Q (a1', k1', insert cmp v a1'', k1, a2, k2, a3)
      else Q (insert cmp v a1', k1', a1'', k1, a2, k2, a3)
    else T(insert cmp v a1, k1, a2, k2, a3)
  else if cmp v k2 = 1
    then if i4 a3
      then let (a3', k3', a3'') = split4 a3 in if cmp v k3' = 1
    then Q (a1, k1, a2, k2, a3', k3', insert cmp v a3'')
    else Q (a1, k1, a2, k2, insert cmp v a3', k3', a3'') 
      else T(a1, k1, a2, k2, insert cmp v a3)
    else if i4 a2
      then let (a2', k2', a2'') = split4 a2 in if cmp v k2' = 1
    then Q (a1, k1, a2', k2', insert cmp v a2'', k2, a3)
    else Q (a1, k1, insert cmp v a2', k2', a2'', k2, a3)
      else T(a1, k1, insert cmp v a2, k2, a3);;
let insert cmp v tree = if tree = Nil then D(Nil, v, Nil) else insert cmp v tree;;
let cmp_i a b = if a < b then -1 else if a = b then 0 else 1;;
let insert_i = insert cmp_i;;
(* O(ln n) *)
let rec search cmp v = function
| Nil -> None
| D (a1, k1, a2) -> let c = cmp v k1 in
  if c = 0 then Some k1 else search cmp v (if c = 1 then a2 else  a1)
| T(a1, k1, a2, k2, a3) -> let c = cmp v k1 in
  if c = 0 then Some k1 else if c = -1 then search cmp v a1
  else search cmp v (D(a2, k2, a3))
| Q(a1, k1, a2, k2, a3, k3, a4) -> let c = cmp v k2 in
  if c = 0 then Some k2 else if c = -1
    then search cmp v (D(a1, k1, a2))
    else search cmp v (D(a3, k3, a4));;
(* O(n) <=> O(2^p) *)
let arbre2li =
let rec i acc= function
| Nil -> acc
| D(a1, k1, a2) -> i (k1::(i acc a2)) a1
| T(a1, k1, a2, k2, a3) -> i (k1::(i acc (D(a2, k2, a3)) )) a1
| Q(a1, k1, a2, k2, a3, k3, a4) -> i (k1::(i acc (T(a2, k2, a3, k3, a4)))) a1
in i [];;

Remarque :


exemple :

let arbre = (insert_i 150 (insert_i 100 (insert_i 120 (insert_i 110
(insert_i 150 (insert_i 100 (insert_i 120 (insert_i 110
(insert_i 150 (insert_i 100 (insert_i 120 (insert_i 110
(insert_i 1 (insert_i 4 (insert_i 5 (insert_i 18
(insert_i 5 (insert_i 6 (insert_i 15 (insert_i 95
(insert_i 9 (insert_i 25 (insert_i 15 (insert_i 15
(insert_i 15 (insert_i 25 (insert_i 9 (insert_i 5 Nil) ) )
)))))))))))))))))))))))));;
T(
  T(
    Q (Nil, 1, Nil, 4, Nil, 5, Nil),
    5,
    D (Nil, 6, Nil),
    9,
    Q (Nil, 9, Nil, 15, Nil, 15, Nil)
  ),
  15,
  D (
    T (Nil, 18, Nil, 25, Nil),
    25,
    Q (Nil, 95, Nil, 100, Nil, 100, Nil)
  ),
  100,
  T (
    D (Nil, 110, Nil),
    110,
    Q (Nil, 110, Nil, 120, Nil, 120, Nil),
    120,
    Q (Nil, 150, Nil, 150, Nil, 150, Nil)
  )
)


search cmp_i 100 arbre;;
search (fun (b,c) a -> cmp_i b a) (100, 0) arbre;;


arbre2li arbre;;

Snippets en rapport avec : Arbre, Structure, Equilibre, Donnees



Codes sources en rapport avec : Arbre, Structure, Equilibre, Donnees

{PHP} ARBRE N-AIRE
Voici un code qui vous permettra de générer un arbre n-aire à partir d'une base de donnée. En gros, ...

{C / C++ / C++.NET} TRANSFORMATION D'EXPRESSION ARITHMÉTIQUE EN ARBRE
Il s'agit d'un ensemble de fichiers sources .c et .h formant un programme permettant de représenter ...

{C / C++ / C++.NET} EVALUATION D'UNE CHAÎNE DE CARACTÈRES AVEC UN ARBRE BINAIRE
La chaîne de caractères est "parsée" dans un arbre binaire L'arbre est affiché, puis évalué (avec d...

{C / C++ / C++.NET} DICTIONNAIRE DANS UN ARBRE BINAIRE
Avec sauvegarde de l'arbre binaire à l'écran (ou dans un fichier en faisant dico.exe > dico.txt). Q...

{Visual Basic, VB6, VB.NET, VB 2005} CONSTRUCTION D'UNE ARBORESCENCE DOSSIERS DISQUE DANS UNE LISTBOX
Ce code permet de visualiser l'arbre des dossiers et sous dossiers d'un disque dans une listbox. De ...

{C / C++ / C++.NET} SYSTÈME D'ANNULER-REFAIRE PAR ARBRE (TURS)
TURS (Tree Undo Redo System) permet de gérer les annuler-refaire (ou précédent-suivant) sans perte d...

{C# / C#.NET} [SILVERLIGHT] UN GÉNÉRATEUR INTERACTIF D'ARBRES DE HUFFMAN
Bonjour les amigos ! Il est toujours intéressant de voir l'évolution d'un arbre de Huffman au fur e...

{ASP / ASP.NET} OBJETS IMBRIQUÉES EN TABLEAU (EN VBSCRIPT OU ASP)
Simple classe VBScript imbriquée: -------------------------------- Pratique pour faire une class...

{PHP} CRÉATION D'UN TABLEAU AVEC CONTENU DYNAMIQUE
Bonjour, Voici un petit code qui permet de créer un tableau avec du contenu dynamique dans les ce...

{PHP} LEVELPARSER
Bonjour, un petit code simple qui permet de parser un arbre représenté par une ligne : "['noeud 1']...