Complexité temporelle - Tri fusion Objectif : Expliquer

publicité
Complexité temporelle - Tri fusion
Objectif : Expliquer pourquoi lors d'un tri par fusion, la complexité temporelle, est égale à n×log 2 n
Définition : Complexité temporelle
On appelle, complexité temporelle, le nombre d'opérations élémentaires (affectations, comparaisons, opérations
arithmétiques) effectuées par un algorithme
Partie A : La dichotomie ou «couper les cheveux en deux»
Définition : Dichotomie dans le cas continue
On considère un nombre réel  contenu dans un intervalle [ a ;b ] de ℝ.
L'objectif de la dichotomie est de trouver une approximation de  , c'est à dire de trouver un intervalle
contenant  d'amplitude inférieure ou égale à e donnée.
Pour cela, on découpe l'intervalle [ a ;b ] en 2 intervalles de même amplitude, on garde celui qui contient  et
on recommence cette opération avec ce nouvel intervalle, ainsi de suite. On s'arrête lorsqu'on a obtenu un
intervalle d'amplitude inférieure ou égale à e.
Exemple : Fonction continue ; Théorème des valeurs intermédiaires et continuité
Soit la fonction f telle que f  x =x 3 x – 14
a. Montrer que l'équation f(x)=0 admet une unique solution réelle.
b. On s'intéresse maintenant à l'algorithme ci-contre, tapé encore une fois avec algobox.
En quelques lignes expliquer à quoi sert cet algorithme.
Tester le avec a=0 et b=2 puis avec a=3 et b=5 .
Quelles précautions faut-il prendre lorsqu'on choisit a et b ?
Modifier cet algorithme de manière à éviter le problème rencontré lors de vos tests.
c. Modifier cet algorithme de manière à ce qu'il permette de donner un encadrement de la solution de l'équation
f  x =k dans ℝ.
ALGORITHME "Fonction continue et dichotomie"
VARIABLES
REEL : a, b, ampli, milieu
DEBUT
FONCTION F(x) : REEL
REEL : x
DEBUT
RETOURNE x^3+x-14
FIN
ECRIRE("Entrez les bornes de l'intervalle")
LIRE(a)
LIRE(b)
ECRIRE("Entrez l'amplitude")
LIRE(ampli)
TANT_QUE (b-a>=ampli)
milieu ← (a+b)/2
SI (F(a)*F(milieu)<=0) ALORS
b ← milieu
SINON
a ← milieu
FIN_SI
FIN_TANT_QUE
ECRIRE("a")
ECRIRE("b")
FIN
Dans la suite, on s'intéresse à la dichotomie dans le cas discret et on cherche à trouver le nombre de découpages
maximum à faire pour trouver  . http://fr.wikipedia.org/wiki/Dichotomie
Commençons par un jeu :
Arthur demande à Dick : « Choisis un nombre entier dans l'ensemble {1 ; 2 ; … ; 32} mais ne me dis rien».
Dick choisit 24.
Arthur ajoute : « je vais deviner ce nombre en te posant des questions. Tu va me répondre par oui ou par non. »
Question 1 :
Arthur : « Est-ce que ce nombre est strictement supérieur à 16 ? »
Dick : « oui »
Arthur : «J'ai scindé en deux l'ensemble précédent. Le nombre est dans l'ensemble {17 ; …; 32} qui contient
32
=16 éléments. »
2
Question 2 :
Arthur : « Est-ce que ce nombre est strictement supérieur à 24 ? »
Dick : « non »
Arthur : «J'ai scindé en deux l'ensemble précédent. Le nombre est dans l'ensemble {17 ; …;24} qui contient
32
=8 éléments.»
22
Question 3 :
Arthur : « Est-ce que ce nombre est strictement supérieur à 20 ? »
Dick : « oui »
Arthur : «J'ai scindé en deux l'ensemble précédent. Le nombre est dans l'ensemble {21 ; …;24} qui contient
32
=4 éléments.»
3
2
Question 4 :
Arthur : « Est-ce que ce nombre est strictement supérieur à 22 ? »
Dick : « oui »
Arthur : «J'ai scindé en deux l'ensemble précédent. Le nombre est dans l'ensemble {23 ; 24} qui contient
32
=2 éléments. »
24
Question 5 :
Arthur : « Est-ce que ce nombre est strictement supérieur à 23 ? »
Dick : « oui »
Arthur : « Le nombre est dans l'ensemble {24} dans lequel il y a
32
=1 éléments. C'est donc 24 ! J'ai trouvé
25
ce résultat en posant 5 questions.»
Pour trouver le nombre minimum de questions qu'Arthur doit poser pour être sûr de trouver  dans tous les
cas, on doit trouver le plus petit entier naturel N tel que le nombre d'éléments dans l'ensemble soit inférieur ou
32
égal à 1, c'est à dire tel que N 1 ou encore 322 N .
2
On doit donc résoudre l'équation 322 N
N
N
322 ⇒ ln 32ln 2  car la fonction ln est strictement croissante sur ]0 ;∞[
⇒ ln 32N ×ln 2 car ∀N∈ℕ ∀a∈ ]0 ;∞[ , ln a N =N ×ln a 
ln 32
N
⇒
car ln 20 car 21
ln 2
ln  x 
⇒ log 2  32 N
car on pose ∀x∈ ]0 ;∞[ log2  x=
ln2
La calculatrice nous dit que log 2 32=5
Partie B : La description de l'algorithme de tri par fusion
L'algorithme peut être décrit récursivement :
1. On découpe en deux parties à peu près égales les données à trier
2. On trie les données de chaque partie
3. On fusionne les deux parties
La récursivité s'arrête car on finit par arriver à des listes composées d'un seul élément et le tri est alors trivial.
Partie C : La complexité temporelle d'une fusion
http://fr.wikipedia.org/wiki/Tri_fusion
Commençons par des exemples de fusions :
1. Cas trivial de la fusion d'un nombre
Tableau avant
Tableau trié
3
/
Comparaison 1 : On compare 3 et _ . On obtient 3
Tableau avant
Tableau trié
_
3
2. Cas de la fusion de 2 nombres
Tableau avant
Tableau trié
6;1
Comparaison 1 : On compare 6 et 1. On obtient 1
Tableau avant
_;_
Tableau trié
6;_
Comparaison 2 : On compare 6 et _ . On obtient 6
Tableau avant
1;_
Tableau après
_;_
1;6
3. Cas général : fusion de ( a 1 ; a 2 ; … a n ) et de ( b1 ; b 2 ; b3 ;… ; b m )
Tableau avant
Tableau trié
( a 1 ; a 2 ; … a n ) ; ( b1 ; b 2 ; … ; b m )
Comparaison 1 : On compare a 1 et b1 on obtient, par exemple b1
Tableau avant
( a1 ; a2 ; … an ) ; ( b2 ; ; … ; bm )
Comparaison 2 : On compare a 1 et b 2 on obtient, par exemple a 1
Tableau avant
( a2 ; … an ) ; ( b2 ; ; … ; bm )
_ ; …; _
Tableau trié
b1 ; _ ; … ; _
Tableau trié
b1 ; a 1
Etc...
Bilan : Pour remplir le «tableau trié» par fusion, on a eu besoin de faire nm comparaisons.
Ainsi, lorsqu'on fusionne un n-uplet et un m-uplet, on a besoin de faire nm comparaisons.
Partie D : La complexité temporelle du tri par fusion : N ×log 2  N 
fusionner c'est le contraire de scinder !
Supposons que l'on nous demande de trier N nombres par la méthode de tri par fusion.
D'après la partie C, à chaque fusion, on aura N comparaisons.
D'après la partie A, il y aura log 2  N  fusions car le nombre de fusions est égale au nombre de scissions (« en
deux ») de la liste à trier nécessaire pour obtenir des singletons et donc pouvoir commencer le tri par fusion.
...car fusionner c'est le contraire de scinder...
Téléchargement