Complexite Slides PDF
Complexite Slides PDF
Complexite Slides PDF
1/53 Complexité 1/
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
2/53 Complexité 2/
Introduction
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
3/53 Complexité 3/
Introduction
Crédits
4/53 Complexité 4/
Introduction
Crédits
4/53 Complexité 4/
Introduction
Crédits
4/53 Complexité 4/
Introduction
Définition
5/53 Complexité 5/
Introduction
Définition
5/53 Complexité 5/
Introduction
Temps et espace
6/53 Complexité 6/
Introduction
Temps et espace
6/53 Complexité 6/
Introduction
Temps et espace
6/53 Complexité 6/
Introduction
Définition
Définition
Notons Dn l’ensemble des données de taille n et C (d) la complexité d’un
certain programme pour une donnée d.
1 La complexité dans le pire cas est Cmax (n) = max C (d)
d∈Dn
7/53 Complexité 7/
Introduction
Définition
Définition
Notons Dn l’ensemble des données de taille n et C (d) la complexité d’un
certain programme pour une donnée d.
1 La complexité dans le pire cas est Cmax (n) = max C (d)
d∈Dn
2 La complexité dans le meilleur cas est Cmin (n) = min C (d)
d∈Dn
7/53 Complexité 7/
Introduction
Définition
Définition
Notons Dn l’ensemble des données de taille n et C (d) la complexité d’un
certain programme pour une donnée d.
1 La complexité dans le pire cas est Cmax (n) = max C (d)
d∈Dn
2 La complexité dans le meilleur cas est Cmin (n) = min C (d)
d∈Dn
X
3 La complexité en moyenne est Cmoy (n) = P(d)C (d) où P
d∈Dn
désigne la loi de probabilité associée à l’apparition des données de
taille n.
7/53 Complexité 7/
Introduction
Landau
Définition
Soient U = (un ) et V = (vn ) deux suites réelles positives. On dit que :
1 U est dominée par V si il existe λ ∈ R+ et N ∈ N tels que pour tout
n ∈ N, si n ≥ N alors un ≤ λvn . On le note un = O(vn ).
On dit aussi que V domine U.
8/53 Complexité 8/
Introduction
Landau
Définition
Soient U = (un ) et V = (vn ) deux suites réelles positives. On dit que :
1 U est dominée par V si il existe λ ∈ R+ et N ∈ N tels que pour tout
n ∈ N, si n ≥ N alors un ≤ λvn . On le note un = O(vn ).
On dit aussi que V domine U.
2 U et V sont de même ordre (de grandeur) si U domine V et V
domine U (i.e. un = O(vn ) et vn = O(un )). On le note un = Θ(vn )
( un est en grand theta de vn ).
8/53 Complexité 8/
Introduction
Landau
Définition
Soient U = (un ) et V = (vn ) deux suites réelles positives. On dit que :
1 On écrit un = Ω(vn ) ( un est en grand Omega de vn ) si il existe
λ ∈ R+ et N ∈ N tels que pour tout n ∈ N, si n ≥ N alors un ≥ λvn .
Observons que dans ce cas λ1 un ≥ vn et donc
un = Ω(vn ) ⇐⇒ vn = O(un ).
Remarque
Si un ∼ vn alors un = Θ(vn ).
9/53 Complexité 9/
Introduction
Landau
Définition
Soient U = (un ) et V = (vn ) deux suites réelles positives. On dit que :
1 On écrit un = Ω(vn ) ( un est en grand Omega de vn ) si il existe
λ ∈ R+ et N ∈ N tels que pour tout n ∈ N, si n ≥ N alors un ≥ λvn .
Observons que dans ce cas λ1 un ≥ vn et donc
un = Ω(vn ) ⇐⇒ vn = O(un ).
2 U et V sont dites équivalentes si et seulement si vn 6= 0 APCR et
un
−→ 1.
vn n→+∞
Cette définition (qui nous suffit) est plus restrictive que celle du cours
de maths.
Remarque
Si un ∼ vn alors un = Θ(vn ).
9/53 Complexité 9/
Introduction
Ordres de grandeur
10/53 Complexité 10 /
Introduction
Que compter ?
11/53 Complexité 11 /
Opérations élémentaires
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
12/53 Complexité 12 /
Opérations élémentaires Présentation
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
13/53 Complexité 13 /
Opérations élémentaires Présentation
Opérations élémentaires
Pour mesurer le temps d’exécution d’un programme, on utilise le
nombre d’opérations élémentaires à effectuer plutôt qu’une durée en
seconde. En général on en cherche une majoration, plus rarement une
minoration.
14/53 Complexité 14 /
Opérations élémentaires Présentation
Opérations élémentaires
Pour mesurer le temps d’exécution d’un programme, on utilise le
nombre d’opérations élémentaires à effectuer plutôt qu’une durée en
seconde. En général on en cherche une majoration, plus rarement une
minoration.
La raison est que le même programme s’exécutera plus ou moins vite
selon la machine mais que le nombre d’opérations ne changera pas.
14/53 Complexité 14 /
Opérations élémentaires Présentation
Opérations élémentaires
Pour mesurer le temps d’exécution d’un programme, on utilise le
nombre d’opérations élémentaires à effectuer plutôt qu’une durée en
seconde. En général on en cherche une majoration, plus rarement une
minoration.
La raison est que le même programme s’exécutera plus ou moins vite
selon la machine mais que le nombre d’opérations ne changera pas.
Les opérations suivantes sont dites élémentaires
1 +; −; / ; / ; ∗ ; % // op é r a t i o n s s u r l e s nombres
2 a = . . . . ; r e t u r n // a f f e c t a t i o n , r e t o u r n e r , a f f i c h e r
3 t [ i ] # a c c è s
4 . . . < . . . ; . . . == . . . ; // c o m p a r a i s o n s de nombres
5 f r e e ( t ) // l i b é r a t i o n
6
14/53 Complexité 14 /
Opérations élémentaires Présentation
Opérations élémentaires
Pour mesurer le temps d’exécution d’un programme, on utilise le
nombre d’opérations élémentaires à effectuer plutôt qu’une durée en
seconde. En général on en cherche une majoration, plus rarement une
minoration.
La raison est que le même programme s’exécutera plus ou moins vite
selon la machine mais que le nombre d’opérations ne changera pas.
Les opérations suivantes sont dites élémentaires
1 +; −; / ; / ; ∗ ; % // op é r a t i o n s s u r l e s nombres
2 a = . . . . ; r e t u r n // a f f e c t a t i o n , r e t o u r n e r , a f f i c h e r
3 t [ i ] # a c c è s
4 . . . < . . . ; . . . == . . . ; // c o m p a r a i s o n s de nombres
5 f r e e ( t ) // l i b é r a t i o n
6
Exemple introductif
15/53 Complexité 15 /
Opérations élémentaires Présentation
Exemple introductif
15/53 Complexité 15 /
Opérations élémentaires Présentation
Exemple introductif
15/53 Complexité 15 /
Opérations élémentaires Présentation
16/53 Complexité 16 /
Opérations élémentaires Présentation
16/53 Complexité 16 /
Opérations élémentaires Présentation
√
n itérations au plus, moins de 20 op. elem. par passage.
17/53 Complexité 17 /
Opérations élémentaires Présentation
√
n itérations au plus, moins de 20 op. elem. par passage.
√ √
En tout pas plus de 3 + 20 n opérations élémentaires . O( n).
17/53 Complexité 17 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
Taille du problème
18/53 Complexité 18 /
Opérations élémentaires Présentation
19/53 Complexité 19 /
Opérations élémentaires Présentation
19/53 Complexité 19 /
Opérations élémentaires Présentation
19/53 Complexité 19 /
Opérations élémentaires Présentation
19/53 Complexité 19 /
Opérations élémentaires Présentation
20/53 Complexité 20 /
Opérations élémentaires Présentation
20/53 Complexité 20 /
Opérations élémentaires Présentation
21/53 Complexité 21 /
Opérations élémentaires Présentation
21/53 Complexité 21 /
Opérations élémentaires Présentation
C (0) = C (1) = 0 ;
21/53 Complexité 21 /
Opérations élémentaires Présentation
C (0) = C (1) = 0 ;
C (n) = C (n − 1) + 1 : une multiplication seulement dans le cas n ≥ 2.
21/53 Complexité 21 /
Opérations élémentaires Présentation
C (0) = C (1) = 0 ;
C (n) = C (n − 1) + 1 : une multiplication seulement dans le cas n ≥ 2.
Alors
21/53 Complexité 21 /
Opérations élémentaires Présentation
22/53 Complexité 22 /
Opérations élémentaires Présentation
22/53 Complexité 22 /
Opérations élémentaires Présentation
22/53 Complexité 22 /
Opérations élémentaires Présentation
22/53 Complexité 22 /
Opérations élémentaires Présentation
limites du modèle
Le modèle de complexité présenté est une approximation de la réalité.
23/53 Complexité 23 /
Opérations élémentaires Présentation
limites du modèle
Le modèle de complexité présenté est une approximation de la réalité.
Le modèle ne tient pas compte du fait que la taille des entiers peut
être grande (surtout vrai en Python). La multiplication de deux très
grands nombres est bien entendu plus coûteuse que celle de 2 ∗ 3.
Il faudra par exemple d’abord lire tous les chiffres des opérandes et
écrire ceux du résultat. Plus toutes les autres opérations logicielles
que Python ajoute au traitement processeur.
23/53 Complexité 23 /
Opérations élémentaires Présentation
limites du modèle
Le modèle de complexité présenté est une approximation de la réalité.
Le modèle ne tient pas compte du fait que la taille des entiers peut
être grande (surtout vrai en Python). La multiplication de deux très
grands nombres est bien entendu plus coûteuse que celle de 2 ∗ 3.
Il faudra par exemple d’abord lire tous les chiffres des opérandes et
écrire ceux du résultat. Plus toutes les autres opérations logicielles
que Python ajoute au traitement processeur.
Autre exemple, une très grande liste (ou matrice) ne tiendra pas en
mémoire vive : il faudra faire des accès disques pour parcourir les
éléments.
23/53 Complexité 23 /
Opérations élémentaires Présentation
limites du modèle
Le modèle de complexité présenté est une approximation de la réalité.
Le modèle ne tient pas compte du fait que la taille des entiers peut
être grande (surtout vrai en Python). La multiplication de deux très
grands nombres est bien entendu plus coûteuse que celle de 2 ∗ 3.
Il faudra par exemple d’abord lire tous les chiffres des opérandes et
écrire ceux du résultat. Plus toutes les autres opérations logicielles
que Python ajoute au traitement processeur.
Autre exemple, une très grande liste (ou matrice) ne tiendra pas en
mémoire vive : il faudra faire des accès disques pour parcourir les
éléments.
En CPGE, on convient que malloc(..) est une opération à coût
constant (ce qui est faux). En revanche realloc(..) peut-être
éventuellement en O(1) dans des cas où il n’y a pas de copie à faire.
23/53 Complexité 23 /
Opérations élémentaires Présentation
limites du modèle
Le modèle de complexité présenté est une approximation de la réalité.
Le modèle ne tient pas compte du fait que la taille des entiers peut
être grande (surtout vrai en Python). La multiplication de deux très
grands nombres est bien entendu plus coûteuse que celle de 2 ∗ 3.
Il faudra par exemple d’abord lire tous les chiffres des opérandes et
écrire ceux du résultat. Plus toutes les autres opérations logicielles
que Python ajoute au traitement processeur.
Autre exemple, une très grande liste (ou matrice) ne tiendra pas en
mémoire vive : il faudra faire des accès disques pour parcourir les
éléments.
En CPGE, on convient que malloc(..) est une opération à coût
constant (ce qui est faux). En revanche realloc(..) peut-être
éventuellement en O(1) dans des cas où il n’y a pas de copie à faire.
L’évaluation du temps mis par un algorithme pour s’exécuter est un
domaine de recherche à part entière, car elle se révèle parfois très
difficile.
23/53 Complexité 23 /
Opérations élémentaires Présentation
24/53 Complexité 24 /
Opérations élémentaires Présentation
24/53 Complexité 24 /
Opérations élémentaires Présentation
Complexité en moyenne
Parler de moyenne des temps d’exécution n’a de sens que si l’on a une
idée de la fréquence des différentes données possibles pour un même
problème de taille n.
25/53 Complexité 25 /
Opérations élémentaires Présentation
Complexité en moyenne
Parler de moyenne des temps d’exécution n’a de sens que si l’on a une
idée de la fréquence des différentes données possibles pour un même
problème de taille n.
Les calculs de complexité moyenne recourent aux notions définies en
mathématiques dans le cadre de la théorie des probabilités et des
statistiques.
25/53 Complexité 25 /
Opérations élémentaires Présentation
Complexité en moyenne
Parler de moyenne des temps d’exécution n’a de sens que si l’on a une
idée de la fréquence des différentes données possibles pour un même
problème de taille n.
Les calculs de complexité moyenne recourent aux notions définies en
mathématiques dans le cadre de la théorie des probabilités et des
statistiques.
La complexité en moyenne n’est, en général, pas attendue dans les
sujets mais on en verra quelques exemples.
25/53 Complexité 25 /
Opérations élémentaires Présentation
Complexité en espace
Il n’y a pas que le temps d’exécution des algorithmes qui intéresse les
informaticiens.
26/53 Complexité 26 /
Opérations élémentaires Présentation
Complexité en espace
Il n’y a pas que le temps d’exécution des algorithmes qui intéresse les
informaticiens.
Une autre ressource importante en informatique est la mémoire.
26/53 Complexité 26 /
Opérations élémentaires Présentation
Complexité en espace
Il n’y a pas que le temps d’exécution des algorithmes qui intéresse les
informaticiens.
Une autre ressource importante en informatique est la mémoire.
On appelle complexité en espace d’un algorithme la place nécessaire
en mémoire pour faire fonctionner cet algorithme en dehors des
paramètres du programme.
26/53 Complexité 26 /
Opérations élémentaires Présentation
Complexité en espace
Il n’y a pas que le temps d’exécution des algorithmes qui intéresse les
informaticiens.
Une autre ressource importante en informatique est la mémoire.
On appelle complexité en espace d’un algorithme la place nécessaire
en mémoire pour faire fonctionner cet algorithme en dehors des
paramètres du programme.
Elle s’exprime également sous la forme d’un O(f (n)) où n est la taille
du problème.
26/53 Complexité 26 /
Opérations élémentaires Présentation
Complexité en mémoire
27/53 Complexité 27 /
Opérations élémentaires Présentation
Complexité en mémoire
27/53 Complexité 27 /
Opérations élémentaires Présentation
Complexité en mémoire
27/53 Complexité 27 /
Opérations élémentaires Un mot sur la racine carrée
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
28/53 Complexité 28 /
Opérations élémentaires Un mot sur la racine carrée
Objectif
29/53 Complexité 29 /
Opérations élémentaires Un mot sur la racine carrée
Objectif
29/53 Complexité 29 /
Opérations élémentaires Un mot sur la racine carrée
Objectif
29/53 Complexité 29 /
Opérations élémentaires Un mot sur la racine carrée
Objectif
29/53 Complexité 29 /
Opérations élémentaires Un mot sur la racine carrée
Méthode de Héron
√
Calcul de A
Par dichotomie avec une précision ε en résolvant x 2 − A = 0 sur
[0; A + 1]. Calcul en O(log( A+1
ε )). Ce n’est déjà pas si mal.
30/53 Complexité 30 /
Opérations élémentaires Un mot sur la racine carrée
Méthode de Héron
√
Calcul de A
Par dichotomie avec une précision ε en résolvant x 2 − A = 0 sur
[0; A + 1]. Calcul en O(log( A+1
ε )). Ce n’est déjà pas si mal.
Méthode de Héron (une spécialisation de la méthode de Newton à cet
objectif particulier) :
30/53 Complexité 30 /
Opérations élémentaires Un mot sur la racine carrée
Méthode de Héron
√
Calcul de A
Par dichotomie avec une précision ε en résolvant x 2 − A = 0 sur
[0; A + 1]. Calcul en O(log( A+1
ε )). Ce n’est déjà pas si mal.
Méthode de Héron (une spécialisation de la méthode de Newton à cet
objectif particulier) :
1 A
Choisir x0 initial puis xk+1 = (xk + ).
2 xk
30/53 Complexité 30 /
Opérations élémentaires Un mot sur la racine carrée
Méthode de Héron
√
Calcul de A
Par dichotomie avec une précision ε en résolvant x 2 − A = 0 sur
[0; A + 1]. Calcul en O(log( A+1
ε )). Ce n’est déjà pas si mal.
Méthode de Héron (une spécialisation de la méthode de Newton à cet
objectif particulier) :
1 A
Choisir x0 initial puis xk+1 = (xk + ).
2 xk
Convergence quadratique : le nombre de chiffres significatifs double à
chaque itération. Au bout de quelques itérations (15 ou 20), on atteint
la précision maximale possible sur un ordinateur de bureau. On peut
alors considérer que le calcul de la racine carrée est quasiment en
temps constant (pas tout à fait).
30/53 Complexité 30 /
Opérations élémentaires Un mot sur la racine carrée
1
John Carmack et √
A
John Carmack est un informaticien américain à l’origine de nombreux jeux
vidéos, dont Wolfenstein 3D, Doom et Quake.
Les cartes graphiques 3D avec processeur 32 bits (la majorité des
cartes du marché en 2020) utilisent l’astuce de John Carmack et son
√ 1
nombre magique pour calculer, non pas A mais √ .
A
31/53 Complexité 31 /
Opérations élémentaires Un mot sur la racine carrée
1
John Carmack et √
A
John Carmack est un informaticien américain à l’origine de nombreux jeux
vidéos, dont Wolfenstein 3D, Doom et Quake.
Les cartes graphiques 3D avec processeur 32 bits (la majorité des
cartes du marché en 2020) utilisent l’astuce de John Carmack et son
√ 1
nombre magique pour calculer, non pas A mais √ .
A
Le flottant A codé sur 32 bits en A = (−1)0 2e1 (1 + m1 ) est considéré
comme l’entier I1 = 223 (127 + e1 + m1 ) : int i1 = *(int *) &a; .
31/53 Complexité 31 /
Opérations élémentaires Un mot sur la racine carrée
1
John Carmack et √
A
John Carmack est un informaticien américain à l’origine de nombreux jeux
vidéos, dont Wolfenstein 3D, Doom et Quake.
Les cartes graphiques 3D avec processeur 32 bits (la majorité des
cartes du marché en 2020) utilisent l’astuce de John Carmack et son
√ 1
nombre magique pour calculer, non pas A mais √ .
A
Le flottant A codé sur 32 bits en A = (−1)0 2e1 (1 + m1 ) est considéré
comme l’entier I1 = 223 (127 + e1 + m1 ) : int i1 = *(int *) &a; .
Carmack utilise son nombre magique, l’entier codé en hexadécimal
I1
0x5f 3759df (on a trouvé mieux depuis) et lui soustrait b c. Il
2
convertit ensuite cet entier en flottant.
31/53 Complexité 31 /
Opérations élémentaires Un mot sur la racine carrée
1
John Carmack et √
A
John Carmack est un informaticien américain à l’origine de nombreux jeux
vidéos, dont Wolfenstein 3D, Doom et Quake.
Les cartes graphiques 3D avec processeur 32 bits (la majorité des
cartes du marché en 2020) utilisent l’astuce de John Carmack et son
√ 1
nombre magique pour calculer, non pas A mais √ .
A
Le flottant A codé sur 32 bits en A = (−1)0 2e1 (1 + m1 ) est considéré
comme l’entier I1 = 223 (127 + e1 + m1 ) : int i1 = *(int *) &a; .
Carmack utilise son nombre magique, l’entier codé en hexadécimal
I1
0x5f 3759df (on a trouvé mieux depuis) et lui soustrait b c. Il
2
convertit ensuite cet entier en flottant.
Quelle que soit la valeur de A, on peut montrer que le flottant
1
retourné est proche de √ avec une erreur au pire de 2/1000 ! !
A
Complexité temporelle en O(1).
31/53 Complexité 31 /
Exemples de complexités de fonctions récursives
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
32/53 Complexité 32 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
33/53 Complexité 33 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
Exponentiation naı̈ve
34/53 Complexité 34 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
Exponentiation naı̈ve
34/53 Complexité 34 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
Exponentiation naı̈ve
34/53 Complexité 34 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
Exponentiation naı̈ve
34/53 Complexité 34 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
35/53 Complexité 35 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
35/53 Complexité 35 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
35/53 Complexité 35 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
35/53 Complexité 35 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
36/53 Complexité 36 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
Donc Cn = O(n2 )
36/53 Complexité 36 /
Exemples de complexités de fonctions récursives Récurrences Cn = Cn−1 + 1 et Cn = Cn−1 + n
Donc Cn = O(n2 )
Complexité au mieux Cn = Cn−1 + 1. Donc Cn = O(n).
36/53 Complexité 36 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
37/53 Complexité 37 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
38/53 Complexité 38 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
38/53 Complexité 38 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
38/53 Complexité 38 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
38/53 Complexité 38 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
38/53 Complexité 38 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Proposition
Soient a,b deux entiers tels que ab 6= 0 et f , g deux fonctions croissantes
de même ordre de grandeur. Alors les suites (Un ) et (Vn ) telles que
U0 = V0 et pour tout n ∈ N∗ :
39/53 Complexité 39 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
40/53 Complexité 40 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Quelques observations
41/53 Complexité 41 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Dichotomie
A chaque étape, la zone de recherche est divisée par deux (on note
n//2 la division euclidienne) :
x x x x x : tableau de taille impaire n
m
les 2 sous-tableaux de taille n//2 ou n//2+1
x x x x : tableau de taille paire n
m
Au moins un sous-tableau de taille n//2
42/53 Complexité 42 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Dichotomie
Hors appels récursifs, il y a un nombre borné d’autres opérations,
toutes en O(1). Le coût total à chaque tour hors appels récursifs est
donc O(1).
43/53 Complexité 43 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Dichotomie
Hors appels récursifs, il y a un nombre borné d’autres opérations,
toutes en O(1). Le coût total à chaque tour hors appels récursifs est
donc O(1).
Pour un tableau de taille n, la complexité au pire est du type
Cn = Cd n2 e + O(1) ; simplifiée en Cn = Cd n2 e + 1 (on cherche dans le
plus grand sous-tableau pour que ce soit le pire cas)
43/53 Complexité 43 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Dichotomie
Hors appels récursifs, il y a un nombre borné d’autres opérations,
toutes en O(1). Le coût total à chaque tour hors appels récursifs est
donc O(1).
Pour un tableau de taille n, la complexité au pire est du type
Cn = Cd n2 e + O(1) ; simplifiée en Cn = Cd n2 e + 1 (on cherche dans le
plus grand sous-tableau pour que ce soit le pire cas)
Si n = 2p alors
+ 1} = · · · = C20 +p = Θ(log2 n)
C2p = C2p−1 + 1 = C2p−2 + 1| {z
|{z}
2 cte
43/53 Complexité 43 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Dichotomie
Hors appels récursifs, il y a un nombre borné d’autres opérations,
toutes en O(1). Le coût total à chaque tour hors appels récursifs est
donc O(1).
Pour un tableau de taille n, la complexité au pire est du type
Cn = Cd n2 e + O(1) ; simplifiée en Cn = Cd n2 e + 1 (on cherche dans le
plus grand sous-tableau pour que ce soit le pire cas)
Si n = 2p alors
+ 1} = · · · = C20 +p = Θ(log2 n)
C2p = C2p−1 + 1 = C2p−2 + 1| {z
|{z}
2 cte
43/53 Complexité 43 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Dichotomie
Hors appels récursifs, il y a un nombre borné d’autres opérations,
toutes en O(1). Le coût total à chaque tour hors appels récursifs est
donc O(1).
Pour un tableau de taille n, la complexité au pire est du type
Cn = Cd n2 e + O(1) ; simplifiée en Cn = Cd n2 e + 1 (on cherche dans le
plus grand sous-tableau pour que ce soit le pire cas)
Si n = 2p alors
+ 1} = · · · = C20 +p = Θ(log2 n)
C2p = C2p−1 + 1 = C2p−2 + 1| {z
|{z}
2 cte
Exponentiation rapide
Principe x 2k = (x 2 )k et x 2k+1 = x · x 2k
44/53 Complexité 44 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Exponentiation rapide
Principe x 2k = (x 2 )k et x 2k+1 = x · x 2k
Complexité en nombre de multiplications
44/53 Complexité 44 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Exponentiation rapide
Principe x 2k = (x 2 )k et x 2k+1 = x · x 2k
Complexité en nombre de multiplications
Lorsque n est paire Cn = Cn/2 + 1 = Cb n2 c + 1.
44/53 Complexité 44 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Exponentiation rapide
Principe x 2k = (x 2 )k et x 2k+1 = x · x 2k
Complexité en nombre de multiplications
Lorsque n est paire Cn = Cn/2 + 1 = Cb n2 c + 1.
Si n est impaire (et > 1), Cn = 1 + Cn−1 = 1 + C(n−1)/2 + 1 = Cb n2 c + 2.
44/53 Complexité 44 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Exponentiation rapide
Principe x 2k = (x 2 )k et x 2k+1 = x · x 2k
Complexité en nombre de multiplications
Lorsque n est paire Cn = Cn/2 + 1 = Cb n2 c + 1.
Si n est impaire (et > 1), Cn = 1 + Cn−1 = 1 + C(n−1)/2 + 1 = Cb n2 c + 2.
Donc récurrence de la forme Cn = Cb n2 c + O(1). On étudie toujours la
forme la plus simple Cn = Cb n2 c + 1. On a vu que Cn = O(log2 n)
44/53 Complexité 44 /
Exemples de complexités de fonctions récursives Stratégie diviser pour régner
Exponentiation rapide
Principe x 2k = (x 2 )k et x 2k+1 = x · x 2k
Complexité en nombre de multiplications
Lorsque n est paire Cn = Cn/2 + 1 = Cb n2 c + 1.
Si n est impaire (et > 1), Cn = 1 + Cn−1 = 1 + C(n−1)/2 + 1 = Cb n2 c + 2.
Donc récurrence de la forme Cn = Cb n2 c + O(1). On étudie toujours la
forme la plus simple Cn = Cb n2 c + 1. On a vu que Cn = O(log2 n)
Il est pertinent ici d’exprimer la complexité en fonction du nombre de
bits de n : il vaut blog2 nc + 1 = Θ(log2 n). Donc complexité linéaire
en le nombre de bits de l’exposant.
44/53 Complexité 44 /
Exemples de complexités de fonctions récursives Tri fusion
1 Introduction
2 Opérations élémentaires
Présentation
Un mot sur la racine carrée
45/53 Complexité 45 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
46/53 Complexité 46 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
Division
47/53 Complexité 47 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
Division
Tri fusion
fusion
48/53 Complexité 48 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
fusion
48/53 Complexité 48 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
fusion
Tri fusion
fusion
La fonction suivante réalise aussi la fusion. Elle est plus coûteuse que
la précédente mais plus facile à étudier :
1 let rec fusion_couteuse l1 l2 = match ( l1 , l2 ) with
2 | ([] ,[]) -> []
3 | ( a :: r ,[]) | ([] , a :: r ) -> a ::( fusion_couteuse [] r )
4 | ( a :: r , b :: s ) -> if a <= b
5 then a ::( fusion_couteuse r l2 )
6 else b ::( fusion_couteuse l1 s ) ;;
49/53 Complexité 49 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
fusion
La fonction suivante réalise aussi la fusion. Elle est plus coûteuse que
la précédente mais plus facile à étudier :
1 let rec fusion_couteuse l1 l2 = match ( l1 , l2 ) with
2 | ([] ,[]) -> []
3 | ( a :: r ,[]) | ([] , a :: r ) -> a ::( fusion_couteuse [] r )
4 | ( a :: r , b :: s ) -> if a <= b
5 then a ::( fusion_couteuse r l2 )
6 else b ::( fusion_couteuse l1 s ) ;;
49/53 Complexité 49 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
fusion
La fonction suivante réalise aussi la fusion. Elle est plus coûteuse que
la précédente mais plus facile à étudier :
1 let rec fusion_couteuse l1 l2 = match ( l1 , l2 ) with
2 | ([] ,[]) -> []
3 | ( a :: r ,[]) | ([] , a :: r ) -> a ::( fusion_couteuse [] r )
4 | ( a :: r , b :: s ) -> if a <= b
5 then a ::( fusion_couteuse r l2 )
6 else b ::( fusion_couteuse l1 s ) ;;
49/53 Complexité 49 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
fusion
La fonction suivante réalise aussi la fusion. Elle est plus coûteuse que
la précédente mais plus facile à étudier :
1 let rec fusion_couteuse l1 l2 = match ( l1 , l2 ) with
2 | ([] ,[]) -> []
3 | ( a :: r ,[]) | ([] , a :: r ) -> a ::( fusion_couteuse [] r )
4 | ( a :: r , b :: s ) -> if a <= b
5 then a ::( fusion_couteuse r l2 )
6 else b ::( fusion_couteuse l1 s ) ;;
Tri fusion
Tri
50/53 Complexité 50 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
Complexité du tri
51/53 Complexité 51 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
Complexité du tri
51/53 Complexité 51 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
Complexité du tri
51/53 Complexité 51 /
Exemples de complexités de fonctions récursives Tri fusion
Tri fusion
Complexité du tri
On donne ici une version totalement récursive terminale du tri fusion (on
se souvient que List.rev est aussi en récursion terminale).
1 (* vide l alternativement dans l1 et l2 : *)
2 let rec split l l1 l2 = match l with
3 | [] -> l1 , l2
4 | x :: t -> split t l2 ( x :: l1 ) ;;
5
6 let rec merge acc l1 l2 = match l1 , l2 with
7 | [] , l ’ | l ’ , [] -> ( List . rev acc ) @ l ’
8 | x1 :: t1 , x2 :: t2 -> if x1 <= x2
9 then merge ( x1 :: acc ) t1 l2 else merge ( x2 :: acc ) l1 t2 ;;
0
1 let rec sort l = match l with
2 | [] | [ _ ] -> l
3 | _ -> let l1 , l2 = split l [] [] in
4 merge [] ( sort l1 ) ( sort l2 ) ;;
52/53 Complexité 52 /
Exemples de complexités de fonctions récursives Tri fusion
53/53 Complexité 53 /
Exemples de complexités de fonctions récursives Tri fusion
53/53 Complexité 53 /
Exemples de complexités de fonctions récursives Tri fusion
53/53 Complexité 53 /
Exemples de complexités de fonctions récursives Tri fusion
53/53 Complexité 53 /