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 322 N . 2 On doit donc résoudre l'équation 322 N N N 322 ⇒ ln 32ln 2 car la fonction ln est strictement croissante sur ]0 ;∞[ ⇒ ln 32N ×ln 2 car ∀N∈ℕ ∀a∈ ]0 ;∞[ , ln a N =N ×ln a ln 32 N ⇒ car ln 20 car 21 ln 2 ln x ⇒ log 2 32 N car on pose ∀x∈ ]0 ;∞[ log2 x= ln2 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 nm comparaisons. Ainsi, lorsqu'on fusionne un n-uplet et un m-uplet, on a besoin de faire nm 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...