Algortihmes et Structures de données Ordinateurs Machines composées de (depuis 1940 env.) : Processeur Gilles Falquet, printemps-été 2004 traitements sur les données stockées dans la mémoire. Mémoire composée de cellules > composée de bits = unité binaire de mémoire http://cui.unige.ch/isi/cours/std/ – stocker le programme à exécuter – stocker les données à traiter Systèmes de communication (entrées/sorties): transmission d’informations entre l’ordinateur et son environnement écrans, claviers, souris, réseau de télécommunication, appareils (moteurs, capteurs, etc.). G. Falquet, CUI, Université de Genève 1 de 35 G. Falquet, CUI, Université de Genève Architecture des ordinateurs 2 de 35 Modèle Mémoire séquence de Cellules 11111101 disque magnétique 11001101 Cellule = séquence de Bits données Bit = mémoire à deux états (0 ou 1) , (==> n bits : 2n états) Programme ensemble d’instructions Instruction: PROCESSEUR 01000101 écran clavier souris manettes etc. programme - mouvement de données mémoire <--> registres du processeur - calculs (arithmétiques, logiques, etc.) dans le processeur - rupture de séquence (conditionnelle) - entrées/sorties MEMOIRE G. Falquet, CUI, Université de Genève bus - etc. 3 de 35 G. Falquet, CUI, Université de Genève 4 de 35 Exécution Information et données Traitement de l’information par une machine => stockage en mémoire => codage ix saut 34 5 Informations codée = DONNÉES. 6 iy 1902 110011010 "hello" 1101001 iz 34 10001010 35 101010110 000101101 100101010 G. Falquet, CUI, Université de Genève 5 de 35 G. Falquet, CUI, Université de Genève Schéma de codage = structure de données – Algorithme complet: représenter en mémoire toutes les informations à traiter; Méthode pour résoudre un problème – – efficace en espace : faible occupation de la mémoire; – efficace en temps : peu d’instructions pour traiter les données 6 de 35 en un nombre fini d’étapes Problème généraux et instances Pblm général : trouver le plus grand diviseur commun de deux nombres Instance : trouver le plus grand diviseur commun de 36 et 28 On s’intéresse aux algorithmes qui résolvent un problème général == qui résolvent n’importe quel instance du problème général. G. Falquet, CUI, Université de Genève 7 de 35 G. Falquet, CUI, Université de Genève 8 de 35 Thèse de Church Algorithmes et structures de données Tout algorithme peut être exécuté par un programme sur un ordinateur Forte dépendance entre structures de données et programmes == il n’y a pas de méthode “raisonnable” qu’on ne puisse programmer – influence sur la simplicité du programme – influence sur l’efficacité du programme Conséquence: on peut exprimer un algorithme dans n’importe quel langage (complet) de programmation d’ordinateur Malheureusement : pas de structure optimale en toute circonstance "Algorithmes + Structures de données = Programmes" [Wirth] Remarque Il y a des problèmes indécidables == pour lesquels il n’existe pas d’algorithme G. Falquet, CUI, Université de Genève 9 de 35 Langage algorithmique de haut niveau G. Falquet, CUI, Université de Genève 10 de 35 Modèle abstrait de mémoire = ensemble d’objets Pour éviter d’écrire des programmes au niveau "machine" objet = ensemble de cellules On se donne un langage algorithmique plus abstrait contient une valeur d’un certain type (entier, réel, chaînes de caractères, booléen, etc.) Langage = une syntaxe + une sémantique Variables Désignent un objet de la mémoire. X "Hello" Sémantique (opérationnelle) Y = signification des instructions 95 = comment les instructions changent l’état de la mémoire Etat de la mémoire : ensemble de paires (variable = valeur) M = { X = "Hello", Y = 95 } G. Falquet, CUI, Université de Genève 11 de 35 G. Falquet, CUI, Université de Genève 12 de 35 Programme Instructions: affectation = séquence d’instructions de diverses natures – affectations – conditionnelles – itération – appels de sous-programmes Stocke une valeur, résultat d’un calcul, dans une variable. /!\ Le contenu précédent est perdu. variable ← constante X ← 34 variable ← variable Y← X On utilise un pseudo langage (pseudo Java) variable ← expression opérateur expression Z ←3 * X A la place de ← on notera aussi = ou parfois := G. Falquet, CUI, Université de Genève 13 de 35 G. Falquet, CUI, Université de Genève Exemples mémoire avant X = 897 instruction X← 2 14 de 35 Sémantique On dit comment l’exécution d’un instruction modifie la mémoire mémoire après X=2 X = 2 , Y = 3333 Y← X+8 X = 2 , Y = 10 X = 3 , Y = 11 X← X *Y X = 33 , Y = 11 Z = "xsjsjdsw" Z ← "allo" Z = "allo" Z = "allo" , Y = 11 X← Z+Y indéfini : chaîne de caractères + entier nouvel état mémoire = Interprétation( instruction | état mémoire actuel) Pour l’affectation si M = {X = e, v1 = k1, …, vn = kn} Interprétation(X ← g | M) = {X=g, v1 = k1, …, vn = kn} G. Falquet, CUI, Université de Genève 15 de 35 G. Falquet, CUI, Université de Genève 16 de 35 Evaluation d’expression Evaluation d’expression - sémantique Expressions composées de constantes, variables, opérateurs, fonctions eval(constante | M) = constante Evaluation dans l’ordre habituel: ( ), fonctions, ^, *, /, mod, +, –, ∪, ∩, <, >, =, ∈, ⊆, eval(X | {X=e; …}) = e Les variables sont remplacées par leur valeur. etc. eval(E1 + E2 | M) = eval(E1 | M) + eval(E2 | M) eval( f(E1, …, Ek) | M ) = f(eval(E1 | M), …, eval(Ek | M)) Signification des opérations dépend du type d’arguments 2.3 + 5.66 6+2 6/4 "bon"+"jour" "bonjour"[1..3] addition des réels addition des entiers = 1 ou 1.5 ? concaténation des chaînes extraction de sous-chaîne G. Falquet, CUI, Université de Genève 17 de 35 G. Falquet, CUI, Université de Genève Séquences d’instructions { Ordre d’exécution instruction1; instruction2; …} Attention: L’ordre des instructions dans une séquence est important ! Sémantique: Exécuter 18 de 35 instruction1, puis instruction2, et ainsi de suite. {…} { X ← 2; Z ← 2*X ; {X=3,Z=4} Exemple: { X ← 2; Z ← X + 1; U ← X – Z; …} X ← X+1 } {…} mémoire avant instruction mémoire après X = 0, Y = 1, Z = 111 X ← 2; Z ← X + 1; U←X–Z X = 2, Z = 3, U = –1 { X ← 2; X ← X+1; {X=3,Z=6} Z ← 2*X } Sémantique Interprétation( i1 ; i2 | M ) = Interprétation( i2 | Interprétation( i1 | M ) ) G. Falquet, CUI, Université de Genève 19 de 35 G. Falquet, CUI, Université de Genève 20 de 35 Exécution conditionnelle: Exemples si ( expression) instruction1 sinon instruction2 {…} A ← 2; B ← 1; si (A > B) W ← A – B sinon W ← 0 { A = 2, B = 1, W = 1 } Interprétation( si (E) i1 sinon i2 | M) = Interprétation(i1 | M) si eval(E | M) = vrai = Interprétation(i2 | M) si eval(E | M) = faux {…} si (X > 0) Y ← X sinon Y ← –X { Y = valeur absolue de X } ou bien si ( expression ) instruction1 Interprétation( si (E) i1 | M) = Interprétation(i1 | M) si eval(E | M) = vrai = M si eval(E | M) = faux G. Falquet, CUI, Université de Genève 21 de 35 Algorithme MAX 22 de 35 Pour prouver que l’algorithme est correct Calcul de Z = MAX(X, Y) Preuves semi-formelles si (X > Y) Z←X sinon Z←Y G. Falquet, CUI, Université de Genève G. Falquet, CUI, Université de Genève Technique des assertions On démontre que certaines formules sont toujours vraies à certains points de l’algorithme On démontre qu’à la fin il est vrai que l’algorithme a trouvé le résultat voulu 23 de 35 G. Falquet, CUI, Université de Genève 24 de 35 MAX est correct Algorithme SIGNE Calcul de Z = signe de X •• X et Y deux nombres quelconques si (X > Y) •• •• X>Y => MAX(X, Y) = X, par définition du MAX •• Z←X •• Z = MAX(X, Y) sinon •• •• X ≤ Y => MAX(X, Y) = Y, par définition du MAX •• Z←Y •• Z = MAX(X, Y) si (X > 0) Z←1 sinon si (X = 0) Z ← 0 sinon Z ← –1 Conditions imbriquées. Trouver une forme équivalente non imbriquée. •• donc Z = MAX(X, Y) G. Falquet, CUI, Université de Genève 25 de 35 G. Falquet, CUI, Université de Genève Itération Sémantique Interprétation(tant que (E) i | M) Syntaxe: tant que ( expression) instruction = M si eval(E | M) = faux = Interprétation(tant que (E) i | Interprétation(tant que (E) i | M)) sinon Sémantique: Exécuter 26 de 35 instruction tant que l’évaluation de expression donne vrai. Exemple ==> il faut que l’itération se termine pour qu’elle ait un sens {… } Pour faire des preuves lorsqu’il y a des itérations R ← 10; S ← 0; tant que (R > 0) { S ← S + R; R ←R – 1 } { S = 10+9+8+…+2+1 = 55 } G. Falquet, CUI, Université de Genève On cherche les invariants de l’itération Conditions qui restent vraies après chaque itération 27 de 35 G. Falquet, CUI, Université de Genève 28 de 35 Preuve de la somme de 1 à 10 Itération - sur un ensemble de valeurs Lorsque on veut effectuer un nombre déterminé à l’avance d’itérations on pourra utiliser la syntaxe abrégée R ← 10; S ← 0; -- S = 0 = somme des entiers entre R+1 et 10 tant que (R > 0) { -- S = somme des entiers entre R+1 et 10 (invariant) S ← S + R; -- S = R + somme des entiers entre R+1 et 10 -- donc S = somme des entiers entre R et 10 R ←R – 1 -- S = somme des entiers entre R+1 et 10 } -- R = 0 et S = somme des entiers entre R+1 et 10 -- donc S = somme des entiers entre 1 et 10 pour (variable de expression1 à expression2 ) instruction qui correspond à : variable ← expression1 tant que ( variable ≤ expression2) { instruction; variable ← variable + 1 } Toutes ces instructions peuvent être combinées entre elles pour former des instructions plus complexes. . G. Falquet, CUI, Université de Genève 29 de 35 G. Falquet, CUI, Université de Genève L’algorithme est correct Exemple. Calcul de r = pq r ← 1; n ← 0; -- r = pn puisque 1 = p 0 par définition tant que (n ≠ q) { -- r = pn r ← r * p; -- r = pn+1 n ← n + 1; -- r = pn } -- r = pn et n = q -- => r = pq r ← 1; n ← 0; tant que (n ≠ q) { r ← r * p; n ← n + 1; } ou bien r ← 1; pour n de 1 à q { r ← r * p; } G. Falquet, CUI, Université de Genève 30 de 35 31 de 35 G. Falquet, CUI, Université de Genève 32 de 35 Recherche d’un mot dans une chaîne Preuve (idée) Teste si t, de longueur Lt contient le mot m de longueur Lm resultat ← "non"; c-à-d si il existe a, b tels que t[a .. b] = m b forcément = à a + longueur de m – 1 pour i de 0 à Lt– Lm { si (t[i .. i + Lm – 1] = m) { resultat ← "oui" ; sortir de l’itération} -- on n’a pas trouvé m entre 0 et i } t numérotté de 0 à Lt – 1 resultat ← "non"; pour i de 0 à Lt– Lm { si (t[i .. i + Lm – 1] = m) { resultat ← "oui" ; sortir de l’itération} } G. Falquet, CUI, Université de Genève 33 de 35 Vrai langage et pseudo langage Les langages "professionnels" sont complexes – syntaxe restrictive pour éviter les erreurs de programmation – doivent être modulaires, structurés, etc. (génie logiciel) – pour écrire de gros programmes – adaptés à un environnement (périphériques, réseau, etc.) – contraintes d’efficacité Pseudo langage – syntaxe plus informelle, pas de définition stricte – centré sur l’algorithme, pas sur les aspects génie logiciel – critère : facile à traduire dans un vrai langage – – notre pseudo langage : Java simplifié G. Falquet, CUI, Université de Genève 35 de 35 G. Falquet, CUI, Université de Genève 34 de 35