05 CultureAlgorithmique
05 CultureAlgorithmique
Hypothèse
∫𝑏
𝑓 : [𝑎, 𝑏] → ℝ est une fonction continue sur [𝑎, 𝑏]. On note 𝐼 = 𝑓 (𝑥)d 𝑥 .
𝑎
Définition –
Dans cette méthode, la fonction à intégrer est interpolée par un polynôme de degré
0, à savoir une fonction constante. Géométriquement, l’aire sous la courbe est alors
approximée par un rectangle. Plusieurs choix sont possibles.
∫𝑏
Rectangles à gauche 𝐼= 𝑓 (𝑥)d𝑥 ≃ (𝑏 − 𝑎) 𝑓 (𝑎)
𝑎
∫𝑏 𝑎+𝑏
Point milieu 𝐼= 𝑓 (𝑥)d𝑥 ≃ (𝑏 − 𝑎) 𝑓
𝑎 2
∫𝑏
Rectangles à droite 𝐼= 𝑓 (𝑥)d𝑥 ≃ (𝑏 − 𝑎) 𝑓 (𝑏)
𝑎
Définition –
Dans cette méthode, la fonction à intégrer est interpolée par un polynôme de degré
1, à savoir une fonction affine. Géométriquement, l’aire sous la courbe est alors
∫𝑏 𝑓 (𝑎) + 𝑓 (𝑏)
approximée par un trapèze : 𝐼 = 𝑓 (𝑥)d 𝑥 ≃ (𝑏 − 𝑎)
𝑎 2
Résultat –
Dans chaque cas, on intègre 𝑓 sur 𝑛 subdivisions régulières de 𝐼 .
Erreur sur la méthode des rectangles à gauche et à droite
Soit 𝑓 fonction dérivable sur 𝐼 = [𝑎, 𝑏] et dont 𝑓 ′ est continue sur 𝐼 . Soit 𝑀1 un
majorant de 𝑓 ′ sur 𝐼 . L’erreur 𝜀 commise lors de l’intégration par la méthode des
𝑀1
rectangles à droite ou à gauche est telle que 𝜀 ≤ .
2𝑛
Erreur sur la méthode des rectangles – point milieu
Si de plus 𝑓 est deux fois dérivables sur 𝐼 = [𝑎, 𝑏] et 𝑓 ′′ est continue sur 𝐼 , on note
𝑀2 un majorant de 𝑓 ′′ sur 𝐼 .L’erreur 𝜀 commise lors de l’intégration par la méthode
𝑀2
des rectangles – point milieu est telle que 𝜀 ≤ .
12𝑛 2
Erreur sur la méthode des trapèzes
𝑀
L’erreur commise 𝜀 est telle qu’il existe un entier 𝑀 tel que 𝜀 ≤ .
12𝑛 2
Bibliothèque Python
1 def integrale_rectangles_gauche(f,a,b,nb):
2 """
3 Calcul de la valeur approchée de l'intégrale de f(x) entre a et b par la
4 méthode des rectangles à gauche.
5 Keywords arguments :
6 f -- fonction à valeur dans IR
7 a -- flt, borne inférieure de l'intervalle d'intégration
Xavier Pessoles
Informatique – PTSI
5.1 Intégration numérique 3
1 def integrale_rectangles_droite(f,a,b,nb):
2 """
3 Calcul de la valeur approchée de l'intégrale de f(x) entre a et b par la
4 méthode des rectangles à droite.
5 Keywords arguments :
6 f -- fonction à valeur dans IR
7 a -- flt, borne inférieure de l'intervalle d'intégration
8 b -- flt, borne supérieure de l'intervalle d'intégration
9 nb -- int, nombre d'échantillons pour le calcul
10 """
11 res = 0
12 pas = (b-a)/nb
13 x = a+pas
14 while x<=b:
15 res = res + f(x)
16 x = x + pas
17 return res*pas
1 def integrale_rectangles_milieu(f,a,b,nb):
2 """
3 Calcul de la valeur approchée de l'intégrale de f(x) entre a et b par la m
éthode du point milieu.
4 Keywords arguments :
5 f -- fonction à valeur dans IR
6 a -- flt, borne inférieure de l'intervalle d'intégration
7 b -- flt, borne supérieure de l'intervalle d'intégration
8 nb -- int, nombre d'échantillons pour le calcul
9 """
10 res = 0
11 pas = (b-a)/nb
12 x = a+pas/2
13 while x<b:
14 res = res + f(x)
15 x = x + pas
16 return res*pas
Méthode des trapèzes pour le calcul approché d’une intégrale sur un segment
1 def integrale_trapeze(f,a,b,nb):
2 """
Xavier Pessoles
Informatique – PTSI
4 5 Culture algorithmique
Xavier Pessoles
Informatique – PTSI
5.2 Algorithmes dichotomiques 5
5.2.1 Introduction
Les méthodes de résolutions par un algorithme dichotomique font partie des algo-
rithmes basés sur le principe de « diviser pour régner ». Elles utilisent la définition du
terme dichotomie qui signifie diviser un tout en deux parties « opposées ». Certains
algorithmes de tris sont basés sur ce principe de diviser pour régner.
Ce cours vous présente deux algorithmes dichotomiques :
▶ la recherche d’un élément dans une liste triée ;
▶ la détermination de la racine d’une fonction quand elle existe.
Propriété –
Xavier Pessoles
Informatique – PTSI
6 5 Culture algorithmique
Exemples d’application
Implémentation récursive
𝑔𝑛 + 𝑑 𝑛
À l’itération suivante, 𝑚𝑛+1 =
2
▶ ou bien L[m]==x0 et l’alogrithme s’arrête ;
Xavier Pessoles
Informatique – PTSI
5.2 Algorithmes dichotomiques 7
𝑔𝑛 + 𝑑 𝑛
▶ ou bien 𝑔𝑛+1 = 𝑔𝑛 et 𝑑𝑛+1 = 𝑚𝑛+1 − 1. Ainsi, ℓ 𝑛+1 = − 1 − 𝑔𝑛 et
2
𝑔𝑛 + 𝑑 𝑛 𝑔𝑛 + 𝑑 𝑛 − 2 − 2 𝑔𝑛 ℓ𝑛 − 2
ℓ 𝑛+1 ≤ − 1 − 𝑔𝑛 ≤ ≤ < ℓ𝑛 ;
2 2 2
𝑔𝑛 + 𝑑 𝑛
▶ ou bien 𝑔𝑛+1 = 𝑚𝑛+1 + 1 et 𝑑𝑛+1 = 𝑑𝑛 . Ainsi, ℓ 𝑛+1 = 𝑑𝑛 − − 1 et
2
𝑔𝑛 + 𝑑 𝑛 2 𝑑 𝑛 − 𝑔𝑛 − 𝑑 𝑛
ℓ 𝑛+1 ≤ 𝑑𝑛 − −1≤ − 1 < ℓ𝑛 .
2 2
La longueur ℓ 𝑛 est donc strictement décroissante. L’algorithme terminera donc.
Dans chacun des cas, la propriété d’invariance est vérifiée à la fin de la e itération. C’est
donc bien un invariant de boucle.
Dans le pire des cas, le terme recherché n’est pas dans la liste. On divise donc la taille
du tableau par 2 tant que la taille est supérieure ou égale à 1.
On note 𝑛 la taille du tableau. On cherche 𝑘 le nombre de fois qu’on peut diviser la taille
1
𝑘 𝑘 ln
𝑛
1 1 1 1 1
du tableau par 2 : 𝑛 · ≥1⇒· ≥ ⇒ 𝑘 ln ≥ ln ⇒𝑘 ≥
𝑛 𝑛
2 2 2 1
ln
2
ln 𝑛
⇒𝑘 ≥ . Il y aura donc dans le pire des cas log2 𝑛 opérations. L’algorithme de
ln 2
recherche dichotomique est donc en O(log2 (𝑛)).
Xavier Pessoles
Informatique – PTSI
8 5 Culture algorithmique
Le théorème des valeurs intermédiaires nous assure que 𝑓 possède au moins un zéro
ℓ entre 𝑎 et 𝑏 . La preuve, vue en cours de mathématiques, repose sur la méthode de
dichotomie. Prenons le cas 𝑓 (𝑎) < 0 et 𝑓 (𝑏) > 0 et posons 𝑔0 = 𝑎 , 𝑑0 = 𝑏 .
𝑔0 + 𝑑0
On considère 𝑚0 = et on évalue 𝑓 (𝑚0 ) :
2
Une telle fonction est déjà prédéfinie dans la bibliothèque scipy.optimize, la fonction
2: La méthode de dichotomie s’appelle bisect2 :
aussi la méthode de la bisection.
1 import scipy.optimize as spo
2 print (spo.bisect(f, 1, 2))
3 # il s'affichera : 1.4142135623724243
Xavier Pessoles
Informatique – PTSI
5.3 Tris 9
5.3 Tris
Un tri est effectué en place lorsque la liste à trier est modifiée jusqu’à devenir triée.
Dans le cas contraire, la fonction de tri pourra renvoyer une novelle liste contenent
les mêmes éléments, mais triés.
Un tri est dit comparatif lorsqu’il s’appuie uniquement sur la comparaison deux à
deux des éléments de la liste et pas sur la valeur ce ces éléments.
Exemple –
Xavier Pessoles
Informatique – PTSI
10 5 Culture algorithmique
chercher ici à évaluer la complexité théorique des tris comparatifs en se basant sur
le nombre de comparaisons.
Cet algorithme correspond au fonctionnement du tri insertion que nous verrons
plus loin.
Principe
Le tri par insertion est le tri que l’on effectue naturellement, par exemple pour trier
un jeu de cartes. On trie les premières puis à chaque nouvelle carte on l’ajoute à
l’ensemble déjà trié à la bonne place.
Ce tri s’effectue en place, c’est-à-dire qu’il ne demande pas d’autre tableau que
celui que l’on trie.
Son coût en mémoire est donc constant si on ne compte pas la place occupée par les
données.
Implémentation
Terminaison
Xavier Pessoles
Informatique – PTSI
5.3 Tris 11
La boucle for termine au bout de n-1 itérations. L’algorithme de tri par insertion
termine donc.
Correction
Initialisation En entrant dans la boucle : i=1 ; donc L[0:1] ne contient qu’un élément.
L[0:1] est triée.
Complexité
Propriété – Complexité
Au vu de notre algorithme, le pire des cas que l’on peut rencontrer est celui où la liste
L est triée dans l’ordre décroissant. En effet, dans ce cas, à l’itération i, la boucle while
devra être réalisée i fois.
Comptons le nombre de comparaisons j>0 réalisées par l’algorithme pour une liste de
n éléments :
▶ à l’itération 1 : il y a 2 comparaisons ;
▶ à l’itération 2 : il y a 3 comparaisons ;
▶ ...
▶ à l’itération n-1 : il y a n comparaisons.
𝑛
Au final le nombre de comparaisons est égal à 𝐶(𝑛) = 2 + 3 + ... + 𝑛 = (𝑖) − 1 =
P
𝑖=1
1
𝑛 (𝑛 + 1) − 1 = O(𝑛 2 ).
2
Xavier Pessoles
Informatique – PTSI
12 5 Culture algorithmique
Principe
L’algorithme de tri rapide fait partie de la catégorie des algorithmes « diviser pour
régner ».
À chaque appel de la fonction tri on choisit une valeur « pivot », par exemple
le premier élément. On effectue une partition des élément à trier. Un premier
groupe est constitué de valeurs inférieures au pivot et un deuxième avec les valeurs
supérieures. Le pivot est alors placé définitivement dans le tableau.
On traite alors chacun des groupes de façon indépendante. On peut les traiter avec
le même algorithme.
Implémentation
Xavier Pessoles
Informatique – PTSI
5.3 Tris 13
27 ei = elts_inf(L,p)
28 es = elts_sup(L[:-1],p)
29 return tri_rapide(ei) + [p] + tri_rapide(es)
Terminaison
Prenons comme variant la longueur 𝑛 de la liste à trier. Nous cherchons à trier des
listes de tailles supérieure à 𝑛 .
ei est de taille strictement inférieure à Li car elle ne contient que les valeurs strictement
inférieures au pivot.
es est de taille strictement inférieure à Li car elle ne contient que les valeurs supérieures
ou égales au pivot, à l’exception du pivot lui-même.
L’appel à tri_rapide se fait alors sur des listes de tailles strictement inférieures à Li.
Correction
Initialisation La propriété de récurrence est vraie pour une liste vide et pour une liste
de taille 1.
Hérédité Soit une liste de taille n+1. Le pivot est alors L[-1]. ei et es ont une
taille inférieure ou égale à 𝑛 . D’après la proprité de récurrence, tri_rapide(ei) et
tri_rapide(es) trient donc ei et es.
La propriété de récurrence est donc vraie pour une liste de taille n+1.
Complexité
▶ Cette méthode de tri est très efficace lorsque les données sont distinctes et
non ordonnées. La complexité est alors globalement en O(𝑛 ln(𝑛)). Lorsque le
nombre de données devient petit (<15) lors des appels récursifs de la fonction
de tri, on peut avantageusement le remplacer par un tri par insertion dont la
complexité est linéaire lorsque les données sont triées ou presque. [Beynet]
▶ D’autre part si le tableau est déjà trié avec le code mis en place on tombe sur
la complexité « dans le pire des cas ». Une solution simple consiste à ne pas
choisir systématiquement le premier élément du segment comme pivot, mais
plutôt un élément au hasard. On peut par exemple choisir la valeur de façon
aléatoire. [wack]
Xavier Pessoles
Informatique – PTSI
14 5 Culture algorithmique
Principe
Cet algorithme fait aussi partie des algorithmes « diviser pour régner ».
Le principe consiste à couper le tableau de départ en deux. On trie chacun des groupes
indépendamment. Puis on fusionne les deux groupes en utilisant le fait que chacun
des groupe est déjà ordonné.
Il est possible pour réaliser l’ordonnancement de chacun des groupes d’utiliser à
nouveau l’algorithme de tri de façon récursive.
5.3.5 Implémentation
Xavier Pessoles
Informatique – PTSI
5.3 Tris 15
14 else:
15 return [b] + fusion(L1, L2[1:])
16
17 def tri_fusion(L: list) -> list:
18 if len(L) < 2: # cas d'arrêt
19 return L
20 L1, L2 = separe(L) # sinon on sépare
21 return fusion(tri_fusion(L1), tri_fusion(L2)) # et on fusionne les sous-
listes triées
Terminaison
Terminaison de la fusion Soit la suite définie par la somme successive des longueur
de L1 et L2.
À chaque itération on appelle fusion à des listes dont la taille d’une d’entre elle
est diminuée de 1. La somme des longueurs est donc une suite d’entiers strictement
décroissante.
Terminaison du tri
Le tri fusion termine si les listes ont 0 ou 1 éléments. On note (𝑢𝑛 ) la suite définie
par 𝑢0 = 𝑛 , taille de la liste à trier et 𝑢𝑖 longueur de la plus grande des listes. À
𝑢𝑖 + 1
chaque étape, la taille des listes est divisé par 2 ; donc 𝑢𝑖+1 = . En conséquence,
2
𝑢𝑖+1 < 𝑢𝑖 tant que 𝑢𝑖 > 1. La fonction tri_fusion termine donc.
Correction
Complexité
La complexité est 𝑛 log(𝑛) dans le meilleur des cas et dans le pire des cas.
Par ailleurs, la taille des listes à concaténer diminue de 1 à chaque itération. Il y aura
donc 𝑛 appels récursifs.
La séparation quant à elle est complexité O log2 (𝑛) (en effet, le nombre de fois que fois
qu’on peut diviser notre liste de taille 𝑛 en 2 listes de taille 𝑛//2 est à peu près de
log(𝑛).
Xavier Pessoles
Informatique – PTSI
16 5 Culture algorithmique
Les listes Python ont une méthode native list.sort() qui modifie les listes elles-
mêmes et renvoie None.
Propriété –
Distinguer par leurs complexités deux algorithmes résolvant un même problème :
La première étape consiste à vérifier que les algorithmes résolvent exactement le
même problème.
▶ On compare la complexité en temps dans le pire des cas (préférable a
l’utilisation du module Time comme ci dessous car indépendant de la
machine).
▶ Il faut vérifier que le pire des cas peut arriver en situation réelle
▶ Penser à comparer la complexité en espace qui peut permettre de départager
des algorithmes équivalents
Pour comparer les temps globaux sur une même machine (Ici processeur Intel Core
i7-4510U Haswell (2 GHz, TDP 15W),Mémoire vive 4 Go) on génère des tableaux
de dimensions différentes avec des nombres aléatoires. On utilise le module time
pour déterminer les temps. Ici c’est un temps global dépendant fortement de la
machine utilisée. On fait varier la taille du tableau et on compare les temps mis par
chacun des algorithmes (en rouge tri rapide, en bleu tri insertion, en vert tri fusion).
Xavier Pessoles
Informatique – PTSI
Bibliographie
[1] Irène Charon Olivier Hudry, Algorithmes de tri, cours de Télécom ParisTech, Avril
2014.
[2] B. Wack, S. Conchon, J. Courant, M. de Falco, G. Dowek, J.-C. Filliâtre, S. Gonnord,
Informatique pour tous en classes préparatoires aux grandes écoles. Manuel
d’algorithmique et programmation structurée avec Python. Nouveaux programmes
2013. Voies MP, PC, PSI, PT, TPC et TSI, Eyrolles, 2013.
[3] Beynet Patrick, Cours d’informatique publié sur le site de l’UPSTI.