Algorithmes et Structures de Données: Une Introduction, Lecture notes of Computer science

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

2021/2022

Uploaded on 05/25/2025

julioe-ekounouj
julioe-ekounouj 🇿🇦

5 documents

1 / 49

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
Algorithmes et Structures de données Nathalie Chaignaud
GM3
Plan du Cours
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
Bibliographie
«Structures de données et algorithmes» - A.Aho, J. Hopcroft et J. Ullman - InterEditions
- 1987.
«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.
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31

Partial preview of the text

Download Algorithmes et Structures de Données: Une Introduction and more Lecture notes Computer science in PDF only on Docsity!

GM

Plan du Cours

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

Bibliographie

 « 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

GM

Chapitre 1 - Introduction

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).

1. Algorithme, type abstrait de données et structure de données

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.

GM

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

3. Instruction

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. ZX XY YZ 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

GM

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

GM

Exemple : somme des n premiers entiers lire(N) S 0 Pour I 1 à N Incr +1 Faire SS+I FinPour

GM

Chapitre 3 – Les Types scalaires

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.

1. Les types de base

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 :

      • div mod Le type réel Il est muni des opérations suivantes :
      • / En mathématique, l’ensemble des entiers est inclus dans l’ensemble des réels. En programmation, les entiers et les réels ont des représentations différentes. Var i : entier b : réel i  5 b  i L’affectation respecte l’inclusion de N dans R, mais s’accompagne d’un changement de représentation interne. Le contenu de b est 5, mais la représentation interne est de la forme 0,5*10^1. En revanche, l’affectation d’une variable réelle à une entière n’est pas possible directement même si cette variable contient une valeur entière. b  3. i  trunc(b) {partie entière}

2. Le type booléen

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

GM

Chapitre 4 – Les Séquences

Les tableaux sont une structure de données permettant de manipuler des séquences (ou suites).

1. Définition d’une séquence

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, ij ssi sisj 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.

2. Type abstrait de données d’une séquence

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.

GM

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)

TAD d’un séquence de coordonnées SeqCoord, dont on veut connaître le nombre

effectif d’éléments :

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

3. Implémentation d’une séquence

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

GM

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

GM

Chapitre 5 – Les procédures et les fonctions

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.

1. Les procédures

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

  • l’action réalisée par cette procédure,
  • les paramètres formels (servant à écrire la procédure)
    • l’ensemble des données nécessaires, ainsi que leur type,
    • l’ensemble des résultats produits, ainsi que leur type.  c’est décrire l’état des données et des résultats avant et après exécution de la procédure. Procédure nom-proc (E variables avec types ; E/S variables avec types ; S variables avec types)  E : paramètre de donnée, ne subit aucune altération au cours de l’exécution de la procédure (pas d’affectation de ce paramètre dans la procédure).  S : paramètre résultat de l’action, sa valeur n’est pas significative avant l’exécution de la procédure (initialisation obligatoire de ce paramètre dans la procédure).  E/S : paramètre de donnée-résultat, sert de donnée et de résultat. Exemple : échange de deux variables. Procédure échanger (E/S A, B : entier) Var C : entier Début CA AB BC Fin Les procédures doivent être placées avant le début des instructions du programme et après la déclaration des variables. Pour appeler une procédure, il suffit de donner son identificateur avec, entre parenthèses, la liste des variables du programme sur lesquelles l’action va s’exercer. Ces variables sont appelées paramètres effectifs. Contraintes à suivre :  même nombre de paramètres effectifs que de paramètres formels,  les para mètres effectifs sont associés aux paramètres formels dans leur ordre,  les para mètres effectifs doivent être du même type que les paramètres formels associés,

GM

Chapitre 6 – Les chaînes de caractères

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 AB ssi soit l(A)l(B) eti 1il(A) Ai=Bi soit i 1imin(l(A),l(B)) tq Ai<Bi et j 1j<i Aj=Bj La relation d’ordre AiBi 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 AiBi AiBi ORD(Ai)ORD(Bi)

Le TAD chaîne

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)

GM

Chapitre 7 – Les enregistrements

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

GM

Chapitre 8 – Les fichiers

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.

1. Les fichiers à accès séquentiel (FAS)

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

GM

2. Les fichiers à accès direct (FAD)

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

3. Autres opérations sur les fichiers

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.