180 likes | 345 Views
Tutorat en bio-informatique. Le 28 novembre 2012. Au programme…. Algorithmes de tri dans un tableau (suite) Récursivité MAT1400. Tri bulle. function triBulle(tab) { do{ var inversionFaite = false; for(var i = 0; i < tab.length-1; i++) { if(tab[i] > tab[i+1]) {
E N D
Tutorat en bio-informatique Le 28 novembre 2012
Au programme… • Algorithmes de tri dans un tableau (suite) • Récursivité • MAT1400
Tri bulle function triBulle(tab) { do{ var inversionFaite = false; for(var i = 0; i < tab.length-1; i++) { if(tab[i] > tab[i+1]) { var temp = tab[i+1]; tab[i+1] = tab[i]; tab[i] = temp; inversionFaite = true; } } } while(inversionFaite); } Comme pour le tri insertion, dans le meilleur cas (un tableau déjà trié), le tri bulle prend un temps linéaire. Toutefois, dans le pire cas (???), cet algorithme prendra aussi un temps quadratique.
Tri bulle function triBulle(tab) { do{ var inversionFaite = false; for(var i = 0; i < tab.length-1; i++) { if(tab[i] > tab[i+1]) { var temp = tab[i+1]; tab[i+1] = tab[i]; tab[i] = temp; inversionFaite = true; } } } while(inversionFaite); } Comme pour le tri insertion, dans le meilleur cas (un tableau déjà trié), le tri bulle prend un temps linéaire. Toutefois, dans le pire cas (plus petit élément en dernière position), cet algorithme prendra aussi un temps quadratique.
Tri bulle • On peut optimiser un peu plus le tri bulle. • Comment?
Tri bulle function triBulle2(tab) { var n = tab.length; do{ var inversionFaite = false; for(var i = 0; i < n-1; i++) { if(tab[i] > tab[i+1]) { var temp = tab[i+1]; tab[i+1] = tab[i]; tab[i] = temp; inversionFaite = true; } } n--; } while(inversionFaite); }
Tri bulle function triBulle3(tab) { var n = tab.length; do{ var newN = 0; for(var i = 0; i < n-1; i++) { if(tab[i] > tab[i+1]) { var temp = tab[i+1]; tab[i+1] = tab[i]; tab[i] = temp; newN = i+1; } } n = newN; } while(n > 0); }
Algorithmes de tri • Il existe de bien meilleurs algorithmes de tri qui prennent un temps dans O(nlogn) dans le pire cas : • Heapsort • Mergesort • Quicksort * • * Important : Quicksort peut prendre un temps quadratique dans le pire cas (ce qui est rare), mais est dans O(nlogn) dans le cas moyen
Récursivité • Une fonction récursive est une fonction qui s'appelle elle-même • Les fonctions récursives possèdent une ou des conditions d'arrêt, qui permettent d'arrêter la récursivité • Dans le code, on écrit toujours les conditions d'arrêt en premier dans la fonction
Récursivité function facto(n) { if (n <= 1) return 1; return n * facto(n-1); }
Récursivité function fibbo(n) { if (n <= 1) return 1; return fibbo(n-1) + fibbo(n-2); }
Récursivité terminale • Lorsqu’une fonction récursive fait son appel récursif en dernier (il s’agit de la dernière instruction) • En d’autres mots, il s’agit de récursivité terminale si la fonction n’a aucun autre travail à faire après avoir reçu le résultat de la récursion terminale
Récursivité terminale • Exemple avec récursivité traditionnelle : function sumTrad(n) { if(n <= 1) return n; return n + sumTrad(n-1); }
Récursivité terminale • Exemple avec récursivité terminale : function sumTerm(n) { function helper(n, sum) { if (n == 0) return sum; return helper(n-1, n+sum); } return helper(n, 0); }
Exercice 1 • Écrivez la fonction fibbonacci avec récursivité terminale.
Exercice 1 (solution) function fibboTerm(n) { function helper(cpt, n_1, n_2) { if(cpt == 0) return n_1; return helper(cpt-1, n_1+n_2, n_1); } return helper(n, 1, 0); }
Récursivité terminale • La récursivité terminale permet d’optimiser la vitesse d’exécution et l’espace utilisé dans la pile d’exécution • Malheureusement, ce ne sont pas tous les compilateurs et interprètes qui optimisent la récursivité terminale • Pour l’activer dans rhino : rhino -opt -1 monCode.js
Exercices (MAT1400) • Chapitre 12.2, Analyse - concepts et contextes vol. 2 • 19) Calculez le volume du solide dressé sur le rectangle • R = [-1, 1] x [-2, 2] et coiffé par le paraboloïde elliptique • . • 23) Calculez le volume du solide du premier quadrant compris dans le cylindre et le plan x = 2.