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

Chapitre 1 : Introduction aux bases de données

Structure fonctionnelle d un SGBD

Programmation Objet - Cours II

Information utiles. webpage : Google+ : digiusto/

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

L exclusion mutuelle distribuée

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

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

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

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

CORRECTION EXERCICES ALGORITHME 1

Introduction aux SGBDR

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

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

INITIATION A L ALGORITHMIQUE INF 102

TP3 : Creation de tables 1 seance

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

PREINSCRIPTION EN LIGNE

ORACLE TUNING PACK 11G

Utiliser Glary Utilities

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

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

4. Les structures de données statiques

Gérer ses fichiers et ses dossiers avec l'explorateur Windows. Février 2013

Mémo d'utilisation de BD Dico1.6

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

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

MANUEL UTILISATEUR BALADEUR SANTÉ AUXILIAIRES MÉDICAUX ET SAGES-FEMMES C.D.C 1.40

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

INITIATION AU LANGAGE JAVA

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

Partie 7 : Gestion de la mémoire

CAHIER DES CHARGES D IMPLANTATION

Cours: Administration d'une Base de Données

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

Capacité de mémoire Tablettes

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

Cours Programmation Système

Projet Active Object

Application 1- VBA : Test de comportements d'investissements

Cyberclasse L'interface web pas à pas

Sage CRM. 7.2 Guide de Portail Client

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

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

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

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

Licence Sciences et Technologies Examen janvier 2010

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Le Langage De Description De Données(LDD)

Le langage C. Séance n 4

4D v11 SQL Release 5 (11.5) ADDENDUM

Notion de base de données

BASES DE DONNÉES. CNAM Centre associé de Clermont-Ferrand Cycle A Année J. Darmont I. INTRODUCTION II. LES SYSTÈMES HIÉRARCHIQUES

Décompresser, créer une archive au format «ZIP»

CONDITIONS GENERALES D UTILISATION DE L APPLICATION LINK MYPEUGEOT 1 - PREAMBULE

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Introduction aux services Active Directory

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

NIMEGUE V3. Fiche technique 3.07 : Sauvegarde / Restauration manuelle

Instructions et spécifications pour la transmission en format XML de déclarations par lots. 30 mai 2015 MODULE 1

Algorithmes récursifs

Sujet Solution de sauvegarde de serveurs et postes de travail avec BackupPC et Bacula. par ALIXEN

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

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

LES TYPES DE DONNÉES DU LANGAGE PASCAL

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

Chapitre VIII. Les bases de données. Orientées Objet. Motivation

Bases de données avancées Introduction

PARAGON SYSTEM BACKUP 2010

WEA Un Gérant d'objets Persistants pour des environnements distribués

Le Langage SQL version Oracle

Séquencer une application

B2i. LE B2i Brevet Informatique et Internet. Niveau : tous. 1 S'approprier un environnement informatique de travail. b2ico1.odt.

UTILISATION DE LA BORNE PAR LE CLIENT

Le stockage local de données en HTML5

Conditions Générales d utilisation de l Application «Screen Mania Magazine»

NOTATIONS PRÉLIMINAIRES

Utiliser un tableau de données

de gestion de stock Inventaire, achats

FinImportExport Documentation Utilisateur Gestion d'environnement dans Fininfo Market

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

Les bases de données Page 1 / 8

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

La sauvegarde (backup) de votre comptabilité a pour but de vous permettre de retrouver vos données si un incident est survenu.

1. Introduction Création d'une requête...2

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

La mémoire. Un ordinateur. L'octet. Le bit

DirXML License Auditing Tool version Guide de l'utilisateur


Cours de Java. Sciences-U Lyon. Java - Introduction Java - Fondamentaux Java Avancé.

G.U.S.T.A.V. Gestion Unifiée des Systèmes de fichiers Transposée aux Appareillages Virtuels G U S T A V

F. Barthélemy. 17 mai 2005

ANALYSE DE RISQUE AVEC LA MÉTHODE MEHARI Eric Papet Co-Fondateur SSII DEV1.0 Architecte Logiciel & Sécurité Lead Auditor ISO 27001

Fonctionnalités d Acronis :

Compétences Business Objects

(Third-Man Attack) PASCAL BONHEUR PASCAL 4/07/2001. Introduction. 1 Domain Name Server. 2 Commandes DNS. 3 Hacking des serveurs DNS

Transcription:

Université Bordeaux 1 table des matières Licence Semestre 3 - Algorithmes et structures de données 1 Dernière mise à jour effectuée le 30 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 Remarques 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(ref L:liste d'objet):vide; /* positionne la clé sur le premier objet de la liste */ 1 sur 8

fonction suivant(ref 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 */ 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 */ fonction Complexité: minimum : O(1) maximum : O(n) Supprimer un élément dans la liste s'il existe fonction supprimer(ref L:liste d'objet; ref 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é */ 2 sur 8

si fonction Complexité: minimum : O(1) maximum : O(n) Exercice Réfléchir aux problèmes que soulèvent l'introduction de getcléliste et surtout setcléliste? Que déduire? Faut-il vraiment les garder? Le fait d'avoir introduit ces primitives permet à l'utilisation du type abstrait de modifier la clé de type curseur et donc par la même de pouvoir rendre la structure de donnée incohérente en cas de mauvaise utilisation. Dans la suite on ne conservera pas ces primitives 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(ref L:liste d'objet):vide; /* positionne la clé sur le dernier objet de la liste */ fonction précédent(ref 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; ref x:objet): booleen; si chercher(l,x) alors précédent(l); si valeur(l)!=null alors supprimeraprès(l); sinon supprimerentete(l) retourner(vrai) sinon retourner(faux) si fonction 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 : curseur=entier; elementliste=structure valeur:objet; 3 sur 8

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 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(ref L:listeSC):vide; L.cle=L.premier; fonction fonction suivant(ref L:listeSC):vide; L.cle=L.vListe[L.cle].indexSuivant; fonction fonction listevide(ref:listesc): booléen; retourner(l.premier==0); fonction 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(ref L:listeSC):booléen; retourner(l.premierlibre==0); fonction 4 sur 8

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. fonction prendrecellule(ref L:listeSC):curseur; var nouv:curseur; nouv=l.premierlibre; L.premierLibre=L.vListe[nouv].indexSuivant; retourner nouv; fonction fonction mettrecelluleentete(ref L:listeSC,val P:curseur):vide; L.vListe[P].indexSuivant=L.premierLibre; L.premierLibre=P; fonction Deux primitives de modifications 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 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 fonction Exercice (suite) Réfléchir aux problèmes que soulèvent l'introduction de getcléliste et surtout setcléliste? Que déduire? Faut-il vraiment les garder? 5 sur 8

Ici, on a curseur=entier. Supposons taillestock=1000. La séquence suivante mènera à une incohérence. setcléliste(l,10000); Le fait d'avoir introduit ces primitives permet à l'utilisation du type abstrait de modifier la clé de type curseur et donc par la même de pouvoir rendre la structure de donnée incohérente en cas de mauvaise utilisation. 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 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 debutliste(ref L:listeSC d'objet):vide; L.cle=L.premier; ; fonction fonction listevide(val L:listeSC d'objet):booléen; retourner (L.premier==NIL); fonction fonction suivant(ref L:listeSC d'objet):vide; /* la liste vide n'est pas testée car la primitive existe */ L.cle=L.cle^.pointeurSuivant; fonction fonction valeur(val L:listeSC d'objet):objet; /* la liste vide n'est pas testée car la primitive existe */ /* on peut donc supposer que l'utilisateur testera si la liste */ /* est vide avant l'appel ou que la personne qui programme */ /* s'assurera que valeur(nil) vaut NULL */ retourner cle^.valeurelement si fonction 6 sur 8

Tris primitives de modifications fonction créer_liste(ref L:listeSC d'objet):vide; L.premier=NIL; L.cle=NIL; fonction fonction insérerentete(ref L:listeSC d'objet; val x:objet):vide; var p:curseur; debutliste(l); new(p); p^.valeurelement=x; p^.pointeursuivant-l.premier; L.premier=p; L.cle=p; fonction fonction supprimerentete(ref L:listeSC d'objet):vide; var P:curseur; debutliste(l); P=L.premier; L.premier=L.cle; delete(p); fonction fonction inséreraprès(ref L:listeSC d'objet;val x:objet):vide; var nouv:curseur; new(nouv); nouv^.valeurelement=x; nouv^.pointeursuivant=l.cle^.pointeursuivant; L.cle^.pointeurSuivant=nouv; si fonction fonction supprimeraprès(ref L:listeSC d'objet):vide; var P:curseur; P=L.clé; P^.pointeurSuivant=L.cle^.pointeurSuivant; delete(l.cle); L.cle=P; fonction fonction detruireliste(ref L:listeSC d'objet):vide; debut tantque!estlistevide(l) faire supprimerentete(l) tantque fonction 6. Remarques Avantages et inconvénients Gestion de l'espace de stockage 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 7 sur 8

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 Faut-il introduire un test de validité sur chaque primitive? La réponse est oui si on souhaite que le code soit sécurisé dès la déition des primitives. Cependant, dans ce cas, il faut prévenir le futur utilisateur de l'existence de ces tests. En effet, dans le cas contraire on pourrait avoir par exemple un test de liste vide par l'utilisateur suivi de ce même test au sein de la primitive. On aura donc une perte d'efficacité. Dans la suite de ce cours, nous n'effectuerons pas les tests au sein des primitives pour ne pas alourdir les algorithmes. 8 sur 8