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 : 3557
Catégorie(s) : Algorithme
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, ...

{JAVA / J2EE} PETIT DEMINEUR
C'est ma premiere contribution a ce cite Ceci est un Demineur que j'ai conçu a mes heures vides, tr...

{C / C++ / C++.NET} CONSTRUCTION D'UN ARBRE N-AIRES DYNAMIQUE
Construction d'un arbre n-aires (chaque n?ud peut avoir un nombre de fils illimités). Ce bout de cod...

{C# / C#.NET} ARBRE (TREE) - STRUCTURES D'ARBRES GÉNÉRIQUES
J'ai été surpris de voir qu'il n'y avait aucune structure général d'arbre dans System.Collections. J...

{C / C++ / C++.NET} CODEUR DE HUFFMAN
Cette source permet de comprendre le fonctionnement d'un codeur de Huffman (plus de détail : http://...

{C / C++ / C++.NET} JEU DES PETIT CHEVAUX
un jeux simple dans le terminal fais sous linux (non testé sous windows) un bon exemple d'enregistr...

{Visual Basic, VB6, VB.NET, VB 2005} MENU JEU DE COMBAT EN VB.NET
Voici la structure d'un menu de jeu de combat pour 6 joueurs. Le son (du jeu Mortal Kombat) est la ...

{Visual Basic, VB6, VB.NET, VB 2005} UTILISER ADO.NET COMME EN ADO (RECORDSET)
Voila pour ceux qui comme moi ont beaucoup de mal avec les nouvelles méthodes de l'ADO.Net, j'ai réa...

{C / C++ / C++.NET} STRUCTURE DES FICHIERS DBF
Pour chaque fichier DBF existant dans le dossier courrant, le programme fait un autre fichier, ayant...

{PHP} CLASSE QUI PERMET DE GENERER UN ARBRE
Voici une classe qui permet de générer un arbre sous forme d'un tableau multidimensionnel. L'avanta...