Notations et Algorithmes en Informatique
Notations et Algorithmes en Informatique
El Maati CHABBAR
Département d’Informatique
Faculté des Science –Rabat-
FSR Dé[Link]. 15
1
PLAN DU COURS
2
PLAN
RAPPELS : NOTATIONS ALGORITHMIQUES
COMPLEXITE
ALGORITHMES ITERATIFS DE TRIS
RECURSIVITE
DIVISER POUR RESOUDRE
PREUVE D’ALGORITHMES
FSR Dé[Link]. 15
Notations algorithmiques
FSR Dé[Link]. 15
Notations algorithmiques
INSTRUCTIONS
Affectation : <variable> := <expression>
Itération
• boucle Pour
(Où initiale et finale sont des expressions de même type que celui de
la variable contrôlant la boucle, le type peut être entier, caractère
ou énuméré)
FSR Dé[Link]. 15
Notations algorithmiques
FSR Dé[Link]. 15
Notations algorithmiques
Itération
• boucle tantque • boucle répéter
Remarques:
- Condition est une expression à valeur booléenne, cette expression
doit être modifiée dans le corps de la boucle (dans action).
- La boucle pour peut être traduite en boucle tantque (ou en répéter)
mais l’inverse n’est pas toujours vrai.
FSR Dé[Link]. 15
Notations algorithmiques
Programme somme_des_n_premiersTermes en C
// partie déclaration
n : entier; s : entier; i : entier; (ou n, i, s : entier) main ( ) {
Début // déclaration des variables
// Lecture des données int i, n, s;
Écrire (" n = ? " ); lire(n); // lecture des données
// calcul de la somme prinf(" n = ? "); scanf(" %d" , &n);
s := 0; // calcul de la somme
i := 1; s = 0;
tantque i <= n faire i = 1;
s := s + i; while (i <= n) {
i := i + 1; s = s + i;
ftantque; i = i + 1;
// affichage du résultat }
écrire("1+ 2 + … + n = ", s); // affichage
fin printf(" 1+2+…+ %d = %d \n" , n, s)
}
FSR Dé[Link]. 15
Notations algorithmiques
10
Algorithme
algorithme
Cheminement à suivre :
analyse codification
Problème Algorithme programme
FSR Dé[Link]. 15
Notations algorithmiques
11
Fonctions
- Une fonction est un sous algorithme (sous programme) qui, à partir
de données, retourne un seul type de résultat.
- Une fonction
• possède un nom
• communique avec l’extérieur par le biais des paramètres
• retourne un résultat par l’instruction retourner(expression)
FSR Dé[Link]. 15
Notations algorithmiques
12
FSR Dé[Link]. 15
Notations algorithmiques
13
Exemple: factoriel n en n! en C :
pseudo code:
Fonction fact(n : entier) : entier unsigned int fact (unsigned int n) {
m, i : entier; unsigned int i, m;
début m = 1;
m := 1; for (i = 2; i<= n; i++)
pour i :=2 à n faire m = m * i;
m := m * i; return m;
fpour }
retourner(m);
fin
FSR Dé[Link]. 15
Notations algorithmiques
14
o L’appel d’une fonction est utilisé dans une instruction sous la forme :
<nom de la fonction> (liste des paramètres effectifs)
Les paramètres formels et effectifs doivent correspondre en nombre
et en type
Lors d’un appel :
• les paramètres formels reçoivent les valeurs des paramètres
effectifs correspondant
• le corps de la fonction est exécuté jusqu’au premier retourner
rencontré
• l’exécution se poursuit (à l’dresse de retour) dans la fonction
appelante.
o Remarque: le type de retour d’une fonction peut être vide, et dans
ce cas on écrit retourner() ou pas d’instruction retourner;
FSR Dé[Link]. 15
Notations algorithmiques
15
FSR Dé[Link]. 15
Notations algorithmiques
16
FSR Dé[Link]. 15
Notations algorithmiques
17
FSR Dé[Link]. 15
Notations algorithmiques
18
début début
//bloc d’instructions Ou //bloc d’instructions
fin //ne contenant pas retourner
fin
FSR Dé[Link]. 15
Notations algorithmiques
19
FSR Dé[Link]. 15
TABLEAUX STATIQUES
20
TABLEAUX
Un tableau est utilisé pour représenter une suite d’éléments de même type
( T = (t1,t2,…,tn)).
Déclaration d’un tableau (à un dimension):
<nom du tableau> : tableau [1 .. max] de <type des éléments>
(exemple T : tableau [1..20] de réel)
où : - max est une constante entière (positive)
- le type des éléments est quelconque (de base ou déclaré).
FSR Dé[Link]. 15
TABLEAUX STATIQUES
21
FSR Dé[Link]. 15
TABLEAUX STATIQUES
22
FSR Dé[Link]. 15
[Link]
23
FSR Dé[Link]. 15
[Link]
24
FSR Dé[Link]. 15
[Link]
25
o Remarques :
Le nom du tableau, dans une liste de paramètres
formels, est une référence.
(en C, l’adresse de T[i], notée T + i, est calculée:
adresse(T[i]) = adresse(T[0]) + sizeof(<type des éléments>) * i)
FSR Dé[Link]. 15
STRUCTURE (ENREGISTREMENT)
27
FSR Dé[Link]. 15
STRUCTURE (ENREGISTREMENT)
28
Exemples : En C :
Adresse = structure struct adresse {
numero_rue : entier; int numero_rue;
nom_rue : tableau[1..20] de caractère; char[20] nom_rue;
code_postal : entier; int code_postal;
fstructure }
typedef struct adresse Adresse;
Point = structure
abscisse : réel; typedef struct point {
ordonnee : réel; float abscisse, ordonnee;
fstructure }Point;
FSR Dé[Link]. 15
STRUCTURE (ENREGISTREMENT)
29
FSR Dé[Link]. 15
STRUCTURE (ENREGISTREMENT)
30
FSR Dé[Link]. 15
ALGORITHMIQUE II
NOTION DE COMPLEXITE
1 SMI AlgoII
Complexité
SMI AlgoII
Complexité
SMI AlgoII
Complexité
SMI AlgoII
Complexité
SMI AlgoII
Complexité
SMI AlgoII
Complexité
SMI AlgoII
Complexité
10
Complexité en moyenne:
On note par :
Di (1 ≤i≤ n) : ensemble de données (de taille n) où x est
présent à la ieme position
Dn+1 : ensemble de données où x n’est pas présent
On suppose que la probabilité de présence de x dans une
donnée est q. De plus, dans le cas où x est présent, on
suppose que sa probabilité de présence dans l’une des
positions est de 1/n
On a :
p(Di) = q/n , T(Di) = i a +(2i+1)t + (i-1)d ; (1 ≤i≤ n)
p( Dn+1) = 1 – q , T(Dn+1)=Tmax = (n+1)a+(2n+2)t+nd
SMI AlgoII
Complexité
11
13
SMI AlgoII
Complexité
14
Remarques
1. f = O(g) ⇔ le quotient est bornée au voisinage
de l’infini.
2.
3. si a = 1, on écrit f ∼ g et on a f = Θ(g).
4. f = Θ(g) ne signifie pas que le quotient f(x)/g(x)
tend vers une limite (1 en particulier).
Exemple. f(x) = x(2+sin x). On a x ≤ f(x) ≤ 3x
∀x>0, donc f(x) = Θ(x). En revanche, le quotient
f(x)/x ne tend vers aucune limite lorsque x → +∞
SMI AlgoII
Complexité
15
Abus de notation:
On a par définition:
O(f) = {g: IN → IR / ∃ c > 0 ∃ n0 > 0 g(n) ≤ c.f(n) , ∀ n > n0}
Ω(f) = {g: IN → IR / ∃ c > 0 ∃ n0 > 0 g(n) ≥ c.f(n) , ∀ n > n0}
Θ (f) = O(f) ∩ Ω(f)
SMI AlgoII
Complexité
16
SMI AlgoII
Complexité
17
Remarques pratiques:
Le cas le plus défavorable est souvent utilisé pour
analyser un algorithme.
La notation O donne une borne supérieure de la
complexité pour toutes les données de même
taille(suffisamment grande). Elle est utilisée pour évaluer un
algorithme dans le cas le plus défavorable.
T(n) ≤ cf(n) signifie que le nombre d’opérations ne peut
dépasser cf(n) itérations, pour n’importe quelle donnée de
longueur n.
Pour évaluer la complexité d’un algorithme, on cherche un
majorant du nombre d’opérations les plus dominantes.
Dans les notations asymptotiques, on ignore les constantes.
L’algorithme de recherche dans un tableau à n éléments, cité précédemment, est en O(n)
SMI AlgoII
Complexité
18
SMI AlgoII
Complexité
19
SMI AlgoII
Complexité
20
. \T(n)
n log n n n log n n2 2n
10 3 µs 10 µs 30 µs 100 µs 1000µs
21
22
Propriétés
En utilisant la notation de Landau (pour les fonctions de IN dans IR+ ), on a :
1. f + O(g) = {f + h / h ∈ O(g)}
(h = f + O(g) ⇔ h – f ∈ O(g).
f O(g) = {f h / h ∈ O(g)}
2. f = O(f)
3. f = O(g), g = O(h) ⇒ f = O(h)
4. c O(f) = O(c f) = O(f) ( c>0)
5. O(f) + O(g) = O(f + g) = O(max(f, g))
6. O(f) + O(f) = O(f)
7. O(f) O(g) = O(fg)
8. f = O(g) ⇔ g = Ω (f)
SMI AlgoII
Complexité
23
SMI AlgoII
Complexité
24
SMI AlgoII
Complexité
25
Exemples
1. Calcul de la somme 1+2+…+n
S:=0; //O( 1)
Pour i:=1 à n faire
s:= s + i; // O(1)
O(1) + O(n) = O(n)
O(n)
fpour;
T(n) = O(n)
SMI AlgoII
Complexité
26
2. Calcul de :
pour i := 1 à n faire
s := 0; // O(1)
pour j := 1 à i faire
s := s + j; // O(1) O(i) O(1)+O(i)+O(1)=O(i)
fpour; = O(n2)
T[i] := s; //O(1)
fpour;
T(n) = O(n2)
SMI AlgoII
Complexité
27
SMI AlgoII
ALGORITHMIQUE II
TRIS ITERATIFS
SMI ALGOII 1
2
Le problème:
Etant donnée une suite de n nombres (a1,a2,…, an), on
cherche une permutation (arrangement) des éléments
de cette suite (a’1,a’2,…, a’n) telle que a’1≤a’2≤…≤a’n.
♦ A partir de la suite (7,1,2,6), un algorithme de tri
donne comme résultat la suite (1,2,6,7).
On se limite aux nombres entiers rangés dans un
tableau A à n éléments.
Dans le cas où les éléments sont des collections de
données (enregistrement), on trie le tableau suivant une
clé (champ de l’enregistrement).
SMI ALGOII
3
3 2 9 5 4
7
3 7 9 5 4
2
3 7 9 5 4
2
3 4 9 5 7
2
3 4 5 9 7
2
3 4 5 7 9
2
SMI ALGOII 4
Analyse du tri par sélection
5
T(n) = O(n2)
SMI ALGOII
TRI par ISERTION
6
Algorithme:
Pour i := 2 à n faire
- on insère A[i], à sa place, dans le sous-tableau
A[1..i-1]
(On cherche le 1er élément ≤ A[i] parmi {A[i-1],…,A[1]} en
décalant d’une position à droite)
L’algorithme fonctionne selon le schéma suivant:
A[i]
A
triétrié
1 i-1 i SMI ALGOII
3
• exemple
>
7 3 2 5
7 7 2 5
i=2
3 7 2 5
3 7 2 5
3 7 7 5
i=3
3 3 7 5
2 3 7 5
2 3 7 5
i=4
2 3 SMI ALGOII 5 7 7
Analyse du tri par insertion
8
SMI ALGOII
Tri à Bulles
9
On dit qu’on a une inversion s’il existe (i,j) tels que i<j et
ai > aj
(a1,…,ai , ai+1,…,an) (a1,…,ai+1,ai,…,an)
Un tableau est trié s’il n’a aucune inversion. La complexité du
tri est proportionnelle au nombre d’inversions qui est de
l’ordre de (nombre de couple(i,j) tels que i<j).
L’algorithme consiste à parcourir le tableau à trier en
examinant si chaque couple d’éléments consécutifs (ai, ai+1)
est dans le bon ordre ou non, si ce couple n’est pas dans le
bon ordre on échange ses éléments et ce processus est
répété tant qu’il reste des inversions à faire.
SMI ALGOII
Tri à Bulles
10
T(n) = O(n2)
SMI ALGOII
• Exemple
3 7 5 2
3 7 2 5
i=1
3 2 7 5
Der_ech=2 3 7 5
2
I=2 3 5 7
2
Der_ech=4
2 3 5 7
i=4
SMI ALGOII 11
ALGORITHMIQUE II
Récurrence et Récursivité
SMI AlgoII
Récurrence
Suite récurrente: la définition d’une suite est la donnée
• d’un terme général défini en fonction du (ou des) terme(s) précédant(s)
• D’un terme initial qui permet d’initialiser le calcul
Principe de récurrence :
Soit P un prédicat (ou propriété) sur IN qui peut être soit vrai soit faux (on écrira
souvent P(n) à la place de P(n) = vrai).
On suppose que
P(0) vrai
∀n ∈ IN, P(n) ⇒ P(n+1)
Alors , pour tout n ∈ IN, P(n) est vrai.
Si on considère le prédicat suivant
P(n) : je sais résoudre le problème pour n
alors le principe de récurrence nous dit que si je sais résoudre le Pb pour n=0
et que si je sais exprimer la solution pour n en fonction de la solution pour n+1
alors je sais résoudre le Pb pour n’importe quel n.
SMI AlgoII
Récursivité
Examples:
1. Puissance
a0 = 1 Ou bien
a0 = 1
an+1 = a an an = a an-1 n>0
2. Factoriel
0! = 1
n! = n (n-1)! , n ≥1
3. Suite de Fibonacci
F0 = F1 = 1
Fn = Fn-1 + Fn-2 , n≥2
SMI AlgoII
Récursivité
Un algorithme (ou fonction) est dit récursif s’il est défini en fonction de lui-même.
Exemples
Fonction puissance(x : réel, n : entier) : réel
début
si n = 0 alors retourner 1
sinon retourner (x * puissance(x , n-1))
fin
Factoriel (n)
début
si n = 0 alors retourner(1)
sinon retourner (n*factoriel(n-1))
fin
SMI AlgoII
Récursivité
fact (n) Le déroulement de l’appel de fact(3):
début 3*fact(2)
si n = 0 alors retourner(1) Fact(3) 3*2=6 2*fact(1)
sinon retourner(n*fact(n-1)) 6 2*1=2 1*fact(0)
fsi
1*1=1
fin La condition n = 0 est appelée test
d’arrêt de la récursivité.
Il est impératif de prévoir un test d’arrêt
dans une fonction récursive, sinon
l’exécution ne s’arrêtera jamais.
L’appel récursif est traité comme n’importe
appel de fonction.
SMI AlgoII
Récursivité
L’appel d’une fonction (récursive ou non) se fait dans un
contexte d’exécution propre (pile d’exécution), qui
contient :
L’adresse mémoire de l’instruction qui a appelé la fonction
(adresse de retour)
Les valeurs des paramètres et des variables locales à la
fonction.
L’exécution d’une fonction récursive se fait par des
appels successifs à la fonction jusqu’à ce que la
condition d’arrêt soit vérifiée, et à chaque appel, les
valeurs des paramètres et l’adresse de retour sont mis
(empilés) dans la pile d’exécution.
SMI AlgoII
Récursivité
L’ordre des instructions par rapport à un appel récursif est important.
Exemple:
afficher(n)
début
si n > 0 alors
١
afficher(n div 10) écrire(n mod 10)
٢
fsi
fin
L’algorithme récursif afficher(n) permet d’afficher les chiffres d’un entier, strictement positif, selon la
disposition de l’instruction écrie(n mod 10):
- Si l’instruction est placée en ١ , les chiffres sont affichés dans l’ordre inverse
- Si elle est placée en ٢, alors les chiffres seront affichés dans le bon ordre
Pour n = 123, on a :
١ → 3 2 1
٢ → 1 2 3
SMI AlgoII
Type de récursivité
Récursivité simple: Une fonction récursive contient un
seul appel récursif.
Récursivité multiple: une fonction récursive contient
plus d’un appel récursif (exemple suite de
Fibonacci).
Récursivité mutuelle( ou croisée): Consiste à écrire
des fonctions qui s’appellent l’une l’autre.
Exemple
SMI AlgoII
Récursivité mutuelle
Pair(n) Impair(n)
début début
si n = 0 alors si n = 0 alors
retourner vrai retourner (faux)
sinon sinon
retourner (impair(n-1)) retourner (pair(n-1))
fsi fsi
fin fin
SMI AlgoII
Un peu de Structures de Données
Notion de pile.
Une pile est une structure pour représenter une suite
d’éléments avec la contrainte qu’on ne peut ajouter,
ou enlever, un élément que d’un même côté de la
pile (dit sommet de la pile). ajouter enlever
Exemple pile d’assiettes. som
4
Une pile peut être représentée
par un tableau et un indice de sommet
P
SMI AlgoII
Notion de Pile
Opérations définies sur les piles:
initialiser(p : Pile) //Crée une pile vide.
sommet(p : Pile) : élément// Renvoie l’élément au
sommet de la pile p, sous la condition que p soit non
vide.
empiler(x : élément, p : Pile) // ajoute x au sommet
de la pile p.
dépiler(p : Pile) // supprime l’élément au sommet de la
pile p, sous la condition que p soit non vide.
pileVide(p : Pile) : booléen // retourne vrai si p est
vide.
SMI AlgoII
Notion de Pile
Exemple.
Une expression e est dite bien parenthésée (on se limite au ‘(‘ et ‘)’) si :
1. Le nombre de parenthèses ouvrantes (|e|() est égal au nombre de
parenthèses fermantes (|e|)) dans e.
2. Tout préfixe (partie gauche) u de e vérifie: |u|( - |u|( ≥ 0.
SMI AlgoII
Transformation du récursif en itératif :
« Dérécursivation »
Schéma d’un algorithme récursif:
algoR(X)
début
A
si C(X) alors
B;
algoR(ϕ(X));
D;
sinon Où :
E; X : liste de paramètres
fsi; C : condition d’arrêt portant sur X
A, B, D, E : bloc d’instructions (éventuellement vide)
fin ϕ(X) : transformation des paramètres
SMI AlgoII
Transformation du récursif en itératif :
« Dérécursivation »
Algorithme itératif équivalent.
algoR(X) algoI(X)
p : Pile
Début début
A initialiser(p);
si C(X) alors A;
tantque C(X) faire
B;
B;
ϕ
algoR(ϕ(X)); empiler(X, p);
D; X := ϕ (X);
A;
sinon
ftantque;
E; E;
fsi; tantque (non pileVide(p)) faire
X := sommet(p);
fin
dépiler(p);
D;
ftantque
fin
SMI AlgoII
Dérécusivation
Exemple. afficherI(n)
p : Pile;
Début
initialiser(p);
afficherR(n) tanque n > 0 faire
début empiler(n, p);
si n > 0 alors n := n div 10;
ftantque
afficher(n div 10)
tantque (non pileVide(p)) faire
écrire(n mod 10); n := sommet(p);
fsi dépiler(p);
fin écrire(n mod 10);
ftanque
fin
A=B=E=∅
SMI AlgoII
Transformation du récursif en itératif :
« Dérécursivation »
Récursivité terminale:
La récursivité est dite terminale si la dernière instruction
exécutée est un appel récursive; (Cas où D = ∅). Il est
claire, dans ce cas, d’éliminer la pile dans la version
itérative. (On dépile pour ne rien faire dans la 2ème
boucle).
La récursivité d’une fonction F(X) est aussi dite terminale
lorsqu’elle se termine par l’instruction retourner(F(ϕ(X))).
On ajoute, dans ce cas, un paramètre à la liste X pour
contenir le résultat de retour d’un appel récursive,
comme le montre l’exemple suivant:
SMI AlgoII
Exemple
fonction FACR(n) ; fonction FACR'(n, r)
début début
si n=0 alors retourner (1) si n=0 alors retourner (r)
sinon retourner (n* FACR(n-1)) ; sinon retourner (FACR'(n-1, n*r)) ;
fin. fin.
RÉCURSIVE RÉCURSIVITÉ TERMINALE
SMI AlgoII
Complexité des algorithmes récursifs
La complexité des algorithmes récursifs est souvent exprimée
par une équation de récurrence.
SMI AlgoII
Arbre binaire: terminologie
Soit A un arbre binaire de racine r. .
La racine du SAG (resp. SAD) de A
est appelé fils gauche (resp. fils
droit) de r et r est appelé père. 10
SMI AlgoII
Algorithmes de parcours
puis on ferme la parenthèse
Parcours(a : Arbre) .
10
début
si a ≠ ∅ alors
50
١ 5
parcours(SAG(a));
٢ Traiter(racine(a))
parcours(SAD(a)); ∅ 9
30
60
٣
fsi;
20 40
fin
Selon la disposition de l’instruction
traiter(racine(a)), on distingue 3 types de
parcours: 35
sinon
h1 := h(SAG(a)); h(3)=1
∅ -1 3
∅ -1 ∅ -1
h2 : h(SAD(a));
retourner(1+max(h1,h2)); 5 h(5)=0
∅ -1
fsi;
fin -1 ∅ ∅ -1
SMI AlgoII
Récursivité double
&
Arbre des appels récursifs
.
Exemple2 : tours de Hanoï (Occupation des moines de Hanoï)
Le jeu consiste à faire passer les
disques de la tour T1 à la tours
T2, en ne déplaçant qu’un seul
disque à la fois, et en utilisant la
tour intermédiaire T3 de telle T1 T2 T3
sorte qu’à aucun moment un
disque ne soit empilé sur un
disque de plus petite dimension.
La solution semble difficile, et pourtant une solution récursive existe.
Soit n le nombre de disques à déplacer. Si n=1 la solution est triviale.
Si on sait transférer n-1 disques alors on sait en transférer n.
Il suffit de transférer les n-1 disques supérieurs de la tours T1 vers la tours T3,
de déplacer le disque le plus grand de T1 vers T2, puis de transférer les n-1 disques
de T3 vers T2. Ceci se traduit par l’algorithme récursif suivant:
SMI AlgoII
Tours de Hanoï
H(n,T1,T2,T3)
début
si n = 1 alors écrire(T1, ‘→’,T2)
sinon
H(n-1,T1,T3,T2);
écrire(T1,’→’,T2)
H(n-1,T3,T2,T1);
fsi
fin
SMI AlgoII
H(n,T1,T2,T3)
début
si n = 1 alors écrire(T1, ‘→’,T2)
sinon
H(n-1,T1,T3,T2);
écrire(T1,’→’,T2)
H(n-1,T3,T2,T1);
fsi
fin Arbre des appels de H(3,a,b,c)
H (3, a, b, c)
.
H (2, a, c, b) a→b H(2,c,b,a)
SMI AlgoII
Tours de Hanoï : Complexité
Soit T(n) le temps pour déplacer les n disques. T(n) vérifie l’équation :
T(1) = 1
T(n) = 2 T(n-1) +1
On a :
T(2) = 2 + 1
T(3) = 2(2 +1) + 1 = 22 + 2 + 1
On montre, par récurrence, que
T(n) = 1 + 2 + … + 2n-1 = 2n – 1
Sachant que T(10) = 210 – 1 = 1023 et une année ≅ 0.3 x108 secondes, il
faudrait, pour les moines, 1010 siècles pour pouvoir déplacer 64 disques!
SMI AlgoII
1 Méthode « Diviser pour Résoudre »
E. CHABBAR
SMI-ALGOII
DVR
2
SMI-ALGOII
DVR
4
Exemples
1. Calcul de xn (n ≥ 1)
puissBin(x,n)
Début
si n = 1 alors retourner x
sinon
si n mod 2 = 0 alors
y := puissBin(x,n/2)
retourner (y*y)
sinon
y := puissBin(x,n/2)
retourner (x*y*y)
fsi;
fsi;
Fin.
SMI-ALGOII
DVR
5
Exemples
2. RECHERCHE DICHOTOMIQUE
La recherche séquentielle d’un élément x dans un
tableau A à n éléments est de l’ordre de n.
La recherche dichotomique exige que le tableau
soit trié. Elle consiste à:
- comparer x à l’élément du milieu
- si c’est différent, x peut se trouver soit dans la
moitié gauche soit dans la moitié droite du
tableau A, selon que x < A[milieu] ou x> A[milieu].
SMI-ALGOII
DVR
6
Exemples
2. Recherche dichotomique
rechDicho(A,inf,sup,x)
début
si inf ≤ sup alors
m := (inf + sup)/2
si x = A[m] retourner m;
si x < A[m] alors retourner rechDicho(A,inf,m-1,x);
sinon retourner rechDicho(A,m+1,sup,x);
fsi;
fsi;
sinon retourner 0;
fsi;
fin
SMI-ALGOII
DVR
7
Exemples
2. Recherche dichotomique
Complexité de la recherche dichotomique
Dans le pire des cas (i.e. x n’est pas dans le tableau)
le nombre de comparaisons T(n), pour chercher x dans
un tableau A[1..n] à n éléments, vérifie:
T(1) = 1
T(n) = T(n/2) + 1 , n>1
- la solution de cette équation dépend du nombre
d’itérations (nombre de divisions par 2)
SMI-ALGOII
DVR
8
Exemples
Itération Nbre d’élts du ss tableau
0 n
1 n/2
2 n/4
3 n/8
. .
. .
p n/2p
L’algorithme utilise p itérations(et aussi p comparaisons) et s’arrête
lorsque n/2p =1, c.à d. p = log2n.
par conséquent, la recherche dichotomique est en O(log2n), i.e.
T(n) = O(log2n)
SMI-ALGOII
9
2 3 5 4 6 9
Fusion
T
SMI-ALGOII
2 3 4 5 6 9
Fusion
10
Fusion(T1,n1,T2,n2)
// T est un tableau qui contient le résultat de la fusion
i1:=1; i2:= 1; k:=1;
tantque (i1≤n1) et (i2≤n2) faire
si T1[i1] ≤ T2[i2] alors
T[k] := T1[i1]; copier(A,d,f,B,j)
k:=k+1; i1 := i1 +1; début
sinon pour i:=d à f faire
T[k] := T2[i2]; B[j] := A[i]
k:=k+1; i2 := i2 + 1; j := j+1;
fsi; fpour;
ftantque; retourner(B);
// on recopie les élts restants dans l’un des //tableaux Ti dans le tableau T fin
si i1 ≤ n1 alors copier(T1,i1,n1,T,k)
sinon copier(T2,i2,n2,T,k)
fsi;
retourner (T);
SMI-ALGOII
TriFusion
12
.
5 3 2 9 4 6
Diviser
5 3 2 9 4 6
2 3 5 4 6 9
Combiner
2 3 4 5 6 9
SMI-ALGOII
TriFusion
13
TriFusion(T, n)
// T1, T2 : des tableaux (locaux) de longueurs variables à chaque appel
début
si n > 1 alors
copier(T, 1, n/2, T1,1);
copier(T, n/2 +1, n, T2, 1);
T1 := TriFusion(T1, n/2);
T2 := TriFusion(T2, n – n/2);
T := Fusion(T1, n/2, T2, n – n/2);
fsi;
retourner(T);
fin Retourner(Fusion(TriFusion(T1,n/2),n/2,TriFusion(T2,n-n/2),n-n/2)
SMI-ALGOII
TriFusion: exemple d’exécution
Tableau à trier:
14
TF(1..8) 1 2 3 4 5 6 8 9
2 5 4 8
3 9 TF(1..2) 1 6 TF(3..4) F(1..2,3..4) TF(5..6) TF(7..8) F(5..6,7..8)
3 9 1 6 1 3 6 9 5 2 4 8 2 4 5 8
TF(1..1) TF(2..2) F(1..2) TF(3..3) TF(4..4) F(3..4) TF(5..5) TF(6..6) F(5..6) TF(7..7) TF(8..8) F(7..8)
3 9 3 9 1 6 1 6 5 2 2 5 4 8 4 8
---------------------------------------------------------------------------------------------------
Recopie de ss-tableau Tableau (vert)retourné Fusion des 2 ss-tableaux(rouges)
à l’appel récursif résultats des appels récursifs
SMI-ALGOII
DVR: Compléxité
15
T(1) = 0
T(n) = 2 T(n/2) + O(n) , n > 1
SMI-ALGOII
Equation de récurrence des [Link]
16
SMI-ALGOII
DVR: Résultat de Complexité
17
Théorème:
Soit T : IN IR+ une fonction croissante à partir d’un certain rang, telle qu’il
existe des entiers n0 ≥1, b≥2 et des réels d≥0, a>0 pour lesquels
Alors on a :
O( ) si a < bd
O( ) si a = bd
T(n) =
O( ) si a > bd
SMI-ALGOII
DVR: Résultat de Complexité
18
SMI-ALGOII
DVR: Résultat de Complexité
19
Alors
O( ) si a < bd
T(n) = O( ) si a = bd
O( ) si a > bd
SMI-ALGOII
DVR
20
Applications
1. Pour la recherche dichotomique et le calcul de la
puissance on a : T(n) = T(n/2) + O(1)
donc T(n) = O(log n) (a=1 , b=2, d=0)
2. Pour le TriFusion on a : T(n) = 2 T(n/2) + O(n)
Alors T(n) = O(n log2n) (a=2, b=2, d=1)
3. T(1) = 1
T(n) = 2t(n/2) + O(n2)
a pour solution T(n) = O(n2) (a=b=d=2)
SMI-ALGOII
DVR : tri rapide (quickSort)
21
SMI-ALGOII
DVR : tri rapide
22
SMI-ALGOII
g i j d
DVR : Tri Rapide
23
//T[n+1] = + ∝ Exemple
Partition(T, g, d)
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
début
3 1 4 1 5 9 2 6 5 3 5 8 9 i j
pivot := T[g];
i := g; j := d+1; 3 1 4 1 5 9 2 6 5 3 5 8 9 3 10
tantque i < j faire
i := i +1; 3 1 3 1 5 9 2 6 5 4 5 8 9 3 10
tantque T[i] < pivot faire i:=i+1;
3 1 3 1 5 9 2 6 5 4 5 8 9 5 7
ftantque
j := j -1; 3 1 3 1 2 9 5 6 5 4 5 8 9 5 7
tantque T[j] > pivot faire j:=j-1;
ftantque 3 1 3 1 2 9 5 6 5 4 5 8 9 6 5
si i < j alors échanger(T, i, j); fsi
ftantque 2 1 3 1 3 9 5 6 5 4 5 8 9 5
échanger(T, g, j);
retourner(j) 2 1 3 1 3 9 5 6 5 4 5 8 9
fin
SMI-ALGOII
DVR : Tri Rapide
24
SMI-ALGOII
DVR : Tri Rapide
25
SMI-ALGOII
Complexité du Tri rapide
26
SMI-ALGOII
Complexité du Tri rapide
27
SMI-ALGOII
Complexité du Tri rapide
28
1 n-1
Cn = n – 1 + ∑ (Ci + C n-i-1) pour n ≥2
n
i=0
Le terme générique Cn peut s’écrire :
2 n-1
Cn = n – 1 + ∑ Ci
n
i=0
SMI-ALGOII
.Complexité moyenne du tri rapide
29
n-1
2
. Cn = n−1+ n i=0
∑ Ci
2 n-2
Cn = n – 1 + + 2 ∑ Ci
n Cn-1 n i=0
2 n-1 n-2 (n-1) (n-2)
Cn = n – 1 + Cn-1 + (n – 2 + 2 ∑ Ci ) -
n n n-1 i=0 n
2 n-1 2n-2
Cn = n Cn-1 + n Cn-1 +
n
n+1 2(n-1)
Cn = n Cn-1 + n
Cn 2 - 2
En posant Dn = On aura la récurrence : Dn = Dn-1 +
n+1 n+1 n(n+1)
Notions de Logique
E. CHABBAR
1 SMI-ALGOII
Logique
2
SMI-ALGOII
Logique
3
SMI-ALGOII
Logique
4
SMI-ALGOII
Logique des propositions
5
SMI-ALGOII
Logique des propositions
6
SMI-ALGOII
Logique des propositions
7
SMI-ALGOII
Prédicats
8
SMI-ALGOII
Prédicats
9
SMI-ALGOII
Prédicats
10
Exemples:
1) ∀x pair(x + x)
2) ∃x premier(x) ∧ x < succ(succ(0))
3) ∀x (oiseau(x) ⇒ vole(x)) (tous les oiseaux volent)
4) ∃x (oiseau(x) ∧ ¬ vole(x)) (4 ≡ ¬ 3)
5) ∀i ∀j (1≤i ≤j≤n ⇒ T[i] ≤ T[j]) (spécification d’un tableau trié)
Remarques
¬ (∀x P) ≡ ∃x ¬P
¬ (∃x P) ≡ ∀x ¬P
SMI-ALGOII
Déduction logique
11
Démonstrations logiques
SMI-ALGOII
12
• Séquents prouvables
• Un séquent (ℐ,f) est prouvable, ce que l’on notera
ℐ ├ f, s’il peut être construit en utilisant un nombre fini
de fois les 6 règles suivantes :
1. si f∈ℐ, alors ℐ├f (Hypothèse)
2. si g ∉ ℐ et ℐ ├ f, alors ℐ, g├ f
3. si ℐ ├ (f ⇒ f’) et ℐ ├ f, alors ℐ ├ f’ (Modus Ponens)
4. si ℐ , f├ f’, alors ℐ ├(f ⇒ f’) (Synthèse)
5. ℐ ├ f ssi ℐ ├ ¬¬f
6. si ℐ ,f├ f’ ℐ,f├ ¬f’ alors ℐ├¬f (Raisonnement par l’absurde)
(Contradiction)
SMI-ALGOII
13
• Démonstrations logiques
• Une démonstration d’un séquent prouvable ℐ ├ f est
une suite finie de séquents prouvables ℐi├ fi,
i = 1,...,n, telle que :
• ℐn = ℐ et fn = f
• chaque séquent de la suite est obtenu à partir des
séquents qui le précède en appliquant l’une des 6 règles
• Remarque : le premier séquent de la suite est
nécessairement obtenu par utilisation d’une hypothèse
SMI-ALGOII
14
SMI-ALGOII
Correction de programmes /
17
Spécification
un programme est correct s’il effectue la
tâche qui lui est confiée dans tous les cas
permis possibles
SMI-ALGOII
Correction de programmes /
18
Spécification
description des propriétés que doit
satisfaire un programme pour répondre au
problème posé
- relation entre les entrées et les sorties
du programme
SMI-ALGOII
Correction de programmes /
Spécification
19
Exemple
une spécification pour le problème du
calcul de la racine carrée entière par
défaut :
Données n : entier ;
Résultat r : entier ;
Pré condition : n ≥ 0
Algorithme: r := 0; tantque (n ≥(r +1)2) faire r := r + 1 ftantque
SMI-ALGOII
Test vs Vérification
20
. Les couples (n, r) de l’ensemble suivant {(0, 0), (1, 1), (2, ), (3, 1), (4, 2), …}
sont des tests qui réussissent
SMI-ALGOII
Langage algorithmique
22 Langage algorithmique
• Instructions :
- Affectation (:= symbole d’affectation et = pour la comparaison)
- Contrôle :
Si <cond> alors instruction fsi
ou Si <cond> alors instruction
sinon instruction fsi
- Boucle :
Tantque <cond> faire instruction ftantque
• Restriction :
- Pas de fonction (ou procédure)
- ni de variable pointeur
- pas de désignation de la forme t[i] où i fait référence à un autre
tableau.
SMI-ALGOII
Logique de Hoare
23 Logique de Hoare
• Définition de la logique de Hoare : La logique de
HOARE est un triplet <L, Ax, R> avec :
- L est l’ensemble des formules { p} A { q} où p
et q sont des prédicats et A est un fragment
d’algorithme(ou de programme)
- Ax est l’ensemble des axiomes de la forme
suivante : { p[ x / e] } x := e { p(x)}
(p(x) est obtenu de p[x/e] en substituant toute
occurrence de e par x)
- R est l’ensemble de règles de déduction
suivant :
SMI-ALGOII
Logique de hoare
24
4. {x ≥ 0} x := x + 1 {x ≥ 1}
{x ≥ 0} ⇒ {x + 1 ≥ 1}
x := x + 1
{x ≥ 1} SMI-ALGOII
Exemple : règles de condition
26
5. {vrai}
si x ≥ 0 alors
{vrai ∧ x ≥ 0} ⇒ {x ≥ 0} ⇒{x+1≥1}
x := x + 1;
{x ≥ 1}
sinon
{vrai ∧ x < 0} ⇒ {x < 0} ⇒ {-x > 0}
x := - x;
{x > 0} ⇒ {x ≥ 1}
fsi
{x ≥ 1}
SMI-ALGOII
Schéma de preuve d’un algorithme itératif
Tant que
27
début
{pré}
init;
{I}
tantque C faire
{I ∧ C}
A
{I}
ftantque
{I ∧ ¬ C} ⇒
{post}
SMI-ALGOII
Exemple: calcul de la racine carrée
28
par défaut
Algorithme A:
donnée : n : entier;
résultat : r : entier;
début
r := 0;
tantque n ≥ (r + 1)2 faire
r := r + 1;
ftantque
fin
Spécification:
précondition : {n ≥ 0}
postcondition : { (r2 ≤ n ∧ n < (r + 1)2) }
invariant de la boucle: I = {r2 ≤ n} (évident, sinon on le déduit de la postcondition)
SMI-ALGOII
Algorithme A annoté et prouvé
29
Algorithme A:
donnée : n : entier;
résultat : r : entier;
Début
{n ≥ 0} ⇒ {n ≥ 0*0}
r := 0;
{n ≥ r*r}
tantque n ≥ (r + 1)2 faire
{n ≥ r2 ∧ n ≥ (r + 1)2}
r := r + 1;
{n ≥ r2}
ftantque
{r2 ≤ n ∧ n < (r + 1)2}
fin
SMI-ALGOII
Exemple: calcul de n!
30
Algorithme B:
donnée : n : entier
résultat : y : entier
début
x := n;
y := 1;
tantque x > 1 faire
y := y * x;
x := x – 1;
ftantque
fin
Spécification:
précondition : {n ≥ 0}
postcondition : {y = n!}
Invariant: I = { n! = y x! ∧ x ≥ 0}
SMI-ALGOII
Algorithme B annoté et prouvé
31
Algorithme B:
donnée: n : entier;
résultat: y : entier;
début
{n ≥ 0}
x := n;
{x ≥ 0 ∧ x = n}
y := 1;
{n! = y x! ∧ x ≥ 0}
tantque x > 1 faire
{n! = y x! ∧ x ≥ 0 ∧ x > 1} ⇒ {n! = (y x)(x-1)! ∧ x > 1}
y := y * x;
{n! = y (x-1)! ∧ x-1 > 0}
x := x – 1;
{n! = y x! ∧ x > 0} ⇒ {n! = y x! ∧ x ≥ 0}
ftantque
{n! = y x! ∧ x ≥ 0 ∧ x ≤ 1} ⇒ { y = n!}