Algortihmes et Structures de données Ordinateurs - (CUI)

publicité
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
Téléchargement