Introduction à l`Algorithmique

publicité
Introduction à l’Algorithmique
IPA – Catherine Faron Zucker
Introduction à l'Algorithmique


Algorithme
Validité d'un algorithme


Analyse d'un algorithme



Preuve de sa correction
Complexité d'un algorithme
Structures de données
Conception d'un algorithme
IPA – Catherine Faron Zucker
2
Algorithme

Permet de résoudre un problème donné
ex: Trier une liste de noms par ordre alphabétique

Procédure de calcul bien définie
Séquence d'instructions élémentaires



termine en un temps fini
prend une ou des valeur(s) en entrée
donne une ou des valeur(s) en sortie
IPA – Catherine Faron Zucker
3
Exemple

Exemple de problème à résoudre
Comment trier une liste d'élèves par ordre alpha?



Input: liste non triée
Output: liste triée
Algo: ???
IPA – Catherine Faron Zucker
4
Types de problèmes

Tris d'éléments d'une liste
Recherche d'un élément
Calcul sur des chaînes (caractères, nombres, bits, ...)
Problèmes de graphes
Problèmes combinatoires
Problèmes géométriques
Problèmes numériques

Algorithmes exacts / d'approximation






IPA – Catherine Faron Zucker
5
Algorithme et Programme



Un algorithme est implémenté dans un
langage de programmation
Un même algorithme peut être implémenté
dans différents langages (Java, C, Python,
Caml, ...)
Pseudo-code
IPA – Catherine Faron Zucker
6
Validité d'un algorithme

Précondition



Postcondition



doit être vérifiée avant un traitement donné,
garantit que la possibilité de déroulement du traitement.
doit être vérifiée après le déroulement du traitement,
garantit que le traitement a bien permis de réaliser ce
pourquoi il a été réalisé.
Invariant


condition qui est toujours vraie,
caractérise l'état interne de tout ou partie d'un algo.
IPA – Catherine Faron Zucker
7
Analyse d'un algorithme

Complexité: mesure de son efficacité

Taille mémoire nécessaire à son exécution

Temps d'exécution nécessaire



dans le meilleur des cas
dans le pire des cas
en moyenne
Exemple: recherche d'un élément dans une liste?
Exemple: recherche du plus grand élément d'une liste?
IPA – Catherine Faron Zucker
8
Efficacité d'un algorithme

Temps d'exécution

fonction de la taille des données en entrée
choix du bon paramètre





taille d'une liste, degré d'un polynôme
taille d'une matrice?
nombre de noeuds, profondeur, largeur d'un graphe?
nombre de mots d'un fichier ou nombre de caractères?
fonction du nombre de fois où une opération de
base est répétée dans l'algorithme
IPA – Catherine Faron Zucker
9
Efficacité d'un algorithme

Temps d'exécution: T(n)  C(n)  t


C(n) nombre de fois où l'opération de base de
l'algorithme est exécutée
t temps d'exécution de cette opération de base
C(n) = ½  n (n-1) = ½  n2 - ½  n

Ordre de grandeur: C(n) n2
IPA – Catherine Faron Zucker
10
Efficacité d'un algorithme

Classes de complexité
1
n!

log n
n
n log n
n2
n3
2n
Notations asymptotiques:

O(g(n))
 Ω(g(n))
 θ(g(n))
IPA – Catherine Faron Zucker
11
Structure de Données

Moyen de stocker et organiser les données
d'un algorithme






accès aux données
modification, mise à jour des données
Tableaux, listes chaînées
Piles, files
Sets et Maps
Graphes, arbres, arbres binaires de recherche
IPA – Catherine Faron Zucker
12
Conception d'un algorithme

Stratégie de résolution d'un problème

Approche itérative


répéter jusqu'à obtention du résultat souhaité
Approche récursive

diviser pour régner
IPA – Catherine Faron Zucker
13
Structures de contrôle

Structures de contrôle conditionnelle

Si cond Alors instr FinSi
 Si cond Alors instr sinon instr FinSi
(imbrications possibles)

Structures de contrôle itératives

TantQue cond Faire instr FinTantQue
 variantes
(imbrications possibles)
IPA – Catherine Faron Zucker
14
Itérations
int i = 0;
while(i<10){
System.out.println(“Coucou”);
i +=1;
}
IPA – Catherine Faron Zucker
15
Itérations
int i = 0;
do{
System.out.println(“Coucou”);
i +=1;
}while(i<10);
for (i=0; i<10; i++) System.out.println(“Coucou”);
IPA – Catherine Faron Zucker
16
Calcul du pgcd
PGCD(a,b)
n <- a; m <- b;
TantQue m != 0 Faire
r <- n mod m
n <- m
m <- r
FinTantQue
retourner n
IPA – Catherine Faron Zucker
17
Validité d'une boucle

Invariant de boucle

Initialisation


Conservation


Montrer que I est vrai avant d'entrer dans la boucle
Montrer que si C et I sont vrais, alors après la liste
d'instructions, I est encore vrai.
Terminaison

On en déduit que (I et non C) est vrai à la sortie de la
boucle (si la boucle termine).
IPA – Catherine Faron Zucker
18
PGCD(a, b)
n <- a; m <- b;
{ Invariant : pgcd(a,b)=pgcd(n,m) et n>=0 et m>=0 }
TantQue m != 0 Faire
r <- n mod m
n <- m
m <- r
{ pgcd(a,b)=pgcd(m,n) et m>=0 et n>0 }
FinTantQue
// pgcd(a,b)=pgcd(n,m) et n>=0 et m=0
// Donc n=pgcd(a,b)
IPA – Catherine Faron Zucker
19
Fact(n)
i ← 1; fact ← 1
{ Invariant: fact = i ! et i ≤ n }
TantQue i < n Faire
i←i+1
fact ← fact * i
{ Invariant: fact = i ! et i ≤ n }
FinTantQue
(fact = i ! et i ≤ n ) et non(i<n)
retourner fact
IPA – Catherine Faron Zucker
20
Structures de Données

Moyen de stocker et organiser les données
d'un algorithme






accès aux données
modification, mise à jour des données
Tableaux, listes chaînées
Piles, files
Sets et Maps
Graphes, arbres, arbres binaires de recherche
IPA – Catherine Faron Zucker
21
Tableaux

suite ordonnée d'éléments de taille fixe
int [] tableau = new int[10];




premier élément : tableau[0]
dernier élément : tableau[tableau.length -1]
i ième élément : tableau[i-1]
init./modif. d'un élément: tableau[i] = 3;
IPA – Catherine Faron Zucker
22
Tableaux





valeur tableau[i] / indice i
recherche du (des) élément(s) vérifiant une
certaine propriété
vérification de la présence ou l'absence d'une
certaine valeur dans le tableau
recherche de l'indice dans le tableau d'une
valeur donné
tri du tableau selon un certain critère
IPA – Catherine Faron Zucker
23
Matrices

Tableau de tableaux :
int [][] matrice = new int[10][15];

élément en ligne i et colonne j :
matrice[i][j]

Matrice carrée :
int [][] matriceCarree = new int[7][7];
IPA – Catherine Faron Zucker
24
Listes

suite ordonnée d'éléments de taille variable
ArrayList<Integer> liste;
liste = new ArrayList<Integer>();




Ne peuvent contenir que des objets
premier élément : liste.get(0)
dernier élément : liste.get(liste.size()-1)
i ième élément : liste.get(i-1)
IPA – Catherine Faron Zucker
25
Listes

ajout d'un élt: liste.add(new Integer(3));
modif d'un élt: liste.set(i,new Integer(4));
suppression d'un élt: liste.remove(i);

mêmes algos que sur les tableaux


IPA – Catherine Faron Zucker
26
Piles et Files



Ordonnancements particuliers des éléments
d'un tableau ou d'une liste
Pile : empiler/dépiler des éléments
 statique ou dynamique selon qu'on utilise un
tableau ou une liste
File : enfiler /défiler des éléments
 implémentation par liste plus simple
IPA – Catherine Faron Zucker
27
Piles
public class Pile{
private Object[] table;
private int hauteur;
public void empiler(Object o)
{table[hauteur]=o; hauteur++;}
public Object depiler()
{hauteur--; return table[hauteur];}
public Object sommet(){}
public boolean vide(){}
public boolean pleine(){}
}
IPA – Catherine Faron Zucker
28
Files
public class Pile{
private ArrayList<Object> liste;
private int longueur;
public void enfiler(Object o)
{liste.add(o); longueur++;}
public Object defiler()
{longueur--; return liste.remove(0);}
public Object tete(){}
public Object queue(){}
public boolean vide(){}
}
IPA – Catherine Faron Zucker
29
Maps

collection de paires d'objets, de taille variable
HashMap<String,String> surnoms;
surnoms = new HashMap<String,String>();

paires clé/valeur, clés uniques

ajout d'un couple clé/valeur :
surnoms.put(“tartampion”, “dupont”);

suppression d'un couple clé/valeur :
surnoms.remove(“tartampion”);
IPA – Catherine Faron Zucker
30
Maps

plus de premier, dernier, i ième élément,
récupération d'une valeur associée à une clé :
String nom = surnoms.get(“tartampion”);

récupération directe de


la valeur associée à une clé : get
de l'information de présence/absence


d'une valeur: surnom.containsKey(“dupont”);
d'une clé : surnom.containsValue(“tartampion”);
IPA – Catherine Faron Zucker
31
Sets

ensemble non ordonné d'objets, de taille variable
HashSet<String> surnoms;
surnoms = new HashSet<String>();



ajout d'un élément : surnoms.put(“tartampion”);
suppression : surnoms.remove(“tartampion”);
test direct de la présence d'un élément :
surnoms.contains(“tartampion”);
IPA – Catherine Faron Zucker
32
Maps et Sets


Les structures de Maps et de Sets ne supportent que
les opérations de dictionnaire:
insérer, rechercher, supprimer
HashMap et HashSet sont des implémentations à base
de tables de hachage qui permettent de réduire le coût
de ces opérations.
à suivre...
IPA – Catherine Faron Zucker
33
Structures de données

listes chaînées : cf. td





simplement, doublement
arbres
arbres binaires
arbres binaires de recherche
graphes
à suivre...
IPA – Catherine Faron Zucker
34
Conception d'un algorithme

Stratégie de résolution d'un problème

Approche incrémentale


itérer jusqu'à obtention du résultat souhaité
Approche récursive

diviser pour régner:



diviser en sous-problèmes
régner sur les sous-problèmes
combiner les solutions des sous-problèmes
IPA – Catherine Faron Zucker
35
PGCD(a, b) itératif
n <- a; m <- b;
TantQue m != 0 Faire
r <- n mod m
n <- m
m <- r
FinTantQue
retourner n
IPA – Catherine Faron Zucker
36
PGCD(a, b) récursif

diviser: pgcd(a,b) = pgcd(b, a mod b)
semblable au problème initial
de taille moindre

régner: pgcd(a,0) = a

combiner: pgcd(a,b)= pgcd(b,a mod b)=...
IPA – Catherine Faron Zucker
37
PGCD(a, b) récursif
Si b=0
Alors retourner a //terminaison
Sinon retourner pgcd(a, a mod b)
finSi
IPA – Catherine Faron Zucker
38
Fac(n)

Relation de récurence
fac(n) = n * fac(n-1), n>0
fac(0) = 1

Algorithme
Si n = 0
Alors retourner 1
Sinon retourner n * fac(n-1)
FinSi
IPA – Catherine Faron Zucker
39
Fac(n)
Complexité


opération élémentaire : *
nbre de fois où elle est effectuée
fonction de n: M(n)
 relation de récurence:
M(n) = 1 + M(n-1) pour n>0 et M(0) = 0
en développant, on a M(n) = M(n-i) – i pour tout i
pour i=n, on obtient M(n) = M(O) + n = n

cf. module Maths discrètes
IPA – Catherine Faron Zucker
40
Tours de Hanoï



n disques de tailles décroissantes sur une tige
Problème: comment faire passer les n disques sur
une autre tige, en utilisant une tige intermédiaire
afin qu'un disque ne soit jamais empilé sur un plus
petit?
Algorithme (récursif):
 faire passer n-1 disques sur la tige 2
 faire passer le plus grand disque sur la tige 3
 reste à faire passer les n-1 disques de t2 à t3
IPA – Catherine Faron Zucker
41
Tours de Hanoï


Algorithme:
 faire passer n-1 disques sur la tige 2
 faire passer le plus grand disque sur la tige 3
 reste à faire passer les n-1 disques de t2 à t3
Complexité
 on compte le nbre de déplacements
 il est fonction du nombre de disques
 M(n) = M(n-1) + 1 + M(n-1) pour n>1 et M(1)=1
 M(n) = 2*M(n-1)+1 = ... = 2n -1 (algo exponentiel)
IPA – Catherine Faron Zucker
42
Recherche dichotomique


Version itérative vue en TD
Version récursive ?
IPA – Catherine Faron Zucker
43
Algorithmes de tri


Structures de données ordonnées
Nombreux algorithmes





tri par sélection
tri par insertion
tri à bulles
tri fusion
tri rapide (quicksort)
IPA – Catherine Faron Zucker
44
Tri par sélection

Principe

recherche du plus petit élt du tableau et échange
avec le premier élt

recherche du plus petit élt du tableau entre les
positions 2 et n-1 et échange avec le second élt

...

recherche du plus petit élt entre les positions n-2
et n-1 et échange avec l'élt en position n-2
IPA – Catherine Faron Zucker
45
Tri par sélection

Algorithme itératif
Pour i de 0 à n-2 Faire
min <- i
Pour j de i+1 à n-1 Faire
Si tab[ j ] < tab[min] Alors min <- j FinSi
FinPour
Echanger tab[ i ] et tab[min]
FinPour
IPA – Catherine Faron Zucker
46
Tri par insertion

Principe
le tableau étant trié jusqu'à l'élt i-1,
insérer l'élt i à sa place parmi les i premiers élts
récursion ou itération
IPA – Catherine Faron Zucker
47
Tri par insertion

Algorithme itératif
Pour i de 1 à n-1 Faire
val <- tab[ i ]
j <- i-1
TantQue j >= 0 et tab[ j ] > val Faire
tab [ j+1] <- tab [ j ]
j <- j - 1
FinTantQue
tab [ j+1 ] <- val
IPA – Catherine Faron Zucker
48
Tri à bulles

Principe
comparaison 2 à 2 des éléments adjacents
et échange s'ils ne sont pas ordonnés
comme les bulles, les plus grands élts remonten
en fin de liste
IPA – Catherine Faron Zucker
49
Tri à bulles

Algorithme itératif
Pour i de 0 à n-2 Faire
Pour j de 0 à n-2-i Faire
Si tab[ j+1 ] < tab[ j ]
Alors échanger tab[ j+1 ] < tab[ j ]
FinSi
FinPour
FinPour
IPA – Catherine Faron Zucker
50
Tri Fusion

Principe
“divide and conquer”

division du tableau en 2 sous-tableaux

tri récursif des 2 sous-tableaux

fusion des 2 sous-tableaux
Le coeur de l'algorithme est la fusion des 2
sous-tableaux triés
IPA – Catherine Faron Zucker
51
Tri fusion

Algorithme TriFusion(tab[0 .. n-1])
Si n > 1 Alors
copie de tab[ 0 .. n/2 -1] dans tab1
copie de tab[ n/2 n-1] dans tab2
TriFusion (tab1)
TriFusion (tab2)
Fusion (tab1, tab2, tab)
IPA – Catherine Faron Zucker
52
Quick Sort

Principe
“divide and conquer”

partition du tableau en 2 sous-tableaux tel que
l'élt à l'indice de partitionnement est bien placé

tri récursif des 2 sous-tableaux
Le coeur de l'algorithme est la partition en 2
sous-tableaux
IPA – Catherine Faron Zucker
53
Quick Sort

Algorithme QuickSort(tab[ g .. d )
Si g < d Alors
s <- Partition(tab)
QuickSort(tab[g .. s-1])
QuickSort(tab[s+1 .. d])
IPA – Catherine Faron Zucker
54
Téléchargement