Université Bordeaux 1

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

INITIATION A L ALGORITHMIQUE INF 102

Programmation Objet - Cours II

L exclusion mutuelle distribuée

CORRECTION EXERCICES ALGORITHME 1

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

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

Rappels sur les suites - Algorithme

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

I- Définitions des signaux.

4. Les structures de données statiques

TP Contraintes - Triggers

Propagation sur réseau statique et dynamique

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

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

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

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

PROBLEMES D'ORDONNANCEMENT AVEC RESSOURCES

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

LE PROBLEME DU PLUS COURT CHEMIN

BAREME sur 40 points. Informatique - session 2 - Master de psychologie 2006/2007

Cours Informatique Master STEP

Comment retrouver le fichier "bingo" sauvegardé dans l'ordinateur? Socle commun

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

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

Introduction a l'algorithmique des objets partages. Robert Cori. Antoine Petit. Lifac, ENS Cachan, Cachan Cedex. Resume

Partie 7 : Gestion de la mémoire

Structure fonctionnelle d un SGBD

Algorithmes récursifs

1 Année LMD-STSM Algorithmique et Programmation. Série de TD 2

Chapitre 1 : Introduction aux bases de données

La NP-complétude. Johanne Cohen. PRISM/CNRS, Versailles, France.

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

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

TP3 : Creation de tables 1 seance

Ebauche Rapport finale

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

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

Vue d'ensemble OBJECTIFS

Programmation Orientée Objet

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

Chapitre 2. Classes et objets

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

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

C++ Programmer. en langage. 8 e édition. Avec une intro aux design patterns et une annexe sur la norme C++11. Claude Delannoy


Conventions d écriture et outils de mise au point

Introduction. I Étude rapide du réseau - Apprentissage. II Application à la reconnaissance des notes.

Diagramme de classes

2 Grad Info Soir Langage C++ Juin Projet BANQUE

INITIATION AU LANGAGE JAVA

Héritage presque multiple en Java (1/2)

Guide d utilisation de fonctionnalités avancées de Beyond 20/20 (application à des données départementales issues de Sit@del2)

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

Introduction aux SGBDR

MIS 102 Initiation à l Informatique

Application 1- VBA : Test de comportements d'investissements

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

F. Barthélemy. 17 mai 2005

TPE/PME : comment me situer et justifier de mon statut?

CAHIER DES CHARGES D IMPLANTATION

Utilisation de l analyse statique comme outil d aide au développement. par. Yves Gauthier

Systemes d'exploitation des ordinateurs

Sage CRM. 7.2 Guide de Portail Client

Annexe : La Programmation Informatique

Structures algébriques

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Nom-Projet MODELE PLAN DE MANAGEMENT DE PROJET

Le Raid c est quoi? Comment ca marche? Les différents modes RAID :

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 structures de données I

Systeme d'exploitation


Reaper : utilisations avancées

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

TRIGONOMETRIE Algorithme : mesure principale

Par : Abdel YEZZA, Ph.D. Date : avril 2011 / mise à jour oct (ajout de la section 3 et augmentation de la section 1)

Objet du document. Version document : 1.00

INTRODUCTION GENERALE...1 LA CONNEXION ODBC :...1. CONNEXION AU TRAVERS D EXCEL(tm)...6. LOGICIEL QUANTUM GIS (Qgis)... 10

ÉLECTRONIQUE DE LA PORTE

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

Programmation C++ (débutant)/instructions for, while et do...while

Module 0 : Présentation de Windows 2000

Contexte et motivations Les techniques envisagées Evolution des processus Conclusion

Optimisations des SGBDR. Étude de cas : MySQL

SYSTEMES DE GESTION DE DONNEES TECHNIQUES. Intégration logicielle et interfaçage CAO. Christophe MERLO Bordeaux, 28 novembre 2005

Politique de l'acei en matière de règlement des différends relatifs aux noms de domaine Version 1.3 (le 22 août 2011) ARTICLE 1 INTRODUCTION

NOTE DE SERVICE DE TRAVAIL ET POUR LES BESOINS DU SERVICE. DISPOSITIONS A PRENDRE EN MATIERE D'ASSURANCE

GROUPE EXANE POLITIQUE D'EXÉCUTION

Projet de Veille Technologique

2. RAPPEL DES TECHNIQUES DE CALCUL DANS R

Informatique industrielle A Systèmes temps-réel J.F.Peyre. Partie I : Introduction

FICHE UE Licence/Master Sciences, Technologies, Santé Mention Informatique

Correction TD algorithmique

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

LES BIBLIOTHEQUES DE WINDOWS 7

Les Enseignants de l Ere Technologique - Tunisie. Niveau 1

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 16 Septembre 2013 Introduction Complexité Pointeur Récursivité Type abstrait Containeur Implémentation 1. Complexité Déition 1.1. L'efficacité d'un algorithme est mesuré par son coût (complexité)en temps et en mémoire. Une problème NP-complet est un problème pour lequel on ne connait pas d'algorithme correct efficace c'est à dire réalisable en temps et en mémoire. Le problème le plus célèbre est le problème du voyageur de commerce. L'ensemble des problèmes NP-complets ont les propriétés suivantes : Si on trouve un algorithme efficace pour un problème NP complet alors il existe des algorithmes efficaces pour tous, Personne n'a jamais trouvé un algorithme efficace pour un problème NP-complet, personne n'a jamais prouvé qu'il ne peut pas exister d'algorithme efficace pour un problème NP-complet particulier. La complexité d'un algorithme se mesure en calculant le nombre d'opérations élémentaires, la taille de la mémoire nécessaire, pour traiter une donnée de taille n. Dans ce qui suit, nous considèrerons que la complexité des instructions élémentaires les plus courantes sur un ordinateur ont un temps d'exécution que l'on considèrera dans ce cours comme constant égal à 1. Ce qui intéresse fondamentalement l'algorithmique c'est l'ordre de grandeur (au voisinage de l'ini) de la fonction qui exprime le nombre d'instructions ou la taille de la mémoire. Déition 1.2. On déit les trois complexités suivantes : Complexité dans le pire des cas C > A(n)=max{C A (d),d donnée de taille n} Complexité dans le meilleur des cas 1 sur 7

C < A(n)=min{C A (d),d donnée de taille n} Complexité en moyenne où Pr(d) est la probabilité d'avoir en entrée une instance d parmi toutes les données de taille n. Soit D n l'ensemble des instances de taille n. Si toutes les instances sont équiprobables, on a 2. Pointeur Déition 1.3. Un pointeur est une variable qui contient une adresse mémoire directe ou relative. On écrit pour déclarer un pointeur nom_pointeur=^type_predei; Par convention un pointeur qui ne donne accès à aucune adresse contient la valeur NIL. Pour accéder à l'emplacement mémoire désigné par le pointeur on écrit le pointeur suivi de ^. La primitive new permet d'allouer dynamiquement de la mémoire au cours d'une exécution. On écrira new(nom_pointeur); Lorsque la mémoire n'est plus utilisée par le pointeur il faut impérativement la libérer. La primitive delete permet de libérer la mémoire allouée par l'intermédiaire d'un pointeur, on écrira delete(nom_pointeur); 3. Récursivité Déition 1.4. Lorsqu'un algorithme contient un appel à lui-même, on dit qu'il est récursif. Lorsque deux algorithmes s'appelent l'un l'autre on dit que la récursivité est croisée Visibilité d'une variable Une variable V locale est visible à l'intérieur du bloc où elle est déclarée. Une variable globale est visible de partout Soit la fonction P suivante fonction f():vide 2 sur 7

Complexité i = 5; afficher(i); fonction fonction appel() i = 3; afficher(i); f(); var j:entier; i = 4; afficher(i); fonction Un algorithme récursif nécessite de conserver les contextes récursifs des appels. Par suite, la récursivité peut conduire à une complexité mémoire plus grande qu'un algorithme itératif. Soit les deux fonctions calculant la factorielle : fonction facrecur(val n:entier):entier; si n==0 alors retourner(1) retourner(n*facrec(n-1)) si fonction fonction faciter(val n:entier):entier; var i,p:entier; p=1: pour i=2 à n faire p=p*i; pour retourner(p) fonction La fonction factiter est meilleure en temps et mémoire (voir). Déition 1.5. Un algorithme récursif présente une récursivité terminale si et seulement si la valeur retournée par cet algorithme est une valeur constante ou un appel à la fonction. L'algorithme facrecur ne présente pas de récursivité terminale. fonction facrecurterm(val n:entier;val res:entier):entier; si n==0 alors retourner(res) retourner(facrecurterm(n-1,n*res)) si 3 sur 7

fonction L'algorithme facrecurterm présente une récursivité terminale. La factorielle se calcule par l'appel facrecurterm(n,1) L'intérêt d'une récursion terminale est que les compilateurs détectent cette propriété et optimisent le stockage de l'environnement de la fonction. Ainsi facrecurterm aura une complexité identique à faciter. ATTENTION. Dans le cas d'un algorithme présentant deux appels récursifs, rendre la récursivité terminale ne permet pas obligatoirement au compilateur d'obtenir une complexité inférieure. fonction fiboiter(val n:entier):entier; var i,f1,f2:entier; si n==0 alors retourner(0); f1=0;f2=1; pour i=2 à n faire tmp=f1+f2; f1=f2; f2=tmp; pour retourner(f2) si fonction fonction fiborecterm(val n:entier;val res:entier):entier; casou n == 0 : retourner(res) n == 1 : retourner(res+1) autrement : retourner(fiborecterm(n-1, fiborecterm (n-2, res))); casou fonction l'appel s'effectue par fiborecterm(n,0). Dans ce qui précède, lors de l'appel de la fonction, le paramètre est précédé du mot val. Ce mot clé indique que le paramètre est passé par valeur. La valeur fournie à l'appel sera recopié dans le paramètre dans l'environnement de la fonction. On peut faire précéder le paramètre du mot clé ref. Ce mot clé indique que le paramètre est passé par référence. C'est l'adresse du (ou encore le pointeur vers le) paramètre fourni à l'appel qui sera copiée dans l'environnement de la fonction. Voir un exemple ici. 4. Type abstrait Déition 1.6. Un type abstrait est un triplet composé : d'un nom, d'un ensemble de valeurs, d'un ensemble d'opérations (souvent appelé primitives) déies sur ces valeurs. D'un point de vue complexité, on considère que les primitives (à part celle d'initialisation si elle existe) ont une complexité de temps et de mémoire en O(1). Pour désigner un type abstrait on utilise une chaine de caractères. 4 sur 7

Les nombres complexes ne sont pas des types de bases. On peut les déir comme un type abstrait : nom : nombrecomplexe ensemble de valeur : réel X réél primitives : multiplication : (nombrecomplexe X nombrecomplexe) nombrecomplexe addition : (nombrecomplexe X nombrecomplexe) nombrecomplexe module : nombrecomplexe réel 5. Containeur Déition 1.7. Une containeur est un type abstrait permettant de représenter des collections d'objets ainsi que les opérations sur ces objets. Les collections que l'on veut représenter peuvent être ordonnés ou non ordonnés, numériques ou non. L'ordre est parfois fournit par un évènement extérieur. Les collections d'objets peuvent parfois contenir des éléments identiques. Accès valeur : containeur objet Modification creercontaineur: containeur vide ajouter : containeur X objet vide supprimer : containeur X objet vide detruirecontaineur : containeur vide Un ensemble de nombres complexes peut être déi par un containeur dont les objets sont des nombrecomplexe. 6. Implémentation Déition 1.8. L'implémentation consiste à choisir une structure de donnée et les algorithmes associés pour réaliser un type abstrait. La structure de donnée utilisée pour l'implémentation peut elle-même être un type abstrait. L'implémentation doit respecter la complexité des primitives à part celle d'initialisation (celle-ci ne s'exécutera qu'une fois). Le type abstrait nombrecomplexe peut être implémenté de la manière suivante : type nombrecomplexe=structure r:réél; 5 sur 7

i:réel; structure fonction op::*(val a,b:nombrecomplexe):nombrecomplexe; var c:nombrecomplexe; c.r=a.r*b.r-a.i*b.i; c.i=a.r*b.i+a.i*b.r; retourner(c) fonction op::+(val a,b:nombrecomplexe):nombrecomplexe; var c:nombrecomplexe; c.r=a.r+b.r; c.i=a.i+b.i; retourner(c) fonction module(val a:nombrecomplexe):réel; retourner(sqrt(a.r*a.r+a.i*a.i)) Un containeur de nombrecomplexe peut être implémenté par un tableau de nombrecomplexe. containeur d'objet=tableau[1..n]de structure v:objet; b:booleen; structure Modification fonction creercontaineur(ref T:containeur de nombrecomplexe):vide; pour i allant de 1 à N faire T[i].b=faux; Pour; fonction ajouter(ref C: containeur de nombrecomplexe;val x:nombrecompl i=1; tant que i<n et C[i].b faire i=i+1; tantque si i<=n alors C[i].v=x; C[i].b=vrai si fonction supprimer(ref C: containeur de nombrecomplexe;val x:nombrecom i=1; tant que i<=n et C[i].v!=x faire i=i+1; tantque si i<=n alors C[i].b=faux si fonction detruirecontaineur(ref C : containeur de nombrecomplexe):vide pour i allant de 1 à N faire C[i].b=faux; Pour; Accès 6 sur 7

fonction valeur(ref C : containeur de nombrecomplexe):nombrecomplexe; /* retourne le premier nombre complexe /* i=1; tant que i<n et!c[i].b faire i=i+1; tantque si i<=n alors retourner(c[i].v) retourner(null) si 7. Quelques remarques importantes Soit B une expression booléenne, ne jamais écrire si B alors retourner(vrai) retourner(faux) si On écrit toujours retourner(b) Ne pas confondre la valeur NIL qui est une valeur de pointeur et signifie que le pointeur est non affecté avec la valeur NULL qui correspond à une valeur de la variable sans signification. Le type abstrait nombrecomplexe peut être implémenté en utilisant la valeur NULL de la manière suivante: containeur de NombreComplexe=tableau[1..N]de nombrecomplexe; Modification fonction creercontaineur(ref T:containeur de nombrecomplexe):vide; pour i allant de 1 à N faire T[i]=NULL; Pour; Un excellent exercice consiste à réécrire les toutes les fonctions du container puis à l'implémenter en C. 7 sur 7