Université Bordeaux 1



Documents pareils
Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

T. A. D. pile. Chapitre 7 (suite) Listes particulières. T. A. D. file. représentation chaînée de la file algorithmique. Files

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

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

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

INITIATION A L ALGORITHMIQUE INF 102

Programmation Objet - Cours II

Structure fonctionnelle d un SGBD

SYSTÈME DE GESTION DE FICHIERS

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

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

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

Introduction aux SGBDR

Chapitre 1 : Introduction aux bases de données

L exclusion mutuelle distribuée

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

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

Créer une base de données

Cours: Administration d'une Base de Données

Correction TD Algorithmique 5.3 Pile Liste 5.3 Pile

Polymorphisme, la classe Object, les package et la visibilité en Java... 1

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

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

STAGE IREM 0- Premiers pas en Python

ORACLE TUNING PACK 11G

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

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Le langage C. Séance n 4

Capacité de mémoire Tablettes

Généralités sur le Langage Java et éléments syntaxiques.

Sommaire. Structure. Liste simplement chaînée ALGORITHME ET STRUCTURES DE DONNÉES II

Partie 7 : Gestion de la mémoire

4. Les structures de données statiques

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

Excel Avancé. Plan. Outils de résolution. Interactivité dans les feuilles. Outils de simulation. La valeur cible Le solveur

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Le Langage De Description De Données(LDD)

Recherche dans un tableau

Cours A7 : Temps Réel

Bases de données documentaires et distribuées Cours NFE04

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Systemes d'exploitation des ordinateurs

Cours Programmation Système

Algorithmes récursifs

PARAGON SYSTEM BACKUP 2010

1. Systèmes d entrée/sortie 2. Systèmes de fichiers 3. Structure de mémoire de masse (disques)

Comment faire pour créer ses propres pages html?

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

4. Groupement d objets

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Transférer et enregistrer les photos sur l'ordinateur

C++ COURS N 2 : CLASSES, DONNÉES ET FONCTIONS MEMBRES Classes et objets en C++ Membres d'une classe Spécification d'une classe Codage du comportement

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

Information utiles. webpage : Google+ : digiusto/

Créer le schéma relationnel d une base de données ACCESS

Réseaux Active Directory

Compte-rendu de projet de Système de gestion de base de données

Algorithmique et structures de données I

Installation et Réinstallation de Windows XP

Licence Sciences et Technologies Examen janvier 2010

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

Mémo d'utilisation de BD Dico1.6

Introduction aux services Active Directory

Solutions informatiques (SI) Semestre 1

Windows Live Movie Maker

Architecture des ordinateurs. Environnement Windows : sauvegarde

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

INF601 : Algorithme et Structure de données

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

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

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

Fonctionnalités d Acronis :

Le Langage SQL version Oracle

LE PROBLEME DU PLUS COURT CHEMIN

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Windows Server Chapitre 3 : Le service d annuaire Active Directory: Concepts de base

Déduplication des données : un élément essentiel de votre stratégie de protection des données

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)

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

4D v11 SQL Release 5 (11.5) ADDENDUM

Adama MBODJI MBODJ.SYSTEM

Bases de données avancées Introduction

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

TD3 - Facturation avec archivage automatisé

Conservation des documents numériques

Manuel d'utilisation d'apimail V3

Système de Gestion de Fichiers

Import de comptes (xls)

Modes Opératoires WinTrans Mai 13 ~ 1 ~

ENDNOTE X2 SOMMAIRE. 1. La bibliothèque EndNote 1.1. Créer une nouvelle bibliothèque 1.2. Ouvrir une bibliothèque EndNote 1.3. Fermer une bibliothèque

Optimisations des SGBDR. Étude de cas : MySQL

TP3 : Creation de tables 1 seance

Une fois votre tableau excel complet, cliquer sur fichier enregistrer sous type de fichier (menu déroulant) csv (séparateur : point virgule).

A. À propos des annuaires

Transcription:

table des matières Université Bordeaux 1 Licence Semestre 3 - Algorithmes et structures de données 1 Dernière mise à jour effectuée le 1 Septembre 2013 Listes Déition Liste simplement chainée Liste doublement chainée Implémentation par un tableau du type listesc Implémentation par allocation dynamique du type listesc 1. Déition Déition 6.1. Une liste est un containeur tel que le nombre d'objets (dimension ou taille) est variable, l'accès aux objets se fait indirectement par le contenu d'une clé qui le localise de type curseur. Un curseur est un type abstrait dont l'ensemble des valeurs sont des positions permettant de localiser un objet dans le containeur. Dans le cas où il n'y a pas de position, la valeur par défaut est NIL. Si c est un curseur, les primitives considérées dans ce cours sont les suivantes : accès à l'élément désigné par le curseur, contenu(c): curseur objet accès à la valeur du curseur, getcurseur(c) : curseur valeur_de_curseur positionnement d'un curseur, setcurseur(c,valeur) : curseur X valeur_de_curseur vide existence d'un élément désigné par le curseur, estvide(c) : curseur {vrai,faux} La manipulation des éléments de la liste dépend des primitives déies comme s'exécutant en temps O(1). 2. Liste simplement chainée Déition 6.2. Une liste est dite simplement chainée si les opérations suivantes s'effectuent en O(1). accès fonction valeur(val L:liste d'objet):objet; /* si la clé==nil alors le résultat est NULL */ fonction debutliste(val L:liste d'objet):vide; /* positionne la clé sur le premier objet de la liste */ fonction suivant(val L:liste d'objet):vide; /* avance la clé d'une position dans la liste */ fonction listevide(val L:liste d'objet): booleen; /* est vrai si la liste ne contient pas d'élément */ fonction getcléliste(val L: liste d'objet):curseur; /* permet de récupérer la clé de la liste */ 1 sur 7

modification Détection de liste fonction créerliste(ref L:liste d'objet):vide; fonction inséreraprès(ref L:liste d'objet; val x:objet;):vide; /* insère un objet après la clé, la clé ne change pas */ fonction insérerentete(ref L:liste d'objet val x:objet):vide; /* insère un objet en de liste, la clé est positionnée sur la tête de liste */ fonction supprimeraprès(ref L:liste d'objet):vide; /* supprime l'objet après la clé, la clé ne change pas */ fonction supprimerentete(ref L:liste d'objet):vide; /* supprime un objet en de liste, la clé est positionnée sur la tête de liste */ fonction setcléliste(ref L: liste d'objet;val c:curseur):vide; /* permet de positionner la clé de la liste) fonction detruireliste(ref L:lisetd'objet):vide; fonction estfinliste(val L:liste d'objet):booléen; retourner(valeur(l)==null) Chercher un élément dans une liste fonction chercher(ref L:liste d'objet; ref x:objet): booleen; debutliste(l); tant que!estfinliste(l) et valeur(l)!=x faire tantque retourner (!estfinliste(l)) /* la clé vaut NIL ou est positionné sur l'objet */ Complexité: minimum : O(1) maximum : O(n) Supprimer un élément dans la liste s'il existe fonction supprimer(ref L:liste d'objet; val x:objet): vide; var tmp:curseur; /* on suppose que l'objet se trouve dans la liste */ debutliste(l); tmp=nil; tant que!estfinliste(l) et contenu(getcléliste(l))!=x faire tmp= getcléliste(l); tantque si tmp==nil alors supprimerentete(l) /* la clé est sur la tête de liste */ sinon setcléliste(l,tmp); supprimeraprès(l) /* la clé est sur l'objet précédent l'objet supprimé */ si 2 sur 7

Complexité: minimum : O(1) maximum : O(n) Exercice Réfléchir aux problèmes que soulèvent l'introduction de setcléliste et surtout getcléliste? Que déduire? Faut-il vraiment les garder? 3. Liste doublement chainée Déition 6.3. Une liste doublement chainée est une liste pour laquelle les opérations en temps O(1) sont celles des listes simplement chainées auxquelles on ajoute les fonctions d'accès fonction Liste(val L:liste d'objet):vide; /* positionne la clé sur le dernier objet de la liste */ fonction précédent(val L:liste d'objet): vide; /* recule la clé d'une position dans la liste */ Supprimer un élément fonction supprimer(ref L:liste d'objet; val x:objet): booleen; si chercher(l,x) alors précédent(l); supprimeraprès(l); retourner(vrai) sinon retourner(faux) si Complexité minimum : O(1) maximum : O(n) 4. Implémentation par un tableau du type liste Chaque élément du tableau est une structure (objet,indexsuivant). Le champ indexsuivant désigne une entrée du tableau. Ainsi l'accès au suivant est en complexité O(1). La zone de stockage peut donc être décrite par : cureseur=entier; elementliste=structure valeur:objet; indexsuivant:curseur; structure; stockliste=tableau[1..taillestock] d'elementliste; Dans ce contexte, le type curseur est un entier compris entre 1 et taillestock. La valeur du champ indexsuivant est donc un entier compris entre 0 et taillestock. Il faut coder la valeur NIL : on peut par exemple choisir la valeur 0. Le premier élément doit être accessible en O(1), il faut donc conserver son index. On peut donc représenter une liste 3 sur 7

par la structure suivante : listesc=structure taillestock:entier; vliste:stockliste; premier:curseur; cle:curseur; structure; Le tableau de stockage étant grand mais pas illimité, il faudra prévoir que l'espace de stockage puisse être saturé. Primitives d'accès Ces fonctions sont immédiates. fonction debutliste(val L:listeSC):vide; L.cle=L.premier; ; fonction suivant(val L:listeSC):vide; L.cle=L.vListe[L.cle].indexSuivant; fonction listevide(val L:listeSC): booléen; retourner(l.premier==0); Gestion de l'espace de stockage Pour ajouter un élément, il faut pouvoir trouver un élément "libre" dans le tableau. Une solution compatible avec la complexité des primitives consiste à gérer cet espace de stockage en constituant la liste des cellules libres (voir un exemple). On modifie donc en conséquence la description de listesc : listesc=structure taillestock:entier; vliste:stockliste; premier:curseur; premierlibre:curseur; cle:curseur; structure; Par convention, l'espace de stockage sera saturé lorsque l'index premierlibre vaut 0 (la liste des cellules libres est vide). On déit donc la fonction de test : fonction listelibrevide(val L:listeSC):booléen; retourner (L.premierLibre==0); On déit deux primitives liées à la gestion de la liste des libres : mettrecellule : met une cellule libre en tete de la liste des cellules libres, prendrecellule : prend la cellule libre entete de la liste des cellules libres. Les opérations sont respectivement de type insererentete et supprimerentete. 4 sur 7

fonction prendrecellule(ref L:listeSC):curseur; var nouv:curseur; nouv=l.premierlibre; L.premierLibre=L.vListe[nouv].indexSuivant; retourner nouv; fonction mettrecelluleentete(ref L:listeSC,val P:curseur):vide; L.vListe[P].indexSuivant=L.premierLibre; L.premierLibre=P; Deux primitives de modification fonction créer_liste(ref L:listeSC):vide; var i:curseur; L.tailleStock=tailleMax; L.premier=0; L.premierLibre=1; pour i allant de 1 à L.tailleStock-1 faire L.vListe[i].indexSuivant=i+1; pour L.vListe[tailleStock].indexSuivant=0; L.cle=0; fonction inséreraprès(ref L:listeSC;val x:objet):booléen; var tmp,nouv:curseur; si L.cle==0 ou L.premierLibre==0 alors retourner faux; sinon tmp=l.cle; nouv=prendrecellule(l); L.vListe[nouv].valeur=x; L.vListe[nouv].indexSuivant=L.cle; L.vListe[tmp].indexSuivant=nouv; L.cle=tmp; retourner vrai; si 5. Implémentation par allocation dynamique du type listesc Chaque élément de la liste est une structure (valeurelement,pointeursuivant). le champ pointeursuivant est une adresse en mémoire, par suite, l'accès au suivant est en complexité O(1). Dans ce contexte le type curseur est un pointeur vers un élément. La zone de stockage peut donc être décrite par : cellule=structure valeurelement:objet; pointeursuivant:^cellule; structure; curseur=^cellule; listesc=structure 5 sur 7

premier:curseur; cle:curseur; structure La valeur NIL correspond donc à l'absence d'élément suivant. Primitives d'accès Ces fonctions sont immédiates. fonction premier(val L:listeSC d'objet):vide; L.cle=L.premier; ; fonction valeur(val L:listeSC):car; retourner( L.cle^.valeurElement); fonction listevide(val L:listeSC):booléen; retourner (L.premier==NIL); fonction suivant(val L:listeSC):vide; /* la liste vide n'est pas testée car la primitive existe */ L.cle=L.cle^.pointeurSuivant; Trois primitives de modifications fonction créer_liste(ref L:listeSC):vide; L.premier=NIL; L.cle:=NIL; fonction supprimerentete(ref L:listeSC):vide; var P:curseur; P=L.premier; L.premier=L.cle; delete(p); fonction inséreraprès(ref L:listeSC;val x:objet):vide; var nouv:curseur; new(nouv); nouv^.valeurelement=x; nouv^.pointeursuivant=l.cle^.pointeursuivant; L.cle^.pointeurSuivant=nouv; 6 sur 7

6. Avantages et inconvénients L'implémentation dans un tableau permet d'avoir un bloc contigu de mémoire ce qui va minimiser les accès disques. Ceci n'est pas le cas pour l'implémentation par pointeurs. L'implémentation dans un tableau nécessite de fixer au préalable le nombre maximum de cellules qui va contraindre fortement les applications : la structure de donnée peut avoir beaucoup trop de cellules ou au contraire trop peu. L'implémentation par pointeur va être très dépendante de l'implémentation des modules d'allocation dynamique du langage choisi 7 sur 7