SUPPORT DE COURS. Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com



Documents pareils
Les structures de données. Rajae El Ouazzani

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

ARBRES BINAIRES DE RECHERCHE

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

Algorithmique, Structures de données et langage C

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Les arbres binaires de recherche

Chapitre 7. Récurrences

1 Recherche en table par balayage

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

INF601 : Algorithme et Structure de données

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Architecture des Systèmes d Information Architecture des Systèmes d Information

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Bases de programmation. Cours 5. Structurer les données

Quelques Algorithmes simples

Compression de Données - Algorithme de Huffman Document de Conception

Structure fonctionnelle d un SGBD

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Conventions d écriture et outils de mise au point

Définitions. Numéro à préciser. (Durée : )

ÉPREUVE COMMUNE DE TIPE Partie D

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Cours d initiation à la programmation en C++ Johann Cuenin

Recherche dans un tableau

Soit la fonction affine qui, pour représentant le nombre de mois écoulés, renvoie la somme économisée.

Chapitre 5 : Flot maximal dans un graphe

CCP PSI Mathématiques 1 : un corrigé

Algorithmique I. Algorithmique I p.1/??

Arbres binaires de recherche

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Algorithmique et Programmation

La fonction exponentielle

Intégration et probabilités TD1 Espaces mesurés Corrigé

Initiation. àl algorithmique et à la programmation. en C

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

Les algorithmes de base du graphisme

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Groupe symétrique. Chapitre II. 1 Définitions et généralités

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Résolution d équations non linéaires


PROJET ALGORITHMIQUE ET PROGRAMMATION II

Algorithmes de recherche

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

Structures algébriques

Génie Logiciel avec Ada. 4 février 2013

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

chapitre 4 Nombres de Catalan

I. Introduction aux fonctions : les fonctions standards

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

LE PROBLEME DU PLUS COURT CHEMIN

V- Manipulations de nombres en binaire

Chapitre 1 : La gestion dynamique de la mémoire

LES TYPES DE DONNÉES DU LANGAGE PASCAL

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

I. Polynômes de Tchebychev

Introduction à MATLAB R

Image d un intervalle par une fonction continue

Corrigé des TD 1 à 5

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Cours de Programmation Impérative: Zones de mémoires et pointeurs

CH.6 Propriétés des langages non contextuels

Limites finies en un point

Chaînes de Markov au lycée

UE C avancé cours 1: introduction et révisions

Suites numériques 3. 1 Convergence et limite d une suite

Chapitre V : La gestion de la mémoire. Hiérarchie de mémoires Objectifs Méthodes d'allocation Simulation de mémoire virtuelle Le mapping

Travaux Dirigés n 1 : chaînes de caractères

Chap III : Les tableaux

Algorithmique et Programmation, IMA

Résolution de systèmes linéaires par des méthodes directes

Quelques algorithmes simples dont l analyse n est pas si simple

Chapitre 2 Le problème de l unicité des solutions

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

données en connaissance et en actions?

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Université de Strasbourg UFR de Mathématique et d'informatique. L2 Informatique Semestres S3 et S4. Structures de Données et Algorithmes 1 et 2

Systemes d'exploitation des ordinateurs

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Correction de l examen de la première session

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

Fonctions de plusieurs variables

Algorithmes récursifs

Les structures. Chapitre 3

Cours de Master Recherche

Métriques de performance pour les algorithmes et programmes parallèles

4. Les structures de données statiques

Initiation à l algorithmique

Cours d Analyse. Fonctions de plusieurs variables

Optimisation non linéaire Irène Charon, Olivier Hudry École nationale supérieure des télécommunications

Partie 7 : Gestion de la mémoire

Algorithmique avec Algobox

Nombres, mesures et incertitudes en sciences physiques et chimiques. Groupe des Sciences physiques et chimiques de l IGEN

Transcription:

Dr. Omari Mohammed Maître de Conférences Classe A Université d Adrar Courriel : omarinmt@gmail.com SUPPORT DE COURS Matière : Algorithmiques et Structures de Données 1 Niveau : 2 ème Année Licence en Informatique

ALGORITHMIQUES ET STRUCTURES DE DONNEES 1 Programme : 1- Rappel sur les structures de données simples : tableaux, listes chaînées. 2- Structures de données séquentielles : piles, files, listes. 3- Structures de données en table : hachage. 4- Structures de données hiérarchiques : arbres. 5- Arbres binaires de recherche. 6- Arbres AVL. 7- Arbres bicolores. 8- B-arbres. 9- Les notations asymptotiques et la complexité d un algorithme. 10- Preuve d exactitude d un algorithme 11- L algorithme de tri par arbre (heapsort). Ouvrages : 1- «Arbres, tables, algorithmes», Jacques Guyot, édition Chihab. 2- «Introduction à l algorithmique», Thomas Corman, édition Dunod. 3- «Introduction to Algorithms», Cormen, Mc Graw Hill edition. 4- «Apprendre à programmer en Turbo C», Claude Delannoy, édition Chihab. -1-

Rappels sur les Tableaux et les Listes Chaînées Dans la plupart des ordinateurs, la mémoire principale est formée d une suite de cellules de même taille, repérable à l aide d une adresse. Pour représenter les structures de données en mémoire principale, on a essentiellement deux modes de stockage : le stockage par tableau (stockage contigu), et le stockage par pointeur ou liste chaînée (stockage dispersé). I- Les Tableaux : L élément représentatif des structures statiques homogènes est le tableau que l on trouve dans la majorité des langages évolués de programmation. L allocation de l espace mémoire d un tableau est souvent statique. I-1 Les Tableaux Monodimensionnels : Le tableau monodimensionnel est la représentation informatique d un vecteur de l espace. Il est constitué d un ensemble d élément accessible à l aide d un indice. Cet accès direct est garanti en cas de lecture ou écriture. #include <stdio.h> #include <conio.h> /* Variables Globales*/ int A[100] ; int I, NombreMax ; void main() { /* Effacer l écran*/ clrscr(); /* Lecture de la taille du tableau*/ printf( Donner la taille du tableau : ); scanf( %d,&nombremax); /* Lecture des éléments du tableau*/ printf( Donner les éléments du tableau : \n ); for(i = 0 ; I <= NombreMax-1 ; I++) scanf( %d,&a[i]); -2-

/* Affichage des éléments du tableau*/ printf( Voici le contenu du tableau : \n ); for(i = 0 ; I <= NombreMax-1 ; I++) printf( %d\n, A[I]); } /* Pause avant quitter*/ getchar(); getchar(); I-2 Les Tableaux Multidimensionnels : Un élément de tableau multidimensionnel est repéré à l aide de plusieurs indices au lieu d un seul. Néanmoins, la représentation physique dans la mémoire principale est presque la même. Mémoire Mémoire 100 5 A[1] 100 5 A[1][1] 102 104 9 25 A[2] A[3] 102 104 9 25 A[1][2] A[2][1] 106-10 A[4] 106-10 A[2][2] Représentation physique d un tableau monodimensionnel Représentation physique d un tableau multidimensionnel Alors quelque soit la dimension d un tableau multidimensionnel, sa représentation physique est toujours linéaire. 1 5 7... 9 2 7 10... 2............... 8 4 5... 3-3-

Elément Adresse A[I] @A[1] + (I-1) * TailleElement A[I][J] @A[1][1] +(I-1) * TaillePremiereDimension +(J-1) * TailleElement II- Les Listes Chaînées : Lorsque le besoin de conserver la mémoire s élève, il sera nécessaire d implémenter les structures de données en utilisant les pointeurs ou les listes chaînées, où les données sont organisées séquentiellement. Le principe de base de leur représentation est de suivre les évolutions de la structure, en lui attribuant de la place en mémoire quand elle grandit, et en la récupérant quand elle diminue. Ceci est réalisé par un principe d allocation et libération dynamique d espace mémoire. Le TAS (HEAP) est la plage d espace mémoire réservée juste pour l allocation dynamique. Mémoire Espace réservé pour les variables, tableaux, environnement des procédures, (statiques) TAS Espace réservé pour les listes chaînées, environnement des procédures, (dynamique) Dans les langages modernes, on dispose de deux procédures standard d acquisition et de libération d espace mémoire : RESERVE et LIBERE. La procédure RESERVE La procédure LIBERE Langage Pascal new() dispose() Langage C malloc() free() -4-

II-1 Les Listes Simplement Chaînées (Unidirectionnelles) : Une liste simplement chaînée est composée d'éléments distincts liés par un simple pointeur. Chaque élément d'une liste simplement chaînée est formé de deux parties: - Un champ (ou plusieurs champs) contenant la donnée (ou l information). - Un pointeur vers l'élément suivant de la liste. - L ensemble {champ, pointeur} est appelé le maillon. La liste est caractérisée par sa tête (l adresse du premier maillon). Aussi, le dernier maillon a la valeur NULL (Nil en Pascal) pour son pointeur. La queue (l adresse du dernier élément) est très utile pour accélérer l opération d insertion. Champ Pointeur Tête Maillon Queue NULL #include <stdio.h> #include <conio.h> /* Definition de Type*/ typedef struct S_Element { int info ; struct S_Element* suivant ; } Type_Element ; /* Variables Globales*/ Type_Element* tete ; Type_Element* element ; void main() { /* Effacer l écran*/ clrscr(); /* Créer la liste {1, 2, 3}*/ /* 1 */ tete = malloc (sizeof (Type_Element)) ; tete -> info = 1 ; /* 2 */ element = tete ; element -> suivant = malloc (sizeof (Type_Element)) ; element = element -> suivant ; element -> info = 2 ; /* 3 */ -5-

element -> suivant = malloc (sizeof (Type_Element)) ; element = element -> suivant ; element -> info = 3 ; element -> suivant = NULL; /* Affichage des éléments de la liste*/ printf( Voici le contenu de la liste : \n ); element = tete; while (element!= NULL) { printf( %d\n, element -> info); element = element -> suivant; } } /* Pause avant quitter*/ getchar(); getchar(); II-2 Les Listes Doublement Chaînées (Bidirectionnelles) : Les listes doublement chaînées sont constituées d'éléments comportant trois champs: - Un champ contenant la donnée. - Un pointeur vers l'élément suivant de la liste. - Un pointeur vers l'élément précédent de la liste. Les listes doublement chaînées peuvent donc être parcourues dans les deux sens. La liste est caractérisée par sa tête, aussi que par sa queue. Champ Tête Précèdent Suivant II-3 Les Listes Circulaires : Une liste circulaire peut être simplement ou doublement chaînée. Sa particularité est de ne pas comporter de queue (NULL ne figure pas). Le dernier élément de la liste pointe vers le premier. Un élément possède donc toujours un suivant. Champ Pointeur Tête -6-

Les Piles, les Files, et les Listes I. Les Piles : Les piles sont des structures de données, où l'ajout et le retrait d'un élément se fait toujours au sommet (en tête de liste). Le plus souvent, les piles sont implantées sous forme de liste chaînée. Néanmoins, une pile peut être implémentée à partir d'un tableau. Une pile suit la règle LIFO (Last In, First Out): dernier entré, premier sorti. Sommet Sommet Sommet Sommet Sommet 12 7 7 7 5 5 5 5 Pile Vide Empiler(5) Empiler(7) Empiler(12) Dépiler() 3 7 5 Empiler(3) Terminologie particulière: - l'extrémité où s'effectue l'ajout et le retrait s'appelle sommet. - ajouter un élément à une pile se dit empiler (ou push). - le fait de retirer un élément d'une pile et de récupérer son information s'appelle dépiler (ou pop). Exemple d Utilisation des Piles: Un programme A appelle une procédure B, qui appelle lui-même une procédure C qui appelle une fonction D. La pile du programme va évoluer comme suit: 1. lancement de A pile vide. 2. appel de B par A l'état de A est empilé. 3. appel de C par B l'état de B est empilé sur A. 4. appel de D par C l'état de C est empilé sur B. 5. Fin de D dépilage de l'état de C à poursuite de C. 6. Fin de C dépilage de l'état de B à poursuite de B. La Mémoire Etat de C Etat de B Etat de A -7-

7. Fin de B dépilage de l'état de A à poursuite de A. procédure. L état d une procédure représente l espace mémoire utilisé par cette Représentation par une liste chaînée : Sommet Tête 4 ème élément 3 ème élément 2 ème élément 1 er élément Les Primitives (Fonctions/Procédures de base) : - Empiler() - Dépiler() - Vider() ou DépilerTout() - Vide() - Taille() II. Les Files : Une file ou queue est une structure de données où l'insertion d'un élément se fait à une extrémité appelée queue et le retrait d'un élément se fait à une autre extrémité appelée tête. Une file est le plus souvent représentée par une liste chaînée. Une file suit la règle FIFO (First In, First Out): premier entré, premier sorti. Application : Les files servent à traiter des données dans l'ordre où elles arrivent, comme dans une file d'attente à un guichet où le premier arrivé est le premier servi. -8-

Représentation par une liste chaînée : Une file doit être accessible à la fois par la tête pour retirer un élément et par la queue pour ajouter un nouvel élément. La tête et la queue d'une file correspondent à la tête et la queue de la liste chaînée qui l'implémente. Tête 1 er élément 2 ème élément 3 ème élément 4 ème élément Queue Les Primitives : - Enfiler() - Défiler() - Vider() ou DéfilerTout() - Vide() - Taille() II. Les Listes : Une liste est un ensemble d élément de même type. Les listes sont implémentées par des tableaux ou des listes chaînées, selon les besoins d implémentation. Les polynômes correspondent à une liste de données ; chaque élément est constitué de l ensemble d un coefficient et un degré. Exemple : Soit le polynôme P(x) = X 5 + 3X 2 + X + 7. Voici l implémentation de la liste polynomiale par une liste chaînée : Tête 1 5 3 2 1 1 7 0-9-

III. Les Listes Non-Linéaires: Une liste non linéaire est une structure de donnée dynamique que l on l utilise beaucoup en informatique, surtout dans le domaine de l intelligence artificielle. Le langage LISP souvent utilise une base de donnée organisée sous forme des listes non linéaires. Spécification Fonctionnelle : - ( ) représente la liste vide. - A représente l atome (ou l élément) A - (A) représente la liste à un élément A. - (A B) représente la liste de deux éléments A et B - (A (B (C) D) (E)) est une liste composée de trois éléments : - l atome A - la liste à trois éléments (B (C) D) - et la liste à un élément (E) Remarque : 1- La liste non linéaire peut être composée d autres listes ou/et des atomes. 2- Si la liste est composée des atomes seulement, alors c est une liste linéaire. Représentation Physique : 1- Liste Vide : () Courant Suivant Tête 2- La Liste (A) Tête A Atome Liste -10-

3- La Liste (A B) Tête A B 4- La Liste (A (B)) Tête A B 5- La Liste (A (B C)) Tête A B C 6- La Liste (A (B C) D) Tête A D B C Dans les exemples précédents, on observe que le pointeur Suivant pointe toujours sur une liste. Par contre, le pointeur Courant pointe sur des listes et des atomes. Afin d enlever cette ambiguïté, un champ booléen est ajouté pour distinguer entre l atome et la liste : -11-

Tête V A F V V V D B C La structure en C : Typedef Struct S_Liste { Struct S_Liste* Suivant ; Struct S_Liste* Courant_Liste ; Char Courant_Atome ; Int Type_Courant ; /* 1 : Vrai, 0 : Faux*/ } Liste ; -12-

Structures de données en table : Hachage Les opérations fondamentales sur une base de données sont : l insertion, la recherche, et la suppression. On cherche souvent à trouver des structures de données et des méthodes d accès plus efficaces afin d améliorer le temps requis par ces opérations. Soit un tableau des noms triés en ordre alphabétique comme suit : Ali Bachir Celia Dalila Emad Farid George Hassan La recherche dichotomique binaire est faite sur plusieurs étapes, sauf si le nom cherché est au milieu. Généralement, si le tableau des données est de taille n, alors le pire des cas correspond à lg 2 (n) étapes de recherche pour accéder aux éléments situés aux extrémités. Solution : Créer une fonction h qui remplace directement chaque mot correspondant : h( Ali ) = 0 ; h( Bachir ) = 1 ; La fonction h est appelée une fonction de hachage (ou de dispersion). par son indice Définition : Une fonction de hachage h est une fonction d un ensemble de clés C dans un ensemble (d indices) {0, 1,, m-1}. Une bonne fonction de hachage doit être calculable très rapidement et doit distribuer uniformément les clés sur les indices de hachage. Exemple1 : h(mot) = Ord(premier caractère de MOT) Ord( A ) ; où Ord est la fonction de conversion d un caractère à son code ASCII. Exemple 2 : Si on désire de stocker les entiers 1, 3, 4, 6, 8, 11, on peut choisir la méthode de la division suivante : h(k) = k mod m, où mod est l opération du reste de division entière, et m = 6. Dans ce cas tous les éléments sont rangés dans un tableau de 6 éléments : h(6) = 0, h(1) = 1, h(8) = 2, h(3) = 3, h(4) = 4, h(11) = 5. 6 1 8 3 4 11 Avantages : - Accès directe (rapide). Inconvénients : - Impossible de stocker deux clés si elles ont la même valeur hachée ; h( Ali ) = h( Ahmed ) ; h(5) = h(11). On appelle cette situation une collision. La collision peut -13-

facilement être évitée si la fonction de hachage est bijective. Mais cette méthode conduit à une énorme perte de l espace mémoire si le nombre de clés à stocker est très inférieur au domaine des clés. Exemple : Stocker les entiers 2, 4, 10, 18, et 20 dans un tableau en utilisant la fonction de hachage bijective h(x) = (x/2) -1. 2 4 10 18 20 Pour remédier à ce problème, deux solutions ont été proposées : l adressage fermé, et l adressage ouvert. 1- L Adressage Fermé (avec Chaînage): Au lieu de sauvegarder les clés directement dans les cellules du tableau, en associe une liste chaînée pour chaque cellule, chacune contenant la classe des clés de même valeur hachée. Exemple : Insérer successivement les clés 10, 22, 31, 4, 15, 28, 17, 88, et 59 dans une table de hachage de taille m = 11 gérée en adresse fermé, en utilisant la fonction uniforme de hachage : h(k) = k mod m. 0 1 2 3 4 5 6 7 8 9 10 22 88 4 15 59 28 17 31 10-14-

Avantages : - Un nombre limité de données (têtes des listes) est sauvegardés dans la partie statique de la mémoire ; le reste est sauvegardé dans le tas. - Collision éliminée. Inconvénients : - Les clés ne sont pas distribuées uniformément. On peut donc avoir une grande accumulation de données dans des zones limitées!!! - L accès à un élément dans une liste chaînée est coûteux. 2- L Adressage Ouvert : 2-1 L Adressage Ouvert Simple: Dans ce mode d adressage, tous les éléments sont conservés dans la table de hachage. Chaque entrée de la table contient soit NULL, soit un élément. En supprimant les listes chaînées, on libère de la mémoire, ce qui permet d augmenter la taille de la table et limiter les collisions. Lorsqu on définie la fonction de hachage h, chaque clé k est associé à une permutation H(k) = {h(k, 0), h(k, 1),, h(k, m-1)} de {0, 1,, m-1}. Cette permutation est la suite des indices des cellules testées lors d une recherche. Alors, on examine (sonde) successivement les cellules de la table jusqu à en trouver une vide. Remarque : En adressage ouvert, la table peut se remplir complètement, dans ce cas, il ne sera plus possible d y insérer des éléments. Exemple : Même exemple précédent avec la fonction de hachage h(k, i) = (k + i) mod m. 0 1 2 3 4 5 6 7 8 9 10 22 2- h(22, 0) = 0 88 8- h(88, 0) = 0, h(88, 1) = 1 4 4- h(4, 0) = 4 15 5- h(15, 0) = 4, h(15, 1) = 5 28 6- h(28, 0) = 6 17 7- h(17, 0) = 6, h(17, 1) = 7 59 9- h(59, 0) = 4, h(59, 1) = 5, h(59, 2) = 6, h(59, 3) = 7, h(59, 4) = 8 31 3- h(31, 0) = 9 10 1- h(10, 0) = 10-15-

2-2 L Adressage Ouvert Double : On observe que dans le mode d adressage simple, la suite des essais (permutation) est toujours séquentielle selon l indice de la table. En fait, les valeurs h(k, i), h(k, i+1), h(k, i+2), consiste à une suite numérique non-aléatoire. Ce qui fait que la recherche dans une table de hachage est loin d être uniforme. En mode d adressage double, on ajoute une deuxième fonction d hachage afin d améliorer la distribution des permutations H(k). Exemple : Même exemple précédent avec la fonction de hachage h(k, i) =(k + ih 2 (k)) mod m, tel que h 2 (k) = k mod (m-1) 0 1 2 3 4 5 6 7 8 9 10 22 17 15 4 28 59 2- h(22, 0) = 0 7- h(17, 0) = 6, h(17, 1) = 2 5- h(15, 0) = 4, h(15, 1) = 9, h(15, 2) = 3 4- h(4, 0) = 4 6- h(28, 0) = 6 9- h(59, 0) = 4, h(59, 1) = 2, h(59, 2) = 0, h(59, 3) = 9, h(59, 4) = 7 88 8- h(88, 0) = 0, h(88, 1) = 8 31 3- h(31, 0) = 9 10 1- h(10, 0) = 10 - Avantages : Accès aléatoire aux cellules. - Inconvénients : Pas de garantie d insertion, même s il y a une case vide (exemple : on peut pas insérer la valeur 20 dans la table précédente). 2-3 L Adressage Ouvert Quadratique : L adressage double ne nous garantie aucune seuil maximale à propos du nombre d essais qu il faut balayer pour la recherche d une clé. Pour cela, l adressage quadratique a été proposé comme suit : h(k, i) = (k + i 2 ) mod m Dans ce mode, si m est un nombre premier, la suite d essais successifs balaie au plus la moitié du tableau. Ou bien, on à au moins un nombre d essais égale à la moitié des cellules existantes. Preuve : Supposons que les essais i et j (i < j et i,j {1, m-1}) correspondent à la même cellule du tableau. Nous avons alors h(k, i) = h(k, j). Donc on a h(k, j) - h(k, i) = 0. Ce qui fait que (k + j 2 ) - (k + i 2 ) = 0 mod m -16-

Alors j 2 - i 2 = 0 mod m, et donc (j+i)(j-i) = 0 mod m Comme m est un nombre premier, alors soit (j+i) = 0 mod m ou bien (j-i) = 0 mod m Si (j-i) = 0 mod m, alors j {i, i+m, i+2m, }. Contradiction puisque j i et j {1, m-1}. Il reste que (j+i) = 0 mod m, alors les seuls couples (i, j) possibles sont : - Si m est pair, alors m = 2n : (i, j) {(1, m-1), (2, m-2),, (n-1, n+1)} - Si m est impair, alors m = 2n+1 : (i, j) {(1, m-1), (2, m-2),, (n, n+1)} Dans les deux cas précédents, le nombre de possibilités est inférieur ou égale à n, ou m/2. Ca veut dire que, dans le pire des cas, après le n ème essai on tombe sûrement sur une cellule déjà visitée. Exemple : Même exemple précédent avec la fonction de hachage quadratique h(k, i) = (k + i 2 ) mod m 0 1 2 3 4 5 6 7 8 9 10 22 2- h(22, 0) = 0 88 8- h(88, 0) = 0, h(88, 1) = 1 4 4- h(4, 0) = 4 15 5- h(15, 0) = 4, h(15, 1) = 5 28 6- h(28, 0) = 6 17 7- h(17, 0) = 6, h(17, 1) = 7 59 9- h(59, 0) = 4, h(59, 1) = 5, h(59, 2) = 8 31 3- h(31, 0) = 9 10 1- h(10, 0) = 10-17-

Les Arbres L arbre est une structure de données fondamentale en informatique. Elle est utilisée pour représenter des données en hiérarchie. Le but d étudier les arbres est de savoir comment peut on améliorer la représentation et l accès aux différentes données. Les arbres sont utilisés dans des différents domaines, comme la compilation, les graphes, et l intelligence artificielle. Exemple 1 : Représentation Administratives des daïras et wilayas : Algérie Adrar Chlef. Alger. Rélizane Timimoun Reggane Aoulef. Exemple 2 : Représentation d une expression arithmétique : A (B + C * (D E)) * F A * + F B * C D E -18-

Exemple 3 : Arbre de décision d un tri de trois éléments a, b, et c : a>b a b a>c a c b>c b c c>b c b a>c a c (a, c, b) (a, b, c) (c, a, b) (b, a, c) (b, c, a) (c, b, a) 1. Définition : Un arbre binaire est composé d une racine (ou nœud) et de deux sous-arbres binaires (gauche et droit). Un arbre binaire peut aussi être vide. 2. Primitives : La structure arbre binaire doit assurer les primitives suivantes : - Insérer() - Supprimer() - Rechercher() - Taille() - Vide() 3. Représentation Physique : Un arbre binaire est facilement représenté par une liste chaînée. Néanmoins, la représentation tabulaire est souvent utilisée pour les arbres de tri. Exemple 4 : Tête 2 5 8 1 4 10 7 12-19-

4. Parcours d un Arbre : On appelle parcours d un arbre binaire, toute méthode permettant l accès une seule fois aux nœuds de cette arbre. 4.1 Le Parcours en Pré-ordre (Prefix en anglais) : Dans ce mode, on inspecte d abord la racine, puis le sous-arbre gauche, et enfin le sous-arbre droit (RGD). Ce type de parcours est caractérisé par le balayage en profondeur : vertical de haut en bas. Exemple : (L arbre de l exemple 4) RGD : 2 5 1 4 7 8 10 12 2 (5 (1) (4 (7) ())) (8 () (10 (12) ())) 4.2 Le Parcours en Post-ordre (Postfix en anglais) : Dans ce mode, on inspecte d abord le sous-arbre gauche, puis le sous-arbre droit, et enfin la racine (GDR). Ce type de parcours est caractérisé par le balayage en profondeur : vertical de bas en haut. Exemple : (L arbre de l exemple 4) GDR : 1 7 4 5 12 10 8 2 ((1) ((7) () 4) 5) (() ((12) () 10) 8) 2 4.3 Le Parcours en Ordre (Infix en anglais) : Dans ce mode, on inspecte d abord le sous-arbre gauche, puis la racine, et enfin le sous-arbre droit (GRD). Ce type de parcours est caractérisé par le balayage en largeur (horizontal). Exemple : (L arbre de l exemple 4) GRD : 1 5 7 4 2 8 12 10 ((1) 5 ((7) 4 ())) 2 (() 8 ((12) 10 ())) -20-

Les Arbres Binaires de Recherche Un arbre binaire de recherche est un arbre ordonné horizontalement (de gauche à droite) ; i.e., la clé de tout nœud non feuille est supérieur à toutes celles de son sous-arbre gauche, et inférieure à toutes celles de son sous-arbre droit. Exemple : 13 9 45 5 11 50 7 10 12 48 52 Parcours Pre-Ordre : 13 (9 (5 () (7)) (11 (10) (12))) (45 () (50 (48) (52))) Parcours Post-Ordre : ((() (7) 5) ((10) (12) 11) 9) (() ((48) (52) 50) 45) 13 Parcours en-ordre : ((() 5 (7)) 9 ((10) 11 (12))) 13 (() 45 ((48) 50 (52))) 1- Recherche d un élément : Puisque l arbre binaire de recherche est ordonné horizontalement, une simple recherche dichotomique est déclanché pour trouver une clé quelconque : 1- Tester si la clé de la racine de l arbre égale à la clé recherchée. 2- Sinon, chercher récursivement dans le sous-arbre gauche si la clé est inférieure à la racine, sinon dans le sous-arbre droit. Exemple : Chercher la clé 12 : Chercher la clé 51 : 12 13 51 > 13 12 > 9 51 > 45 12 > 11 51 > 50 12 = 12 (clé trouvée) 51 52 (clé non trouvée) 2- Insertion d un élément : Le principe de l insertion d un élément inexistant dans un arbre binaire de recherche (ABR) est basé sur la recherche de cet élément. Il est évident qu on va aboutir à une feuille (élément inexistant). Alors le nouvel élément est accroché à la dernière feuille ; i.e., à gauche si inférieur, à droite si supérieur. -21-

Exemple : Insertion de 3 et 6. 8 8 4 10 4 10 5 9 13 3 5 9 13 6 3- Suppression d un élément : L opération de suppression d un élément est effectuée selon 3 cas : - Si l élément est une feuille alors on le supprime simplement. - Si l élément a un seul descendant alors on le remplace par ce descendant. - Si l élément a deux descendants (ou bien deux sous-arbres), on le remplace, au choix, soit par l élément le plus à droite (le plus grand) de son sous-arbre gauche, soit par l élément le plus à gauche (le plus petit) de son sous-arbre droit. Exemple : Suppression de 16 et 7. 16 7 18 4 9 24 2 6 8 10 10 8 18 4 9 24 2 6-22-

4- Modification d un élément : Il n y pas de règle spécifique pour la modification. Une simple implémentation consiste à supprimer puis insérer la nouvelle valeur de l élément. 5- Stockage optimal d un arbre binaire de recherche: Pour améliorer l accès aux éléments de l arbre, on les stocke dans un tableau comme suit : si un élément est stocké à l indice i, alors ses fils gauche et droit sont respectivement en position 2*i et 2*i+1. Si un fils n existe pas, sa place est perdue (restera vide). 16 7 18 4 9 24 2 6 8 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 7 18 4 9 24 2 6 8 10 16 (7 (4 (2) (6)) (9 (8) (10))) (18 () (24)) Dans le cas où l arbre binaire est complet, ce stockage est compact et optimal. Notons qu avec cette représentation, un simple parcours séquentiel du tableau correspond à un parcours de l arbre par niveau, appelé aussi parcours en largeur. -23-

Les Arbres AVL Lorsque plusieurs opérations d insertion et de suppression sont effectuées sur un arbre binaire de recherche, l arbre binaire risque de se dégénérer ; i.e., l arbre peut se déséquilibrer et se transformer à une liste linéaire : 10 5 13 4 7 11 15 après la suppression de 4, 5, 7 et 11 : 10 13 15 Ceci enlève tout intérêt de la structure arborescence car on est ramené à une recherche séquentielle!!! La solution de ce problème serait de réorganiser l arbre après chaque modification (insertion ou suppression) 1- Critère d équilibre parfait : Un arbre binaire est parfaitement équilibré si pour tout nœud, la différence entre le nombre de noeuds du sous-arbre gauche SAG et ce du sous-arbre droit SAD égale à 0 ou 1 (maximum 1). Le problème c est que ce critère est très coûteux à réaliser. 2- Arbres partiellement équilibrés : Un arbre partiellement équilibré est un arbre caractérisé par l équilibre de la hauteur des sous-arbres gauche et droit. -24-

Pour cela, on ajoute l information BALANCE pour chaque nœud, où sa valeur est inclue dans {-1, 0, 1}. typedef struct S_Noeud { int info ; struct S_Noeud* gauche ; struct S_Noeud* droit ; int balance; /* -1, 0, ou 1*/ } Noeud; Le facteur d équilibre BALANCE a le sens suivant : - Si BALANCE = -1, alors la hauteur du SAG est supérieure à celle du SAD. - Si BALANCE = 0, alors la hauteur du SAG égale à celle du SAD. - Si BALANCE = 1, alors la hauteur du SAG est inférieure à celle du SAD. 3- Les Arbres AVL : Ils sont des arbres BR à critère d équilibre, proposés par G.M. Andelson-Velski et E.M. Landis en 1962. Dans un arbre AVL, pour tous les nœuds, la différence entre les hauteurs des sous-arbres gauche et droit égale à 1 au maximum. 4- Insertion dans un arbre AVL : Dans tout ce qui suit, on va étudier la modification du SAG seulement. Lorsqu un nœud est inséré dans un arbre AVL, 4 cas majeurs se produisent : 1 er cas : Le SAG n a pas grandi. Dans ce cas, l équilibre est inchangé. Aucune action de rééquilibrage n est exigée. -25-

2 ème cas : Le SAG a grandi alors que le SAD était maximal (balance = 1). Dans ce cas, l équilibre est amélioré (balance = 0). Aucune action de rééquilibrage n est exigée. SAG SAD SAG SAD 3 ème cas : Le SAG a grandi alors que le SAG et le SAD avaient la même hauteur (balance = 0). Dans ce cas, le SAG atteint la hauteur maximale (balance = -1). Aucune action de rééquilibrage n est exigée. SAG SAD SAG SAD 4 ème cas : Le SAG a grandi alors qu il était déjà maximal (balance = -1). SAG SAD SAG SAD Dans ce cas, le critère d équilibre AVL n est plus respecté. Alors, il faut réorganiser l arbre selon ces deux cas : Cas gauche-gauche : c est le cas où le sous-arbre gauche du SAG a grandi : 1 2 1 2 A B C A B C Dans ce cas, une simple rotation à droite des nœuds 1 et 2 est effectuée. La racine du SAG devient la racine de l arbre en question. -26-

Cas gauche-droite : c est le cas où le sous-arbre droit du SAG a grandi : 1 3 2 1 3 A 2 B1 B2 C A B1 B2 C Dans ce cas, cet arbre est divisé lui même en sous-arbre gauche et droit, et sa racine devient la racine de l arbre en question. Remarque : Cette méthode est valable quelque soit la BALANCE entre B1 et B2 (-1, 0, ou 1). 4- Retrait dans un arbre AVL : Lorsqu un nœud est supprimé d un arbre AVL, 4 cas majeurs se produisent : 1 er cas : Le SAG n a pas diminué à cause du retrait (balance n a pas changé). Dans ce cas, l équilibre est inchangé. Aucune action de rééquilibrage n est exigée. 2 ème cas : Le SAG a diminué alors qu il était maximal (balance = -1). Dans ce cas, l équilibre est amélioré (balance = 0). Aucune action de rééquilibrage n est exigée. SAG SAD SAG SAD 3 ème cas : Le SAG a diminué alors qu il avait la même hauteur que le SAD (balance = 0). Dans ce cas, le SAG atteint la hauteur minimale (balance = 1). Aucune action de rééquilibrage n est exigée. SAG SAD SAG SAD -27-

4 ème cas : Le SAG a diminué alors qu il était minimal (balance = 1). SAG SAD SAG SAD Dans ce cas, le critère d équilibre AVL n est plus respecté. Alors, il faut réorganiser l arbre selon ces deux cas : Cas droite-droite : c est le cas où le sous-arbre doit du SAD à une hauteur supérieur ou égale à celle de son sous-arbre gauche: 1 2 1 2 A B C A B C Dans ce cas, une simple rotation à gauche des nœuds 1 et 2 est effectuée. La racine du SAD devient la racine de l arbre en question. Cas droite-gauche : c est le cas où le sous-arbre gauche du SAD à une hauteur supérieur à celle de son sous-arbre gauche: 1 2 3 1 2 3 A B1 B2 C A B1 B2 C Dans ce cas, cet arbre est divisé lui même en sous-arbre gauche et droit, et sa racine devient la racine de l arbre en question. Remarque : Cette méthode est valable quelque soit la BALANCE entre B1 et B2 (-1, 0, ou 1). -28-

Les Arbres B et BB Définition 1: Un arbre B est un arbre N-aire (d ordre N) qui satisfait les conditions suivantes : 1- Critère d ordre : Ordonné horizontalement. 2- Critère d équilibre : Chaque noeud est constitué de N jusqu à 2N éléments, et que toutes les feuilles ont la même profondeur. 3- Seule la racine peut avoir moins de N élément. Exemple : Un arbre B d ordre 2 25 10 20 30 40 2 5 7 8 22 24 26 27 29 42 45 47 50 13 14 15 18 32 35 38 Représentation physique : Un arbre B d ordre N peut être facilement représenté par une liste chaînée nonlinéaire : typedef struct S_NoeudB { struct S_Noeud* fils[2*n + 1] ; int info[2*n]; } NoeudB; Donc, fils[i] pointe sur la racine du sous-arbre dont ses éléments sont inclues entre info[i-1] et info[i]. Exemple d utilisation des arbres B : Si la mémoire est paginée (partagée en pages), il est utile de charger du disque juste les informations qu on a besoin momentanément. Dans ce cas, l arbre B nous aide à charger les pages dont les informations qu ils portent sont dans un intervalle désigné par une feuille (entre 13 et 18 pour le 2 ème noeud). Remarque : On cas d insertion ou de retrait, une réorganisation de l arbre B est nécessaire si une des trois conditions est non respectée. -29-

Définition 2: Un arbre BB (proposé par R. Bayer) est un arbre B d ordre 1. Alors, chaque nœud possède 1 ou 2 éléments. Implémentation : Un arbre BB peut être implémenté en deux manières : 25 25 10 20 30 10 20 30 Représentation Père-Fils Représentation Père-Fils-Frère La représentation père-fils est plus proche de l implémentation physique. Par contre, la représentation père-fils-frère nous aide à réorganiser (logiquement) l arbre en cas d insertion ou de suppression. Remarque : - Un nœud peut avoir au plus soit deux fils soit un fils et un frère. - En cas de manque d un fils ou d un frère, un nœud est considéré d avoir une feuille de profondeur zéro. Représentation physique : Un arbre BB peut être facilement représenté par une liste chaînée non-linéaire : typedef struct S_NoeudBB { int info; struct S_Noeud* gauche; struct S_Noeud* droit; int TypeDroit; /*0 : Fils, 1: Frère*/ } NoeudBB; dans un arbre BB : Lorsqu un nouvel élément est inséré dans un arbre BB en lui déséquilibrant le niveau de ses feuilles, 2 cas se produisent pour chaque type d insertion (à gauche (SAG) ou à droite (SAD)): A- Insertion au SAD 1 er Cas : La racine a le SAD comme fils : -30-