Sheytro Freenduriste Super actif Messages: 328 Enregistré le: 26 Avr 2018, 16:08 Moto: Ktm 450excf 2012 Réseau social Retourner vers « KTM » Qui est en ligne Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 17 invités
Il vous suffira alors de vous connecter sur le site du transporteur pour suivre votre colis. Vérifiez bien vos spams ou courrier indésirables si besoin.
» Invariant de Boucle On appelle cette propriété un Invariant de Boucle. Le terme Invariant signifie qu'elle reste vraie pour chaque itération de la boucle. quand \(k\) vaut \(0\), on place le minimum de la liste en l[0], la sous-liste l[0] est donc triée. Donc \(P(0)\) est vraie. si la sous-liste de \(k\) premiers éléments est triée (donc si \(P(k)\) est vraie), l'algorithme rajoute en dernière position de la liste le minimum de la sous-liste restante, dont tous les éléments sont supérieurs au maximum de la sous-liste de \(k\) éléments. La sous-liste des \(k+1\) premiers éléments est donc aussi triée. Donc \(P(k+1)\) est vraie Complexité de l'Algorithme ⚓︎ Étude Expérimentale ⚓︎ Proposer des mesures expérimentales pour déterminer la complexité du tri par Insertion. Pour mesurer les temps d'exécution, nous allons utiliser la fonction timeit du module timeit. Avant toute chose, néanmoins, il va nous falloir modifier légèrement notre algorithme de tri. En effet, la fonction timeit fait un grand nombre d'appels ( 1000000 de fois, par défaut) à la fonction tri_insertion() (pour ensuite en faire la moyenne): la liste serait donc triée dès le premier appel et les autres appels essaieraient donc de tri une liste déjà triée.
Dans le pire des cas (c'est à dire avec une liste triée en sens inverse) le tri par insertion fera exactement (n^2+n)/2 - 1 opérations, n étant le nombre d'éléments de la liste (ce qu'on peut aussi écrire "n(n+1)/2 - 1". La complexité en temps est quadratique, en O ( n 2). Le graphique suivant illustre cela: En moyenne, il faudra (n^2-n)/4 opérations pour trier une liste, soit un nombre d'opérations équivalent à celui nécessaires avec le tri bulle. Le graphique suivant a été réalisé en triant 1 217 818 listes (! ) générées aléatoirement et en analysant le résultat avec R. Cela permet de vérifier que la complexité en temps est bien quadratique en moyenne.
Ainsi, au moment où on considère un élément, les éléments qui le précèdent sont déjà triés, tandis que les éléments qui le suivent ne sont pas encore triés. Pour trouver la place où insérer un élément parmi les précédents, il faut le comparer à ces derniers, et les décaler afin de libérer une place où effectuer l'insertion. Le décalage occupe la place laissée libre par l'élément considéré. En pratique, ces deux actions s'effectuent en une passe, qui consiste à faire « remonter » l'élément au fur et à mesure jusqu'à rencontrer un élément plus petit. Le tri par insertion est un tri stable (conservant l'ordre d'apparition des éléments égaux) et un tri en place (il n'utilise pas de tableau auxiliaire). L'algorithme a la particularité d'être online, c'est-à-dire qu'il peut recevoir la liste à trier élément par élément sans perdre en efficacité. Exemple Voici les étapes de l'exécution du tri par insertion sur le tableau [6, 5, 3, 1, 8, 7, 2, 4]. Le tableau est représenté au début et à la fin de chaque itération.
3: Sorting and Searching, 1998, 2 e éd. [ détail de l'édition], section 5. 2. 1. ↑ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction à l'algorithmique, Dunod, 2002 [ détail de l'édition] (ex. 7. 4. 5, p. 153) Portail de l'informatique théorique
On stocke dans une variable cle notre valeur courante On démarre l'étude des valeurs à gauche de notre valeur courante Tant qu'on trouve une valeur supérieure à notre valeur courante, et qu'on n'est pas revenus au début de la liste. On décale cette valeur de un rang vers la droite. On se repositionne sur la valeur à gauche de notre valeur courante. On s'est arrêté quand la valeur n'était pas supérieure: on insère notre valeur courante juste à droite de notre position d'arrêt. >>> tri_insertion2 ( maliste) Terminaison de l'Algorithme ⚓︎ Est-on sûr que notre algorithme va s'arrêter (un jour)? Le programme est constitué d'une boucle while imbriquée dans une boucle for. Seule la boucle while peut provoquer une non-terminaison de l'algorithme. Observons donc ses conditions de sortie: while k >= 0 and l [ k] > cle: La condition l[k] > cle ne peut pas être rendue fausse avec certitude. Par contre, la condition k >= 0 sera fausse dès que la variable k deviendra négative. Or la ligne k = k - 1 nous assure que la variable k diminuera à chaque tour de boucle.