Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parCôme Pasquier Modifié depuis plus de 10 années
1
Partie Informatique Algorithmique Introduction A. LOTFI
Powerpoint Templates
2
Objectifs Algorithmique Complexité algorithmique Les types de données
Les structures de données La récursivité Les Arbres Les algorithmes de Tri
3
Algorithmique Introduction
Un algorithme est une suite d’instructions, qui une fois exécutée correctement, conduit à un résultat donné. L’algorithmique exprime les instructions à effectuer pour résoudre un problème donné indépendamment des particularités de tel ou tel langage. Pour fonctionner, un algorithme doit donc contenir uniquement des instructions compréhensibles par celui qui devra l’exécuter. La vérification méthodique, pas à pas, de chacun de vos algorithmes représente plus de la moitié du travail à accomplir... et la garantie de vos progrès.
4
Algorithmique Introduction Donc :
Un Algorithme : enchaînement des actions (instructions) nécessaires pour résoudre un problème On trouve différentes appellations langage algorithmique pseudo-langage de programmation pseudo-code …
5
Algorithmique Introduction Qu’est ce qu’un ordinateur ?
Une machine totalement dénuée d'intelligence Capable d’effectuer un grand nombre de tâches Exécute très rapidement et sans erreurs les ordres qu'on lui donne Qu’est-ce qu’un programme ? Assemblage et enchaînement d’instructions élémentaires Écrit dans un langage de programmation Exécuté par un ordinateur afin de traiter les données d’un problème Et renvoyer un ou plusieurs résultats Un programme est réalisé dans le but d’effectuer un ensemble de traitements particuliers sur un ensemble de données Définir sous quelle forme les données initiales seront fournies à l’application Définir sous quelle forme les résultats seront communiqués Expliciter les différentes actions à effectuer pour réaliser cette tâche
6
Algorithmique Données et Mémoire 33 1 2 3 4 56 5 6 7 8 9 10 11 12 4
La mémoire : c'est l'espace où les données sont rangées pour fin d'utilisation par l'algorithme La mémoire est comme un ensemble de casiers postaux Une case contient une donnée Pour accéder à une donnée, on indique le numéro du casier (ou adresse mémoire) Pour stocker une donnée, on indique le numéro du casier et la valeur à stocker 33 1 2 3 4 56 5 6 7 8 9 10 11 12 4
7
Algorithmique Codage des Nombres Plusieurs bases de codage possibles
Base 10 (décimale) : base de calcul usuelle Base 24 : heures Base 60 : minutes, secondes, degrés Base 12 : douzaine Bases les plus utilisées Pour les êtres humains : base décimale Pour un ordinateur : Base binaire (2) et dérivées : base hexadécimale (16) ou octale (8) Origine de l'utilisation du binaire : absence ou présence de courant électrique (0 ou 1) comme base de codage
8
Algorithmique Codage des Nombres Historique Antiquité
Codage des nombres : dans un but de calcul Apparition du calcul Dès la préhistoire on comptait avec des cailloux et avec ses doigts Calcul vient du latin calculi signifiant caillou Antiquité Chaque civilisation (Musulmans, Grecs, Romains, Chinois, Mayas ...) avait développé des : Systèmes et bases de numérotation Méthodes pour compter et calculer
9
Algorithmique Origine des systèmes de numérotation Codage des Nombres
Base 10 : nombre des doigts des 2 mains Chiffres romains : V = 5 et X = 10 Base 20 : mains et pieds Moins pratique, a disparu ... Base 12 : 3 phalanges et 4 doigts (le pouce sert à positionner le chiffre) Base 60 : les doigts de la deuxième main comptent le deuxième chiffre (60 = 5 x 12)
10
Algorithmique Codage des Nombres Pour une base B, il y a B symboles différents (les chiffres de cette base) Base 10 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Base 2 : 0, 1 un chiffre = un bit (binary digit) Base 4 : ▲♦■● Base 8 : 0, 1, 2, 3, 4, 5, 6, 7 Base 16 : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
11
« anan-1 ... a1a0 » codé dans une base B
Algorithmique Conversion des bases Valeur en décimal (base 10) d'un nombre « anan a1a0 » codé dans une base B anBn + an-1Bn a1B + a0 En prenant la valeur décimale de chaque chiffre ax Exemples (1234)10 = 1 x x x (11001)2 = 1 x x x x 2 + 1 = = 25 (1C04)16 = 1 x x x = x = 7172 avec A = 10, B = 11, C = 12, D = 13, E = 14, F = 15
12
Algorithmique Schéma de Horner Conversion des bases
Pour calculer la valeur décimale N de : « anan-1...a1a0 » codé en base B Pn = anB + an-1 Pn-1 = PnB + an-2 Pn-2 = Pn-1B + an-3 ... P1 = P2B + a0 = N Exemple : pour (1234)10, B=10, n=3 p3 = a3 x B + a2 = 1 x = 12 p2 = p3 x B + a1 = 12 x = 123 p1 = p2 x B + a0 = 123 x = 1234
13
Algorithmique Schéma de Horner Conversion des bases Exemples :
(11001)2, B=2, n=4 p4 = 1 x = 3 p3 = 3 x = 6 p2 = 6 x = 12 p1 = 12 x = 25 (1C04)16, B=16, n=3 p3 = 1 x = 28 p2 = 28 x = 448 p1 = 448 x = 7172
14
Algorithmique Décimal base B Conversion des bases Exemple :
(1234)10 en décimal 1234 / 10 = 123 reste 4 123 / 10 = 12 reste 3 12 / 10 = 1 reste 2 1 < 10 donc on arrête Résultat : 1234
15
Algorithmique Décimal base B Conversion des bases Exemple :
(25)10 en binaire 25 / 2 = 12 reste 1 12 / 2 = 6 reste 0 6 / 3 = 2 reste 0 3 / 2 = 1 reste 1 1 < 2 donc on arrête Résultat : (11001)2
16
Conversion du binaire à l'octal/hexadécimal ou inverse
Algorithmique Conversion des bases Décimal base B Cas Particuliers Conversion du binaire à l'octal/hexadécimal ou inverse 1 chiffre octal = un groupe de 3 chiffres binaires 1 chiffre hexadécimal = un groupe de 4 chiffres binaires (000)2 = 0, (001)2 = (110)2 = 6, (111)2 = 7 Avec 3 bits, on code les 8 chiffres de la base octale (0000)2 = 0, (0001)2 = (1110)2 = 14 = (E)16, (1111)2 = 15 = (F)16 Avec 4 bits, on code les 16 chiffres de la base hexadécimale
17
Conversion du binaire à l'octal/hexadécimal ou inverse
Algorithmique Conversion des bases Décimal base B Cas Particuliers Conversion du binaire à l'octal/hexadécimal ou inverse Exemple : ( )2 en octal On regroupe par groupes de 3 bits : On rajoute des zéros au début au besoin (010)2 = 2, (110)2 = 6, (001)2 = 1, (101)2= 5 ( )2 = (2615)8
18
Conversion du binaire à l'octal/hexadécimal ou inverse
Algorithmique Conversion des bases Décimal base B Cas Particuliers Conversion du binaire à l'octal/hexadécimal ou inverse Exemple : ( )2 en hexadécimal On regroupe par groupes de 4 bits : (0011)2 = 5 , (1000)2 = 8, (1101)2 = 13 ( )2 = (58D)16
19
Algorithmique Codage des Nombres
On a vu le codage des nombres entiers positifs dans différentes bases. Mais on doit aussi pouvoir manipuler des : Nombres réels Nombres négatifs Le signe … Représentation en virgule fixe: (N)B = an an a1 a0 , b1 b2 ... bm-1 bm = anBn + an-1Bn a1B + a0 + b1B-1 + b2B bm-1B-m+1 + bmB-m
20
Représentation en virgule flottante
Algorithmique Codage des Nombres Représentation en virgule flottante Principe et intérêts Avoir une virgule flottante et une précision limitée Ne coder que des chiffres significatifs N = +/- M x BE N = nombre codé M = mantisse : nombre de X chiffres de la base B E = exposant : nombre de Y chiffres de la base B +/- = codage du signe : positif ou négatif Le nombre est présenté sous forme normalisée pour déterminer la mantisse et exp. Pas de chiffre avant la virgule : 0,XXXXX x BE
21
Représentation en virgule flottante
Algorithmique Codage des Nombres Représentation en virgule flottante Exemples 1234,5 en base 10 On normalise pour n'avoir que des chiffres après la virgule : 0,12345 x 104 Mantisse codée = 12345, exposant = 4, signe = + Standard IEEE 754 : codage binaire de réels en virgule flottante Précision simple : 32 bits 1 bit de signe, 8 bits exposant, 23 bits mantisse Précision double : 64 bits 1 bit de signe, 11 bits exposant, 52 bits mantisse
22
Algorithmique Codage des Nombres Les Entiers
Principe : considérer que le bit de poids fort code le signe 0 = entier positif, 1 = entier négatif Bit de poids fort : le plus à gauche Bit de poids faible : le plus à droite Les autres bits codent le nombre en valeur absolue Nécessité de savoir sur combien de bits on code le nombre pour déterminer quel bit code quoi Exemples si codage sur 4 bits (0111)2 = 7 car bit de poids fort à 0 (1111)2 = -7 car bit de poids fort à 1
23
Algorithmique Codage des Nombres Les Entiers
Un ordinateur manipule des nombres binaires sous forme de 8 bits = un Octet = 1 Byte Données codées sur un ou plusieurs octets : 8 bits, 16 bits, 32 bits, 64 bits ... Avec p bits, on code N valeurs avec 0 ≤ N ≤ 2p - 1 Avec 16 bits, on peut coder 216 = valeurs différentes Soit les entiers de 0 à pour les entiers positifs
24
Algorithmique Codage des Nombres Les Entiers
Pour un entier signé sur 16 bits : Nombres positifs : 0XXXXXXXXXXXXXXX Nombres négatifs : 1XXXXXXXXXXXXXXX On a 15 bits pour coder la valeur absolue du nombre soit 215 = valeurs possibles Pour le positif : de 0 à 32767 Pour le négatif : de -0 à Pour p bits : -(2p-1 - 1) ≤ N ≤ 2p-1 - 1 Inconvénient : on code 2 fois le 0
25
Algorithmique Les Variables
Dans un programme informatique, on va avoir en permanence besoin de stocker provisoirement des valeurs de types différents: utilisation de variables Une variable est une boîte, que le programme (l’ordinateur) va repérer par une étiquette. Pour avoir accès au contenu de la boîte, il suffit de la désigner par son étiquette. Déclaration des variables => créer la boîte et de lui coller une étiquette. Le nom de la variable (l’étiquette de la boîte) obéit à des impératifs changeant selon les langages: Un nom de variable correct commence impérativement par une lettre. Comporte des lettres et des chiffres, mais qui exclut la plupart des signes de ponctuation, en particulier les espaces.
26
Algorithmique Le Type Le type de la boite précise ce que l’on voudra mettre dedans, car de cela dépendent la taille de la boîte Les principaux types de base sont : Types numériques Type alphanumérique Type booléen Le type est défini en fonction des besoins Le type booléen est très économique en termes de place mémoire occupée, puisque pour stocker une telle information binaire, un seul bit suffit Les autres types sont généralement composés à partir des types de base.
27
Algorithmique L’instruction d’affectation
Affecter une variable c’est lui attribuer une valeur => mettre un contenu dans la boite. En pseudo-code, l'instruction d'affectation se note avec le signe ← maVariable ← 24 //Attribue la valeur 24 à la variable maVariable Il faut vérifier : La comptabilité entre le contenant et le contenu La variable désigné doit être au préalable déclarée
28
Différence avec le = mathématiques
Algorithmique L’instruction d’affectation Différence avec le = mathématiques Quand on dit qu'une variable prend pour valeur une autre variable, ça ne veut pas dire qu'elles seront toujours égales ! Cela veut seulement dire que la première variable va prendre la valeur de la seconde Le contenu de la première boite sera le même celui de la seconde boite… Mais si on modifie le contenu de la seconde boite après, ça n’a pas d’impact sur le contenu de la première boite !
29
Différence avec le = mathématiques
Algorithmique L’instruction d’affectation Différence avec le = mathématiques Exemples Algo : x <- y différend de y <- x Maths : x = y équivaut à y = x Algo : x + 12 <- y impossible ! Maths : x + 12 = y a un sens Algo : x <- x + 7 a un sens Maths : x = x + 7 impossible
30
Algorithmique Exemple de variables Identificateur : X Type : entier
Mémoire centrale (mémoire vive) Identificateur : X Type : entier Valeur : 25 Identificateur : Y Type : réel Valeur : 3,7 X 25 Y 3,7
31
Algorithmique Les Opérateurs
Les opérations possibles sur les variables dépendent de leur type On ne peux pas par exemple multiplier des mots… Pour le Type Réel
32
Algorithmique Les Opérateurs Pour le Type Entier
33
Algorithmique Les Opérateurs Pour le Type Caractère
Pour le Type Chaîne de caractères
34
Algorithmique Les Opérateurs Pour le Type Booléen
35
Algorithmique Exemples
Quelles seront les valeurs des variables A et B après exécution des instructions suivantes ? Variables A, B en Entier Début A ← 5 B ← 2 A ← B B ← A Fin Moralité : les deux dernières instructions permettent- elles d’échanger les deux valeurs de B et A ? Si l’on inverse les deux dernières instructions, cela change-t-il quelque chose ?
36
Algorithmique Correction Instruction Etat des Variables
A ← 5 A = 5 B = ? B ← 2 A = 5 B = 2 A ← B A = 2 B = 2 B ← A A = 2 B = 2 Les deux dernières instructions ne permettent donc pas d’échanger les deux valeurs de B et A, puisque l’une des deux valeurs (celle de A) est ici écrasée. Si l’on inverse les deux dernières instructions, cela ne changera rien du tout, hormis le fait que cette fois c’est la valeur de B qui sera écrasée. Début A ← 5 B ← 2 A ← B B ← A Fin
37
Algorithmique Exemples
Un classique absolu, qu’il faut absolument maîtriser : écrire un algorithme permettant d’échanger les valeurs de deux variables A et B, et ce quel que soit leur contenu préalable. Solution Début … C ← A A ← B B ← C Fin Remarque On est obligé de passer par une variable dite temporaire (la variable C).
38
Algorithmique Exercice
On dispose de trois variables A, B et C. Ecrivez un algorithme transférant à B la valeur de A, à C la valeur de B et à A la valeur de C (toujours quels que soient les contenus préalables de ces variables). Solution Début … D ← C C ← B B ← A A ← D Fin Remarque En fait, quel que soit le nombre de variables, une seule variable temporaire suffit…
39
Algorithmique Les Instructions Les Branchements Le test booléen
Si condition alors Instruction(s) Sinon Instruction(s) Fin si (fsi)
40
Algorithmique Les Instructions Les Branchements Sélection de cas
Cas [variable] 1er cas: Instruction(s) 2ème cas: Instruction(s) … Cas échéant: Instruction(s) Fin cas
41
Algorithmique Les Instructions Les Boucles La boucle pour
Pour [variable] de v_début à v_fin faire Instruction(s) Fin Pour (fpour)
42
Algorithmique Les Instructions Les Boucles
La boucle tant que (while … do) Tant que condition(s) vérifiée faire Instruction(s) Fin tant que (ftq) Autre forme (do … while) Faire Tant que condition(s) vérifiée
43
Algorithmique Les Instructions Les Boucles
La boucle répéter (repeat … until) Répéter Instruction(s) Jusqu’à condition de sortie
44
Algorithmique Les Instructions Les Boucles Choix de la boucle
La règle est simple : Si le nombre d’itérations est connu à priori, alors on utilise une boucle Pour. Sinon Si l’instruction est exécutée au moins une seule fois, on utilise Répéter…jusqu’à (ou sa version faire…tant que) Sinon on utilise la boucle Tant que … faire
45
Algorithmique Les Procédures Syntaxe
Une procédure est un sous-programme Sert à découper un programme en plusieurs morceaux Chaque procédure définit une nouvelle instruction qu’on peut appeler en tout endroit du programme réutilisation de code Découpage de programme analyse descendante du plus général au détail Syntaxe Procédure nom_procédure([Paramètres]) Début Instruction(s) Fin
46
Algorithmique Les Fonctions Syntaxe
Une fonction est une procédure qui renvoie un résultat, de manière à ce qu’on puisse l’appeler dans une expression : y cos(x)+1 Syntaxe Fonction nom_fonction([Paramètres]) Début Instruction(s) Retourner(résultat) Fin
47
Algorithmique Complexité Algorithmique
L’exécution d’un programme a un coût Le temps d’exécution L’espace mémoire requi Aujourd’hui, point sensible temps La théorie de la complexité algorithmique s'intéresse à l'estimation de l'efficacité des algorithmes. Elle s'attache à la question : entre différents algorithmes réalisant une même tâche, quel est le plus rapide et dans quelles conditions ? Illustration : Etude de la complexité et mesure des performances de quelques algorithmes bien connus Tri par sélection Tri par insertion Tri par bulles Tri rapide
48
Algorithmique Complexité Algorithmique Domination
La notation grand O de Landau dénote le caractère dominé d'une fonction par rapport à une autre. Définition Soient f et g deux fonctions de la variable réelle x. On dit que f est dominée par g en +∞, ou que g domine f en +∞, et on note Lorsqu'il existe des constantes N et C telles que Intuitivement, cela signifie que f ne croît pas plus vite que g.
49
Algorithmique Complexité Algorithmique
Voici une liste de catégories de fonctions couramment utilisées en analyse. notation croissance O(1) constante O(log(n)) logarithmique O((log(n))c) polylogarithmique O(n) linéaire O(n log(n)) parfois appelée « linéarithmique », ou « quasi-linéaire » O(n2) quadratique O(nc) polynomiale O(cn) exponentielle, parfois « géométrique » O(n!) factorielle
50
Algorithmique Complexité Algorithmique Règles utiles Règle 1:
La complexité d’un semble d’instructions est la somme des complexités de chacune d’elles. Règle 2: Les opérations élémentaires telle que l’affectation, test, accès à un tableau, opérations logiques et arithmétiques, lecture ou écriture d’une variable simple ... etc, sont en O(1) Règle 3: Instruction if: maximum entre le then et le else Le switch: maximum parmi les différents cas
51
Algorithmique Complexité Algorithmique Règles utiles
Règle 4: Instructions de répétition La complexité de la boucle for est calculée par la complexité du corps de cette boucle multipliée par le nombre de fois qu’elle est répétée. En règle générale, pour déterminer la complexité d’une boucle while, il faudra avant tout déterminer le nombre de fois que cette boucle est répétée, ensuite le multiplier par la complexité du corps de cette boucle. Règle 5: Procédure et fonction Leur complexité est déterminée par celle de leur corps. L’appel à une fonction est supposé prendre un temps constant en O(1) Notons qu’on fait la distinction entre les fonctions récursive et celles qui ne le sont pas Dans le cas de la récursivité, le temps de calcul est exprimé comme une relation de récurrence.
52
Algorithmique Récursivité
53
Algorithmique Récursivité Définition:
Une fonction est récursive si elle fait appel à elle-même d’une manière directe ou indirecte La récursivité est une technique de programmation très utile qui permet de trouver des solutions d’une grande élégance à un certain nombre de problèmes. Attention! Lorsqu’elle mal utilisée, cette subtilité informatique peut créer un code totalement inefficace. Propriétés La récursivité (appels de la fonction à elle-même) doit s’arrêter à un moment donné (test d’arrêt). Autrement, l’exécution va continuer indéfiniment Un processus de réduction: à chaque appel, on doit se rapprocher de la condition d’arrêt.
54
Algorithmique Récursivité Exemple
Vision itérative: Un escalier de hauteur h c’est : une séquence de h marches Vision récursive: Un escalier de hauteur h c’est : une marche suivie d’un escalier de hauteur h−1
55
Recette de récursivité
Algorithmique Récursivité Recette de récursivité S’assurer que le problème peut se décomposer en un ou plusieurs sous-problèmes de même nature Identifier le cas de base qui est le plus petit problème qui ne se décompose pas en sous-problèmes Résoudre(P) = si P est un cas de base, le résoudre directement sinon décomposer P en sous-problèmes P1, P2,... résoudre récursivement P1, P2,... combiner les résultats obtenus pour P1, P2, …, pour obtenir la solution et avoir la solution au problème de départ.
56
Algorithmique Récursivité Fonctionnement Exemple
Création d’une pile pour la sauvegarde entre autres des paramètres d’appels de la procédure et la l’adresse de retour. Exemple Calculer le factoriel de n, noté n! Le problème est: Calculer le factoriel d'un nombre entier donné en entrée. En entrée: Nous avons n nombre entiers qui sont plus grands ou égaux à 0. Sortie: Nous avons un nombre entier qui représente le factoriel de n.
57
Algorithmique Récursivité Factoriel
fonction fact (n : Naturel) : Naturel Debut si n=0 ou n=1 alors retourner 1 sinon retourner n*fact(n-1) Finsi Fin Exemple Fact(4)=4*Fact(3) Fact(3)=3*Fact(2) Fact(2)=2*Fact(1) Fact(1)=1 4*6=24 3*2=6 2*1=2 1
58
Empilage du contexte local
Algorithmique Récursivité Empilage du contexte local Chaque procédure stocke dans une zone mémoire les paramètres les variables locales Cette zone s’appelle la pile car les données sont empilées lors de l ’appel d’une procédure désempilées à la fin de la procédure A chaque appel récursif, l ’ordinateur empile donc les paramètres qui doivent changer à chaque appel
59
Algorithmique Récursivité Inverser une chaîne Exemple
Fonction inverse(ch : chaîne) début l= Longueur(ch); Si (l<=1) retourner ch; Sinon retourner inverse(Sous-Chaîne(ch,2,l))& Ch(1); Fin Si Fin Exemple inverse(“abcd”)-> inverse(“bcd”)&”a” inverse(“bcd”)-> inverse(“cd”)&”b” inverse(“cd”)-> inverse(“d”)&”c” dc dcb dcba
60
Récursivité terminale
Algorithmique Récursivité Récursivité terminale Définition : L'appel récursif est la dernière instruction et elle est isolée. Exemple : fonction plus (a,b : Naturel) : natuel début si b=0 alors retourner a sinon retourner plus(a+1,b-1) Finsi Fin Exécution plus(4,2)=plus(5,1)=plus(6,0)=6
61
Récursivité non terminale
Algorithmique Récursivité Récursivité non terminale Définition : L'appel récursif n'est pas la dernière instruction et/ou elle n'est pas isolée (fait partie d'une expression) Exemple : fonction plus (a,b : Naturel) : natuel début si b=0 alors retourner a sinon retourner 1+plus(a,b-1) Finsi Fin Exécution plus(4,2)=1+plus(4,1)=1+1+plus(4,0)=1+1+4=6
62
Algorithmique Récursivité Les Tours de Hanoï
Les tours de Hanoï est un jeu solitaire dont l'objectif est de déplacer les disques qui se trouvent sur une tour (par exemple ici la première tour, celle la plus a gauche) vers une autre tour (par exemple la dernière, celle la plus a droite) en suivant les règles suivantes : on ne peut déplacer que le disque se trouvant au sommet d'une tour ; on ne peut déplacer qu'un seul disque a la fois ; un disque ne peut pas être posé sur un disque plus petit.
63
Algorithmique Récursivité Les Tours de Hanoï Etude du problème
Un peu de jeu Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3
64
Reformulation du problème
Algorithmique Récursivité Les Tours de Hanoï Etude du problème Ceci correspond à Hanoï avec n-1 disques Reformulation du problème Si on a "n" disques à déplacer alors : on déplace "n-1" disques vers le pilier intermédiaire on déplace le disque "n" du pilier initial vers le pilier final on déplace les "n-1" disques du pilier intermédiaire vers le pilier final Pilier 1 Pilier 2 Pilier 3 Pilier 1 Pilier 2 Pilier 3
65
Algorithmique Récursivité Les Tours de Hanoï Algorithme
Procedure hanoi(nbdisk, source, destination: Naturels) Début intermediaire = 6-(source+destination); Si (nbdisk > 0) Alors hanoi(nbdisk -1, source, intermediaire); Afficher("disque “& nbdisk &" de “&Source & "- >" & destination); hanoi(nbdisk-1, intermediaire, destination); Fin Si Fin Voir le programme en PHP par exemple
66
Algorithmique Récursivité Hanoï - Complexité
En général, on a 2n-1 déplacements pour n disques Soit O(2n) : complexité exponentielle Si par exemple un déplacement coûte 1 seconde Pour 64 disques, on a : 264-1= secondes C’est soit 585 milliard années disques 1 2 3 4 5 … déplacements 7 15 31
67
Efficacité de la Récursivité
Algorithmique Récursivité Efficacité de la Récursivité Un algorithme récursif est légèrement moins rapide qu’un algorithme itératif équivalent Temps nécessaire à l ’empilage et au dépilage des données La récursivité utilise plus de ressources mémoire pour empiler les contextes La récursivité est plus « élégante » Les algorithmes récursifs sont souvent plus faciles à écrire
68
Algorithmique Les Arbres Structures de données
En informatique, une structure de données est une structure logique destinée à contenir des données, afin de leur donner une organisation permettant de simplifier leur traitement. Une structure de données implémente concrètement un type abstrait. Différentes structures de données existent : Structures finies constantes variables enregistrements structures composées finies Structures indexées tableaux sur [1..n] tableaux sur [1..n][1..m] tableaux associatifs Structures récursives listes arbres graphes
69
Algorithmique Structures Les Tableaux
Un tableau de taille n est une structure très simple constituée de emplacements consécutifs en mémoire. Il est donc possible d'accéder à un élément d'un tableau en temps constant O(1) pourvu que l'on connaisse sa position (ou indice). Un tableau est donc une structure très simple et très efficace. Il n'est cependant pas possible de modifier la taille d'un tableau, ce qui est gênant pour un certain nombre d'algorithmes. On dit cette structure est statique. Le nombre d'éléments qu'elle contient ne peut pas varier. Le principe d'un tableau est donc très simple : on stocke les éléments dans des cases, chaque case étant étiquetée d'un numéro (généralement appelé indice). Pour accéder à un élément particulier d'un tableau, on donne son indice.
70
Algorithmique Structures Les Listes Chaînées
Une liste chaînée est une liste à accès séquentiel, où chaque élément contient une valeur et une référence à l'élément suivant. L'intérêt d'une telle liste est que sa taille peut varier dynamiquement sans soucis de la fragmentation de son stockage mémoire. S'il est vrai que les tableaux sont stockés de manière contiguë en mémoire, il n'en va pas de même pour la liste chaînée, d'où sa plus grande souplesse d'emploi. Agrandir la liste revient à créer un nouvel élément en mémoire et à le lier à la liste chaînée par une référence vers son emplacement mémoire. A une liste chaînée sont associée les primitives ou fonctions de service suivantes: Insérer Supprimer La liste est-elle vide ? Nombre d'éléments dans la liste
71
Algorithmique Structures Les Listes Chaînées Liste simplement chaînée
Un élément d'une liste simplement chaînée est constitué d'une clé (la valeur de l'élément) et d'une référence à l'élément suivant (pointeur vers élément). Par convention, l'accès à une liste simplement chaînée est simplement un pointeur vers le premier élément de cette liste. Primitives tete[L] qui a une liste L renvoie l'adresse de son premier élément. succ[x] qui a un élément x renvoie l'adresse de son successeur. cle[x] qui a un élément x renvoie sa valeur.
72
Algorithmique Structures Les Listes Chaînées Liste simplement chaînée
Insertion: Attention à l’ordre Suppression: N’oubliez pas de supprimer l’élément de la mémoire.
73
Algorithmique Structures Les Listes Chaînées Liste doublement chaînée
Un élément d'une liste doublement chaînée est constitué d'une clé, d'une référence à l'élément suivant et d'une référence arrière vers l'élément précédent. Par convention l'accès à une liste doublement chaînée est simplement un pointeur vers le premier élément de cette liste.
74
Algorithmique Structures Les Piles
En informatique, une pile (stack) est une structure de données de type LIFO (Last In, First Out), c'est à dire fonctionnant sur le principe «dernier arrivé, premier sorti». Les derniers éléments ajoutés à la pile seront les premiers à être récupérés. On peut représenter une pile par une liste chaînée. Les insertions et suppressions sont faites seulement dans la queue de la liste. Empiler/Dépiler sont les fonctions de base.
75
Algorithmique Structures Les Files
En informatique, une file (queue) est une structure de données de type FIFO (First In, First Out), c'est à dire fondée sur le principe «premier arrivé, premier sorti » . Les premiers éléments ajoutés à la file seront les premiers à être récupérés.. On peut représenter une file par une liste chaînée. Les insertions sont en queue et les suppressions sont faites dans la tête de la liste. Enfiler/Défiler sont les fonctions de base.
76
Algorithmique Structures Les Arbres
Définition : un arbre est une structure de données composée d’un ensemble de nœuds. Chaque nœud contient l’information spécifique de l’application et des pointeurs vers d’autres nœuds (d’autres sous-arbres). Définition récursive d'un arbre : Arbre vide Un seul noeud = racine Si on dispose d'un certain nombre d'arbres, on peut les "raccrocher" à un nouveau nœud, qui devient racine. R Sous arbre A1 A2 A3
77
Algorithmique Les Arbres Notions
Racine : C'est le noeud qui n'a pas de prédécesseur. La racine constitue la caractéristique d'un arbre. Dans l'exemple c'est a Feuille : c'est le noeud qui n'a pas de successeur. Une feuille est aussi appelée un noeud externe. Dans l'exemple, les feuilles sont : c, i, j, e, g et h. Nœud interne : c'est tout noeud qui admet au moins un successeur. Dans l'exemple, les noeuds internes sont : a, b, f et d. Fils : c’est le successeur. Dans l'exemple, c, d et e sont les fils du noeud b. a f b d c e g h i j
78
Algorithmique Les Arbres Notions
Frères : ce sont les successeurs issus d'un même nœud. Dans l'exemple, c, d et e sont des frères. Père : c'est un nœud qui admet au moins un successeur. Dans l'exemple, b est le père des nœuds c, d et e. Sous arbre : C'est une portion de l'arbre. Dans l'exemple, le noeud f avec ces deux fils g et h constituent un sous arbre. Descendants d’un nœud : ce sont tous les noeuds du sous arbre de racine noeud. Dans l'exemple, les descendants de h sont h, c, d, e, i et j. a f b d c e g h i j
79
Algorithmique Les Arbres
Ascendants d’un nœud : ce sont tous les nœuds se trouvant sur la branche de la racine vers ce nœud. Dans l'exemple, les ascendants de d sont d, b et a. Les ascendants de g sont f et a. Branche : Les ascendants d'une feuille constituent une branche de l'arbre. Dans l'exemple, les branches de l'arbre sont a-b-c, a-b-d-i, a-b-d-j, a-b-e, a-f-g et a-f-h. Degré d’un nœud : C'est le nombre de ses fils. Dans l'exemple, le degré de b est 3. Niveau d’un nœud : On dit que la racine a le niveau 0, ses fils ont le niveau 1, les fils des fils ont le niveau 2. etc... Dans l'exemple, a est de niveau 0, d est de niveau 2 et j est de niveau 3. a f b d c e g h i j
80
Algorithmique Les Arbres Notions
Profondeur de l’arbre : C'est le niveau maximal des feuilles de l'arbre. L'arbre de l'exemple est de profondeur 3. Arité ou degré d’un arbre : c’est le maximum de fils qu’un nœud peut avoir (arité 3 dans l’exemple). Arbre binaire : Un arbre binaire est un arbre tel que chaque nœud a au plus deux fils (ou successeurs). On parle de fils gauche et fils droit. Dans la suite, on va étudier que les arbres binaires. a f b d c e g h i j
81
Représentation en mémoire
Algorithmique Les Arbres Représentation en mémoire On peut représenter un arbre binaire par une liste chaînée A C D NULL NULL NULL E NULL NULL
82
Stratégies de parcours
Algorithmique Les Arbres Stratégies de parcours Il existe 2 méthodes classiques de parcours d'arbre : Parcours en Profondeur, on part de la racine et on descend jusqu'à une première feuille avant de passer aux nœuds suivant puis remonter. Dans cette représentation, les feuilles apparaissent aux côtés de leur arborescence. Parcours en Largeur, l’élément du niveau courant est noté puis on passe au fils de chacun d'eux. Cela peut s'apparenter à la vue dans un navigateur de fichier (Explorer Windows, Nautilus...). Pour les parcours en profondeur, on a : La notation préfixée La notation infixée La notation post-fixée
83
Algorithmes de parcours
Algorithmique Les Arbres Algorithmes de parcours Parcours Préfixé Procédure Préfixé(racine) Début Afficher(Racine); Préfixé(Racine->Gauche); Préfixé(Racine->Droite); Fin Parcours Post-fixé Procédure Postfixé(racine) Postfixé(racine->Gauche); Postfixé(racine->Droite);
84
Algorithmes de parcours
Algorithmique Les Arbres Algorithmes de parcours Parcours Infixé Procédure Infixé(racine) Début Infixé(Racine->Gauche); Afficher(Racine); Infixé(Racine->Droite); Fin
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.