









































Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Ce document fournit une introduction approfondie aux algorithmes et aux structures de données en informatique. Il explore les concepts fondamentaux tels que les types abstraits de données, leur implémentation en machine, et les opérations associées. Le document détaille également les algorithmes de tri, les opérations logiques, et la représentation des données sous forme de séquences, incluant les séquences simple et doublement indicées. Des exemples concrets et des illustrations claires facilitent la compréhension des concepts abstraits, rendant ce document précieux pour les étudiants en informatique.
Typology: Lecture notes
1 / 49
This page cannot be seen from the preview
Don't miss anything!










































Chapitre 1 : Introduction Chapitre 2 : Les itérations Chapitre 3 : Les types scalaires Chapitre 4 : Les séquences Chapitre 5 : Les procédures et les fonctions Chapitre 6 : Les chaînes de caractères Chapitre 7 : Les enregistrements Chapitre 8 : Les fichiers Chapitre 9 : La récursivité Chapitre 10 : Notion de complexité Chapitre 11 : Algorithmes de tri Chapitre 12 : Les pointeurs Chapitre 13 : Les listes Chapitre 14 : Les piles Chapitre 15 : Les files Chapitre 16 : Les arbres binaires
« Structures de données et algorithmes » - A.Aho, J. Hopcroft et J. Ullman - InterEditions
« Types de données et algorithmes » - M.C. Gaudel, M. Soria et C. Froidevaux - vol 1 - INRIA. « Eléments d’algorithmique » - D. Beauquier, J. Berstel et P. Chrétienne - Masson - 1992. « Programmation - cours et exercices » - G. Chaty et V. Vicard - Ellipse - 1992.
structures de données algorithme informel types abstraits de données programme modèle mathématique algorithme en pseudo-lg
L’écriture d’un programme informatique pour la résolution d’un problème particulier comprend plusieurs étapes : formuler le problème, spécifier les données, construire une solution, mettre en oeuvre l’algorithme, tester le programme, le documenter et enfin évaluer la complexité de la solution. Connaître le problème à traiter, c’est déjà l’avoir résolu à moitié. Au premier abord, la plupart des problèmes n’ont pas de spécification simple ni précise. En fait, certains problèmes ne sont pas formulables en termes acceptables pour une solution informatique (même si on soupçonne qu’ils peuvent être résolus par une machine).
Construire une solution passe par l’écriture d’un algorithme, c’est-à-dire une série d’instructions dont chacune peut-être réalisée en un nombre fini d’étapes et en un temps fini. Il est impératif que, indépendamment des données initiales, un algorithme se termine après un nombre fini d’instructions. Problèmes de calculabilité, de terminaison et de preuve de programme. La conception d’un algorithme se fait toujours en appliquant une démarche descendante. On part de l’analyse exprimée en langage naturel jusqu’à l’algorithme qui s’exprime dans un langage plus restreint et plus précis que le langage naturel appelé pseudo-langage (destiné à une machine virtuelle capable de comprendre certaines instructions). Au départ les données sont considérées de manière abstraite : on se donne une notation pour les décrire ainsi que l’ensemble des opérations qu’on peut leur appliquer et les propriétés de ces opérations type abstrait de données. La conception de l’algorithme se fait en utilisant les opérations du type abstrait indépendamment du choix du langage de programmation. On donne ensuite une représentation concrète des types et des opérations pour obtenir un programme exécutable écrit dans un langage spécifique. Les différentes représentations du type abstrait permettent d’obtenir différentes versions de l’algorithme si le type abstrait n’est pas un type du langage de programmation qu’on veut utiliser. Un type abstrait de données est la description d’un ensemble organisé d’objets et des opérations de manipulation sur cet ensemble. Ces opérations comprennent les moyens d’accès aux éléments de l’ensemble et, lorsque l’objet est dynamique, les possibilités de le modifier. Une structure de données est l’implémentation en machine d’un ensemble organisé d’objets avec la réalisation des opérations d’accès, de construction et de modification.
Programme bidule Const constantes {Déclaration des constantes} Type types {Déclaration des types} Var variables {Déclarations des variables globales} Procédures et fonctions Début Programme principal Fin
Une instruction est un ordre donné à la machine. L’exécution est l’action effectuée par la machine en réponse à cette instruction. Il faut bien distinguer les objets (variables) manipulés par l’algorithme et les actions qui seront effectuées par la machine (correspondant aux instructions). Affectation L’affectation (symbolisée par ) est l’action élémentaire dont l’effet est de donner une valeur à une variable, c’est-à-dire ranger une valeur à une place (en mémoire). X 4 mettre la valeur 4 dans la case identifiée par X la valeur initiale de X est « écrasée » par la nouvelle valeur La valeur correspond au contenu, la variable au contenant. Exemple : échanger deux variables Soit 2 variables entières X et Y ayant respectivement les valeurs x et y ; quelles sont les affectations qui donneront à X la valeur y et à Y la valeur x? Il faut utiliser une variable intermédiaire Z. ZX XY YZ Lecture et écriture Pour pouvoir effectuer un calcul sur une variable, la machine doit connaître la valeur de cette variable. Si cette valeur n’a pas été déterminée par des initialisations ou des calculs précédents, il faut que l’utilisateur lui fournisse ; notion de données. instruction lire lire(X) mettre dans la case X, la valeur présente sur l’organe d’entrée de la machine De la même façon, la machine doit pouvoir fournir un résultat. instruction écrire écrire(X) mettre sur l’organe de sortie de la machine, le contenu de la case X Alternatives Les alternatives permettent à la machine de choisir les exécutions suivant les valeurs des données. A. Si alors Si cond Alors inst FinSi La suite d’instructions inst est exécutée si et seulement si la condition cond est vérifiée. B. Si alors sinon Si cond Alors inst Sinon inst FinSi
La suite d’instructions inst1 est exécutée si et seulement si la condition cond est vérifiée, inst2 est exécutée sinon. C. Selon Cette instruction permet à la machine de faire un choix parmi n possibles, n étant plus grand que deux. Selon exp val1 : inst val2 : inst ... valn : instn FinSelon Selon que la valeur de exp est val1, val2 ou valn, inst1, inst2 ou instn est exécutée. Exemples : programme résolvant l’équation ax^2 + bx + c = 0 dans l’ensemble des réels Programme équation Var a, b, c : réel Début lire(a) lire(b) lire(c) Si a= Alors Si b= Alors Si c= Alors écrire(‘Tout réel est solution’) Sinon écrire(‘Pas de solution’) FinSi Sinon écrire(–c/b) FinSi Sinon Si (bb-4ac)>= Alors écrire(‘Il existe deux solutions : ’, -b+sqrt((bb-4ac)/(2a)),‘ et ’, -b-sqrt((bb-4ac)/(2*a))) Sinon écrire(‘Pas de solution’) FinSi FinSi Fin
Exemple : somme des n premiers entiers lire(N) S 0 Pour I 1 à N Incr +1 Faire SS+I FinPour
Le mot type est utilisé ici pour les variables « simples » rencontrées jusque là : le type d’une variable est l’ensemble des valeurs qu’elle peut prendre, cet ensemble étant muni des opérations qu’on peut effectuer sur ces valeurs.
Ce sont le type entier et le type réel. Ils sont dits scalaires car constitués d’objets scalaires (scalaris = échelon ; totalement ordonnés). Le type entier Il est muni des opérations suivantes :
Une proposition a l’une des deux valeurs : vrai, faux. Exemple : La proposition 4>10 a la valeur faux. Une fonction propositionnelle ou prédicat renferme des variables et devient une proposition pour chaque valeur de ces variables. Exemple : I>10, où I est une variable entière, est une fonction propositionnelle p de valeur p(I). p(I) est parfois considérée comme une variable logique (ou variable binaire) dont les valeurs sont V et F (pour vrai et faux) Opérations sur les propositions Dans l’ensemble des deux propositions V et F, on définit des opérations dites opérations logiques dont les plus importantes sont : conjonction disjonction inclusive négation implication équivalence disjonction exclusive w
Les tableaux sont une structure de données permettant de manipuler des séquences (ou suites).
Etant donné un ensemble de valeurs E et un ensemble fini totalement ordonné I d’éléments appelés indices, une séquence sur E est une application de I dans E s : I E A chaque i de I correspond un élément de E : i si I est souvent N ou une partie de N, mais ce peut être un type scalaire différent de réel car un tel type a toutes les propriétés de I. L’énumération des éléments de la séquence induit un ordre total appelé ordre induit par la séquence, qui n’est autre que l’ordre des rangs, à ne pas confondre avec l’ordre éventuel sur E. Séquence triée Etant donné un ensemble E totalement ordonné par la relation , on dit qu’on a une séquence triée lorsque l’ordre induit par la séquence est compatible avec l’ordre sur E : (i, j) I, ij ssi sisj Trier une séquence s, c’est trouver une séquence triée s’ formée des mêmes éléments que s. Trier une séquence n’est possible que s’il existe une relation d’ordre sur E.
Sorte : Seq Utilise : Entier, Elément Opérations : CréerSeq(Entier, Entier) Seq [opération interne] ChangerIème(Seq, Entier, Elément) Seq [opération interne] BorneInf(Seq) Entier BorneSup(Seq) Entier Ième(Seq, Entier) Elément Axiomes : BorneInf (CréerSeq(x,y)) = x BorneInf (ChangerIème (s,n,v)) = BorneInf (s) BorneSup (CréerSeq (x,y)) = y BorneSup (ChangerIème (s,n,v)) = BorneSup (s) Ième(CréerSeq (x,y),n) = Indéfini Ième(ChangerIème (s,n,v),m) = si m < BorneInf (s) ou m > BorneSup (s) alors Indefini sinon si m=n alors v sinon Ieme(s,m) Pour supprimer un élément, on met la valeur vide à la place de l’élément.
TAD d’une séquence triée SeqTriée : Même signature et mêmes opérations. Axiomes à ajouter : i, j [BorneInf(s), BorneSup(s)], i j Ième(s,i) Ième(s,j) ChangerIème(s,i,e) = erreur si e < Ième(s,i-1) et e > Ième(s,i+1)
Sorte : SeqCoord Utilise : Entier, Seq, Coord Opérations : CréerSeq (Entier, Entier) SeqCoord [opération interne] ChangerIème(SeqCoord, Entier, Coord) SeqCoord [opération interne] BorneInf(SeqCoord) Entier BorneSup(SeqCoord) Entier Ième(SeqCoord, Entier) Coord Compte(SeqCoord) Entier Axiomes : Compte(CréerSeq(i,j)) = 0 (toutes les cases sont à ) Compte(ChangerIème(s,i,c)) = si (Ième(s,i) = ) et (c ) alors Compte(s) + 1 sinon si Ième(s,i) et c = alors Compte(s) - 1 sinon Compte(s) où symbolise la valeur vide
Un tableau permet l’implantation d’une séquence. Le tableau est le contenant de la séquence, comme une variable élémentaire est le contenant d’une valeur scalaire. Un tableau à une dimension (appelé aussi vecteur) est une structure de données formées de cellules contiguës et d’accès direct. L’accès direct signifie que l’on peut obtenir le contenu d’une cellule sans qu’il soit nécessaire de connaître le contenu des cellules précédentes du tableau. Pour définir un tableau, il faut préciser l’identificateur du tableau, le type de I et le type de E. Const max = 30 Type tab-entier : tableau [1..max] d’entier Var t : tab-entier CréerSeq(i,j) : fait par la déclaration du type et de la variable ; par contre les initialisations restent à faire BorneInf(t) : 1 BorneSup(t) : 30 Ième(t,i) : t[i] ChangerIème(t,i,e) : t[i] e
Exemples Lecture d’une séquence doublement indicée lire(n) lire(m) Pour i 1 à n inc +1 Faire Pour j 1 à m inc +1 Faire lire(m[i,j]) FinPour FinPour Ecriture d’une séquence doublement indicée Pour i 1 à n inc +1 Faire Pour j 1 à m inc +1 Faire écrire(m[i,j]) FinPour FinPour
Une tâche est une action plus ou moins complexe qui s’exerce à un instant donné sur un ou plusieurs objets (variables). Les procédures et les fonctions permettent de réaliser des tâches.
Une procédure permet la réalisation de n’importe quelle tâche. C’est une nouvelle instruction crée à l’initiative du programmeur. Puisqu’une procédure sert à réaliser une action, elle sera identifiée par un verbe à l’infinitif symbolisant l’action. Chaque donnée et chaque résultat attendu doivent être également identifiés. Spécifier une procédure, c’est identifier
Une chaîne de caractères est un type abstrait défini comme une séquence de caractères. La longueur d’une chaîne est le nombre de caractères qui la composent. La chaîne vide est une chaîne de longueur 0. Les chaînes sont des types scalaires sur lesquels est appliqué l’ordre lexicographique : Soient A et B deux chaînes : on dit que AB ssi soit l(A)l(B) eti 1il(A) Ai=Bi soit i 1imin(l(A),l(B)) tq Ai<Bi et j 1j<i Aj=Bj La relation d’ordre AiBi dans l’ensemble des lettres est celle de l’ordre alphabétique habituel. L’ordre lexicographique étendu s’étend à l’ensemble des chaînes construites sur l’ensemble des caractères du code ASCII. Il suffit de prendre pour définition de la relation AiBi AiBi ORD(Ai)ORD(Bi)
Sorte : Chaîne Utilise : Entier, Car, Booléen Opérations : CréerChaîne() Chaîne ChangerIème(Chaîne, Entier, Car) Chaîne Concaténer(Chaîne, Chaîne) Chaîne Copier(Chaîne, Entier, Entier) Chaîne Effacer(Chaîne, Entier, Entier) Chaîne Insérer(Chaîne, Chaîne, Entier) Chaîne Ième(Chaîne, Entier) Car Egal(Chaîne, Chaîne) Booléen Lg(Chaîne) Entier Pos(Chaîne, Chaîne) Entier Exemples s «Il était une fois une vilaine sorcière» insère(efface(s, 22, 8), «gentille », 22)
Un enregistrement est une structure de donnée hiérarchisée. On peut la voir comme une cellule composée d’éléments qui peuvent être de types différents. Exemple L’information « employé » peut être représentée par un enregistrement composé de 5 éléments : NUMSS, NOM, PRENOM, ADRESSE, SITUAF ; le 4 ème^ ADRESSE se décomposant en NUMRUE, NOMRUE, NOMVILLE, CODPOS et ce dernier encore en NUMDEP et NUMBUR. employé numss nom prenom adresse situaf 2520475155412 Dupont Eve Célibataire numrue nomrue nomville codpos 25 av, Emile Zola Paris numdep numbur 75 015 La variable enregistrement employé est représentée par une arborescence de racine employé. A chaque niveau de l’arborescence, on trouve les champs. Un champ correspond à un sommet distinct de la racine ; on l’identifie à l’aide des sommets du chemin unique qui lie la racine au champ. Les champs feuilles de l’arborescence sont dits champs élémentaires. Un employé particulier est une valeur de la variable enregistrement employé. Chacune des informations placées aux feuilles est la valeur d’un champ élémentaire. L’ensemble de toutes ces valeurs constitue la valeur de la variable employé. Un type enregistrement est décrit par les types des champs structurés hiérarchiquement. Type code-postal = Enregistrement numdep, numbur : chaine de caract. FinEnregistrement adresse-pos = Enregistrement numrue, nomrue, nomville : chaine de caract codpos : code-postal FinEnregistrement employé = Enregistrement numss, nom, prénom, situaf : chaine de caract adresse : adresse-pos FinEnregistrement Var e : employe Numéro du département où habite l’employé e : e.adresse.codpos.numdep
Un fichier est une structure de données formée d’une séquence de cellules en mémoire secondaire (MS). Il permet l’implantation permanente d’une suite d’éléments ; en tant que support de la suite, il est alors le contenant, la suite le contenu. On lui associe un nom qui le définit de manière unique. L’utilisation d’un fichier se fait en 3 phases : l’ouverture du fichier, l’accès au fichier (lecture/écriture) et la fermeture du fichier. L’accès est la manière d’accéder à un élément du fichier. Il est séquentiel si pour accéder à un élément, il faut visiter les éléments précédents. Il est direct si on peut accéder aux éléments dans un ordre quelconque. Sur tout type de fichier, il est difficile d’insérer un enregistrement en milieu de fichier existant.
Les fichiers séquentiels sont des fichiers dont seul l’accès séquentiel est possible. Il est donc impossible de modifier le contenu d’un enregistrement (quand l’élément est lu, on est trop loin pour pouvoir le réécrire). Les opérations de lecture et d’écriture sont exclusives les unes des autres. Il en résulte que les seules opérations globales possibles sont : la consultation, la création ou l’ajout en fin de fichier. Type abstrait de données FAS Sorte : FAS Utilise : Chaîne, Elément Opérations : CréerFichier(Chaîne) FAS OuvrirEnEcriture(Chaîne) FAS OuvrirEnLecture(Chaîne) FAS Fermer(FAS) FAS Lire(FAS) FAS, Elément Ecrire(FAS, Elément) FAS FinFichier(FAS) Booléen {observateur} Les fichiers textes (FT) Les fichiers textes sont des fichiers séquentiels dont les éléments sont des caractères. Pour plus de souplesse, il est possible de manipuler directement des chaînes de caractères. Elles sont écrites dans le fichier comme des séquences de caractères terminées par un marqueur de fin de ligne. Type abstrait de données FT Sorte: FT sous-type de FAS[Chaine] Utilise : Chaîne Opérations : LireChaîne(FT) FT, Chaîne EcrireChaîne(FT, Chaîne) FT
Les fichiers à accès direct (ou fichiers indexés) sont des fichiers qui peuvent être adressés séquentiellement mais qui offrent en plus la possibilité d’un accès direct à un élément donné par son index (comme pour le TAD Séquence, par contre les algorithmes sont différents car le coût des accès disque est important ; on limitera donc les lectures de fichiers, quitte à utiliser des structures de données annexes en mémoire principale). Contrairement aux FAS, les FAD permettent la modification d’éléments en milieu de fichier. Il est donc possible d’ouvrir un fichier en lecture/écriture. Type abstrait de données FAD Sorte: FAD sous-type de FAS Utilise : Chaîne, Entier Opérations : OuvrirEnLectureEcriture(Chaîne) FAD AllerEn(FAD, Entier) FAD
D’autres opérations sont nécessaires pour la maintenance d’un système de fichiers. Ces opérations sont notamment la destruction et le renommage qui sont assurées par le système d’exploitation.