La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

IFT-10541 Structures de données Abder Alikacem Département dinformatique et de génie logiciel.

Présentations similaires


Présentation au sujet: "IFT-10541 Structures de données Abder Alikacem Département dinformatique et de génie logiciel."— Transcription de la présentation:

1 IFT Structures de données Abder Alikacem Département dinformatique et de génie logiciel

2 Les fichiers binaires Principe Principe - un fichier est une séquence d'octets non interprétés Interprétation des données binaires Interprétation des données binaires - à la charge du programmeur - une séquence de n octets peut s'interpréter comme: un entier, un tableau, un enregistrement,... Les outils Les outils Déclaration dun pointeur de fichier Déclaration dun pointeur de fichier Ouverture et fermeture Ouverture et fermeture Les différents modes douverture Les différents modes douverture Lecture et écriture Lecture et écriture Principe du numéro dordre relatif (rrn) Principe du numéro dordre relatif (rrn) Accès direct.. Accès direct..

3 Accès direct avec fseek() fseek (f, rrn*sizeof(Personne), SEEK_SET) déplacement par rapport à origine SEEK_SET début de f SEEK_CUR position courante SEEK_END fin de f typedef struct { int age; char nom[10]; } Personne; Personne p;FILE*f; … Ecriture dans le fichierf=fopen(nomFich, "w+b") fwrite (&p, sizeof(Personne), 1, f); Lecture du fichier fread (&p, sizeof(Personne), 1, f); Accès direct pour lire ou écrire:

4 La fonction int rewind(FILE * flot ); permet de se positionner au début du fichier. Elle est équivalente à fseek( flot, 0, SEEK_SET); La fonction long ftell(FILE * flot ); retourne la position courante dans le fichier (en nombre d'octets depuis l'origine). Positionnement dans un fichier Suggestion de lecture avec des exemples:

5 Organisations et modes daccès des fichiers Mode dorganisation SéquentielRelatif ou directSéquentiel indexé Mode daccès séquentiel Mode daccès direct Hashing Mode daccès séquentiel Mode daccès indexé

6 typedef struct { short keycount; /* Le compteur de clefs. Indique quand le noeud est plein. */ struct uneCle key [MAXKEYS]; /* Le tableau des clef. */ short CHILD[MAXKEYS+1]; /* Le tableau qui contiendra les fils pointés */ } BTPAGE; Structure typique dun arbre-B

7 Ajout dans un arbre-B int main() {…… /* ouverture du fichier index*/ if btOpen() root = getRoot(); else {btfd = fopen("btree.dat", "wb+"); key = getClef(); /*première clé*/ root = createRoot(key, NIL, NIL); } key = getClef(); /* une clé à insérer*/ do { promoted = insert(root, key, &promoRrn, &promoKey); if (promoted) root = createRoot(promoKey, root, promoRrn); key = getClef(); } while( /* il y a une clé*/ ); }

8 /***** insert.c **** Contient la fonction insert() qui insère une clef dans un arbre-B. S'appelle de manière récursive tant que le bas de l'arbre n'est pas atteint. Alors, insert() insère une clef dans une feuille de l arbre. Si le noeud est plein, - appelle split() pour scinder le noeud - promotion de la clef du milieu et le rrn du nouveau nœud et essaie dinsérer la clé promue lors de ses remontées dappel */ /* insert() Arguments: rrn: Le rrn de la page dans laquelle on fait l'insertion *promoRchild: Le fils promu vers le prochain niveau key: La clef à être insérée *promoKey: La clef promue vers le prochain niveau */ Ajout dans un arbre-B

9 insert (short rrn, clef key, short *promoRchild, clef *promoKey) { …. if (rrn == NIL) {*promoKey = key; *promoRchild = NIL; return (VRAI); } btread(rrn, &page); found = searchNode(key, page, &pos); if (found) { printf("Erreur: clé dupliquée); return (FAUX); } promoted = insert(page.child[pos], key, &pBrrn, &pBkey); if (!promoted)return (FAUX); if (page.keycount < MAXKEYS) { insInPage(pBkey, pBrrn, &page); btWrite(rrn, page); return (FAUX); } else {split(pBkey, pBrrn, &page, promoKey, promoRchild, &newPage); btwrite(rrn, page); btwrite(*promoRchild, newPage); return (VRAI); }

10 RECHERCHE (RRN, CL, TROUV_RRN, TROUV_POS) si RRN == NIL alors/* condition d'arrêt de la récursion */ retourner NON TROUVE sinon lire page RRN dans PAGE regarder à travers la PAGE pour trouver CL mettre POS égale à la position où KEY apparaît ou devrait apparaître. si CL est trouvé alors/* RRN contient la clef */ TROUV_RRN = RRN TROUV_POS = POS retourner TROUVE sinon/* le FILS suivant fait référence à un niveau plus bas*/ return (RECHERCHE(PAGE.FILS[POS], CL, TROUV_RRN, TROUV_POS) finsi Recherche dans un arbre-B

11 Bool searchBTree(int rrn, uneCle key, int *trouvRRN, short *trouvPos) { short pos; Bool found; BTPAGE page; if (rrn == NIL) { return FAUX; } else { btread(rrn,&page); /*lecture d'un noeud (une page) dans le fichier B-Arbre*/ found = searchNode(key, page, &pos); /*recherche dans la page lue */ if (found) { *trouvRRN = page.key[pos].RRN_FichPrin; return true; } else { return(searchBTree(page.child[pos],key,trouvRRN,trouvPos)); } /* RRN_FichPrin est le numéro du bloc dans le fichier de données (FichPrin) où se trouve toutes les données de l'enregistrement trouvé. Chaque clé est accompagnée par l'adresse où se trouve la donnée correspondante dans un autre fichier que le fichier index B-Arbre.*/

12 visite symetrique du B-arbre pour afficher les clés triées rrn est l'adresse de la page racine du B-arbre cette fonction retourne un flag pour contrôler son exécution BTPAGE est la structure typique du B-arbre: typedef struct { short keycount; struct uneCle key [MAXKEYS]; short CHILD[MAXKEYS+1]; } BTPAGE; Visite dun arbre-B

13 int visiteSymetriqueB_Arbre(short rrn) { BTPAGE page; short pos; if (rrn == NIL) { return (-1); //arbre vide } btRead(rrn, &page); for(pos = 0; pos < page.keycount; pos++) { /*appel recursif pour chaque sous-arbres*/ visiteSymetriqueB_Arbre(page.child[pos]); printf(" - %s ", page.key[pos].nom); } /*dernier appel récursif pour le sous-arbrequi se trouve à droite de la dernière cle*/ visiteSymetriqueB_Arbre(page.child[pos]); return 0; }


Télécharger ppt "IFT-10541 Structures de données Abder Alikacem Département dinformatique et de génie logiciel."

Présentations similaires


Annonces Google