Nous avons implémenter une partition pour pouvoir regrouper des éléments dans des paquets :
Pour limiter les temps de traitement, on choisit d'implémenter la partition comme ceci :
typedef struct partition {
int size;
element_t *data;
bool *class;
int *heights;
} partition_t;
int size;
La taille de la partition
element_t *data;
Le taleau contenant le numéro du parent de i
bool *class;
Le tableau de booléen disant si i est une racine
int *heights;
Le tableau des tailles des arbres, pertinant pour les racines uniquement
partition_t partitionCreer(int size);
Cette fonction initialise la partition avec N racines de hauteur 1. Nous sommes obligés de partir de cette configuration pour pouvoir obtenir toutes les partitions possible. En effet, nous ne disposons que de l'opération fusion.
identifier_t partitionRecupererClasse(partition_t *p, element_t x);
Cette fonction remonte l'arbre depuis l'élément cherché jusqu'à arriver à la racine, puis il renvoit son identifiant.
Compléxité : Θ(log(N))
void partitionFusion(partition_t *p, element_t x, element_t y);
Cette fonction fusionne 2 éléments de la partition entre s'ils ne sont pas déjà dans la même partition. La fusion se fait de manière à garder la hauteur de l'arbre la plus petite possible. La hauteur de l'arbre résultant de la fusion est au pire de hauteur MAX(taille arbre premier élément + 1, taille arbre deuxième élément).
Compléxité : Θ(log(N))
element_t *partitionListerClasse(partition_t *p, identifier_t id);
Pour chaque élément de la partition, on regarde s'il appartient à la classe.
Compléxité : Θ(N x log(N))
bool *partitionListerPartition(partition_t *p);
Retourne simplement le tableau class
de la partition.
Compléxité : Θ(1)
Petit exemple d'une partition avec 10 éléments :
Fusion de : 3 6