• Aucun résultat trouvé

Structures de donn´ees et algorithmes fondamentaux

N/A
N/A
Protected

Academic year: 2022

Partager "Structures de donn´ees et algorithmes fondamentaux"

Copied!
91
0
0

Texte intégral

(1)Structures de données et algorithmes fondamentaux Algorithmes de tri. Anthony Labarre Université Gustave Eiffel. 25 novembre 2020.

(2) Rappels. I On a vu deux algorithmes de tri : 1. le tri par insertion ; 2. le tri par sélection ;. I Ces algorithmes basiques sont en O(n2 ) ; I On va voir aujourd’hui deux algorithmes plus performants ;.

(3) Le tri par énumération. I Rappels :. 3.

(4) Le tri par énumération. I Rappels : 1. la fonction enumerer(liste) renvoie en O(n + V ) le nombre d’occurrences de chaque naturel ≤ V d’une liste de taille n ;. 4.

(5) Le tri par énumération. I Rappels : 1. la fonction enumerer(liste) renvoie en O(n + V ) le nombre d’occurrences de chaque naturel ≤ V d’une liste de taille n ; 2. le parcours des positions de l’énumération nous donne les nombres de départ dans l’ordre croissant ;. 5.

(6) Le tri par énumération. I Rappels : 1. la fonction enumerer(liste) renvoie en O(n + V ) le nombre d’occurrences de chaque naturel ≤ V d’une liste de taille n ; 2. le parcours des positions de l’énumération nous donne les nombres de départ dans l’ordre croissant ;. I Il n’y a donc plus grand-chose à faire pour en tirer un algorithme de tri :. 6.

(7) Le tri par énumération. I Rappels : 1. la fonction enumerer(liste) renvoie en O(n + V ) le nombre d’occurrences de chaque naturel ≤ V d’une liste de taille n ; 2. le parcours des positions de l’énumération nous donne les nombres de départ dans l’ordre croissant ;. I Il n’y a donc plus grand-chose à faire pour en tirer un algorithme de tri : 1. énumérer la liste ;. 7.

(8) Le tri par énumération. I Rappels : 1. la fonction enumerer(liste) renvoie en O(n + V ) le nombre d’occurrences de chaque naturel ≤ V d’une liste de taille n ; 2. le parcours des positions de l’énumération nous donne les nombres de départ dans l’ordre croissant ;. I Il n’y a donc plus grand-chose à faire pour en tirer un algorithme de tri : 1. énumérer la liste ; 2. écraser le contenu de la liste en parcourant l’énumération obtenue ;. 8.

(9) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. 9.

(10) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 10.

(11) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 11.

(12) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 12.

(13) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 13.

(14) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 14.

(15) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 15.

(16) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 16.

(17) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 17.

(18) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 18.

(19) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 19.

(20) Le tri par énumération en action. Exemple 1 (tri par énumération) 0 1 2 3 4 5 6 7 8 9 L = 72 2 5 6 7 10 8 4 8 10 5 2 4 8 2 8 2 6. C = 0 0 3 0 1 1 1 1 2 0 1 0 1 2 3 4 5 6 7 8 9 10. 20.

(21) Implémentation du tri par énumération I On utilise la fonction enumerer qu’on a déjà vue ; I Attention, il faut se rappeler où on en est dans la réécriture de la liste ; def tri_enumeration(T): """Trie la liste T par énumération.""" decalage = 0 for valeur, occurrences in enumerate(enumerer(T)): for i in range(occurrences): T[decalage + i] = valeur decalage += occurrences.

(22) Complexité du tri par énumération def tri_enumeration(T): """Trie la liste T par énumération.""" decalage = 0 for valeur, occurrences in enumerate(enumerer(T)): for i in range(occurrences): T[decalage + i] = valeur decalage += occurrences I enumerer(T) coûte O(n + V ) (avec V = max T ) ;. 22.

(23) Complexité du tri par énumération def tri_enumeration(T): """Trie la liste T par énumération.""" decalage = 0 for valeur, occurrences in enumerate(enumerer(T)): for i in range(occurrences): T[decalage + i] = valeur decalage += occurrences I enumerer(T) coûte O(n + V ) (avec V = max T ) ; I Attention : multiplier les complexités des for surestime grandement la complexité ;. 23.

(24) Complexité du tri par énumération def tri_enumeration(T): """Trie la liste T par énumération.""" decalage = 0 for valeur, occurrences in enumerate(enumerer(T)): for i in range(occurrences): T[decalage + i] = valeur decalage += occurrences I enumerer(T) coûte O(n + V ) (avec V = max T ) ; I Attention : multiplier les complexités des for surestime grandement la complexité ; I La somme des occurrences de tous les éléments vaut exactement n ;.

(25) Complexité du tri par énumération def tri_enumeration(T): """Trie la liste T par énumération.""" decalage = 0 for valeur, occurrences in enumerate(enumerer(T)): for i in range(occurrences): T[decalage + i] = valeur decalage += occurrences I enumerer(T) coûte O(n + V ) (avec V = max T ) ; I Attention : multiplier les complexités des for surestime grandement la complexité ; I La somme des occurrences de tous les éléments vaut exactement n ; I Complexité : O(n + V ) ; 25.

(26) Le tri fusion. I La récursivité nous permet de décrire de manière relativement simple un nouvel algorithme de tri : le tri (par) fusion ;.

(27) Le tri fusion. I La récursivité nous permet de décrire de manière relativement simple un nouvel algorithme de tri : le tri (par) fusion ; I C’est un exemple d’application de la stratégie “diviser pour régner” ;.

(28) Le tri fusion. I La récursivité nous permet de décrire de manière relativement simple un nouvel algorithme de tri : le tri (par) fusion ; I C’est un exemple d’application de la stratégie “diviser pour régner” ; I Idée : pour trier une liste, il suffit de :. 28.

(29) Le tri fusion. I La récursivité nous permet de décrire de manière relativement simple un nouvel algorithme de tri : le tri (par) fusion ; I C’est un exemple d’application de la stratégie “diviser pour régner” ; I Idée : pour trier une liste, il suffit de : 1. trier ses deux moitiés séparément, puis.

(30) Le tri fusion. I La récursivité nous permet de décrire de manière relativement simple un nouvel algorithme de tri : le tri (par) fusion ; I C’est un exemple d’application de la stratégie “diviser pour régner” ; I Idée : pour trier une liste, il suffit de : 1. trier ses deux moitiés séparément, puis 2. les fusionner en une liste triée..

(31) Le tri fusion. I La récursivité nous permet de décrire de manière relativement simple un nouvel algorithme de tri : le tri (par) fusion ; I C’est un exemple d’application de la stratégie “diviser pour régner” ; I Idée : pour trier une liste, il suffit de : 1. trier ses deux moitiés séparément, puis 2. les fusionner en une liste triée.. I Les découpes se poursuivent récursivement jusqu’à ce qu’elles ne soient plus possible (donc quand la liste contient au plus un élément)..

(32) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 32.

(33) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 33.

(34) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 34.

(35) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 35.

(36) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 36.

(37) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 37.

(38) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 38.

(39) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 39.

(40) Exemple ['T', 'R', 'I', 'F', 'U', 'S', 'I', 'O', 'N']. ['T', 'R', 'I', 'F', 'U'] découpes récursives. ['T', 'R', 'I'] ['F', 'U']. ['T', 'R'] ['I']['F']. ['T']. ['S', 'I']. ['O', 'N']. ['U']['S']. ['I']['O']. ['N']. ['U']['S']. ['I']['O']. ['N']. ['R']. ['R', 'T'] ['I']['F'] fusions triées. ['S', 'I', 'O', 'N']. ['I', 'R', 'T'] ['F', 'U']. ['F', 'I', 'R', 'T', 'U']. ['I', 'S']. ['N', 'O']. ['I', 'N', 'O', 'S']. ['F', 'I', 'I', 'N', 'O', 'R', 'S', 'T', 'U'] 40.

(41) Le tri I Conditions de base : si la liste contient moins de deux éléments, il n’y a rien à faire ;.

(42) Le tri I Conditions de base : si la liste contient moins de deux éléments, il n’y a rien à faire ; I Sinon :.

(43) Le tri I Conditions de base : si la liste contient moins de deux éléments, il n’y a rien à faire ; I Sinon : 1. on trie récursivement les deux moitiés de la liste ;.

(44) Le tri I Conditions de base : si la liste contient moins de deux éléments, il n’y a rien à faire ; I Sinon : 1. on trie récursivement les deux moitiés de la liste ; 2. et on les fusionne de manière triée..

(45) Le tri I Conditions de base : si la liste contient moins de deux éléments, il n’y a rien à faire ; I Sinon : 1. on trie récursivement les deux moitiés de la liste ; 2. et on les fusionne de manière triée. I On utilise des indices de début et de fin pour préciser quelle sous-liste nous intéresse (pas de slices !) ;.

(46) Le tri I Conditions de base : si la liste contient moins de deux éléments, il n’y a rien à faire ; I Sinon : 1. on trie récursivement les deux moitiés de la liste ; 2. et on les fusionne de manière triée. I On utilise des indices de début et de fin pour préciser quelle sous-liste nous intéresse (pas de slices !) ; def tri_fusion_rec(lst, debut, fin): # plus que 0 ou 1 élément à trier if debut >= fin: return # partitionner lst en deux-sous listes et les trier milieu = (debut + fin) // 2 tri_fusion_rec(lst, debut, milieu) tri_fusion_rec(lst, milieu+1, fin) # fusionner les deux sous-listes triées fusionner(lst, debut, milieu, fin).

(47) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C :. 47.

(48) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ;. 48.

(49) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ;. 49.

(50) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. 50.

(51) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 51.

(52) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 52.

(53) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 53.

(54) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 54.

(55) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 55.

(56) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 56.

(57) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 57.

(58) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 58.

(59) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 59.

(60) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 60.

(61) Les fusions I Pour fusionner deux listes triées A et B en une liste triée C : I on parcourt en parallèle les deux listes A et B avec deux curseurs i et j ; I à chaque étape, on ajoute à la fin de C le minimum de A[i] et B[j] ; I le curseur de l’élément recopié avance de 1 ;. Exemple 2 (fusion de deux sous-listes triées) j j j j j j i i i i i i 1 1 1 3 5 2 4 6 8 10. 1 1 1 2 3 4 5 6 8 10. 61.

(62) L’algorithme pour les fusions def fusionner(lst, debut, milieu, fin): aux = [] premier, second = debut, milieu + 1 while premier <= milieu or second <= fin: if premier > milieu: # moitié 1 finie => copier moitié 2 aux.extend(lst[second:fin+1]) break if second > fin: # moitié 2 finie => copier moitié 1 aux.extend(lst[premier:milieu+1]) break if lst[premier] < lst[second]: aux.append(lst[premier]) premier += 1 else: aux.append(lst[second]) second += 1 lst[debut:fin+1] = aux. # recopier aux dans lst 62.

(63) Complexité des fusions. I Combien de fois passe-t-on dans le while ?.

(64) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;.

(65) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;. I Quel est le coût des opérations dans le while ?.

(66) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;. I Quel est le coût des opérations dans le while ? I tout se fait en O(1), sauf extend ;.

(67) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;. I Quel est le coût des opérations dans le while ? I tout se fait en O(1), sauf extend ; I mais au pire, on ne fait qu’un seul extend sur les éléments résiduels ;.

(68) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;. I Quel est le coût des opérations dans le while ? I tout se fait en O(1), sauf extend ; I mais au pire, on ne fait qu’un seul extend sur les éléments résiduels ;. I Vision plus simple : on lit et on copie chaque élément vers aux une seule fois ;.

(69) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;. I Quel est le coût des opérations dans le while ? I tout se fait en O(1), sauf extend ; I mais au pire, on ne fait qu’un seul extend sur les éléments résiduels ;. I Vision plus simple : on lit et on copie chaque élément vers aux une seule fois ; I Le recopiage de aux se fait en O(n) ;.

(70) Complexité des fusions. I Combien de fois passe-t-on dans le while ? I au pire : O(n) fois ;. I Quel est le coût des opérations dans le while ? I tout se fait en O(1), sauf extend ; I mais au pire, on ne fait qu’un seul extend sur les éléments résiduels ;. I Vision plus simple : on lit et on copie chaque élément vers aux une seule fois ; I Le recopiage de aux se fait en O(n) ; I La fusion est donc en O(n) ;.

(71) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ;.

(72) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ?.

(73) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ? I Comme pour la recherche dichotomique :.

(74) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ? I Comme pour la recherche dichotomique : I on suppose pour simplifier que n = 2k ;.

(75) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ? I Comme pour la recherche dichotomique : I on suppose pour simplifier que n = 2k ; I on s’arrête quand les divisions successives de n par 2 donnent un nombre ≤ 1 ;.

(76) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ? I Comme pour la recherche dichotomique : I on suppose pour simplifier que n = 2k ; I on s’arrête quand les divisions successives de n par 2 donnent un nombre ≤ 1 ; I donc, on s’arrête après O(log n) divisions ;.

(77) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ? I Comme pour la recherche dichotomique : I on suppose pour simplifier que n = 2k ; I on s’arrête quand les divisions successives de n par 2 donnent un nombre ≤ 1 ; I donc, on s’arrête après O(log n) divisions ;. I En conclusion, le tri fusion est en O(n log n) ;.

(78) Complexité du tri fusion. I On sait déjà que la partie fusion se fait en O(n) ; I Combien de fois fait-on les découpes ? I Comme pour la recherche dichotomique : I on suppose pour simplifier que n = 2k ; I on s’arrête quand les divisions successives de n par 2 donnent un nombre ≤ 1 ; I donc, on s’arrête après O(log n) divisions ;. I En conclusion, le tri fusion est en O(n log n) ; I Sa complexité spatiale est en O(n) puisqu’on utilise un stockage intermédiaire pour aux, au pire de taille n ;.

(79) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ;.

(80) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ; I Par exemple : on peut faire une première passe en O(n) pour identifier comment découper la liste ;.

(81) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ; I Par exemple : on peut faire une première passe en O(n) pour identifier comment découper la liste ;.

(82) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ; I Par exemple : on peut faire une première passe en O(n) pour identifier comment découper la liste ;.

(83) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ; I Par exemple : on peut faire une première passe en O(n) pour identifier comment découper la liste ;. Version normale [3, 4, 1, 2]. [3, 4]. [1, 2]. [3]. [4]. [1]. [2]. [3]. [4]. [1]. [2]. [3, 4]. [1, 2]. [1, 2, 3, 4].

(84) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ; I Par exemple : on peut faire une première passe en O(n) pour identifier comment découper la liste ;. Version normale [3, 4, 1, 2]. [3, 4]. [1, 2]. [3]. [4]. [1]. [2]. [3]. [4]. [1]. [2]. [3, 4]. [1, 2]. [1, 2, 3, 4]. 84.

(85) Améliorations du tri fusion I Le tri fusion est encore améliorable en pratique ; I Par exemple : on peut faire une première passe en O(n) pour identifier comment découper la liste ;. Version normale. Version améliorée [3, 4, 1, 2]. [3, 4, 1, 2]. [3, 4]. [3, 4]. [1, 2]. [3]. [4]. [1]. [2]. [3]. [4]. [1]. [2]. [3, 4]. [1, 2]. [1, 2, 3, 4]. [1, 2]. [1, 2, 3, 4]. 85.

(86) Bilan des nouveaux algorithmes de tri. I Quand utiliser le tri par énumération ?.

(87) Bilan des nouveaux algorithmes de tri. I Quand utiliser le tri par énumération ? I sur des listes L de naturels avec max L << O(|L|2 ) ;.

(88) Bilan des nouveaux algorithmes de tri. I Quand utiliser le tri par énumération ? I sur des listes L de naturels avec max L << O(|L|2 ) ; I |L| a un impact sur le temps et l’espace ;.

(89) Bilan des nouveaux algorithmes de tri. I Quand utiliser le tri par énumération ? I sur des listes L de naturels avec max L << O(|L|2 ) ; I |L| a un impact sur le temps et l’espace ;. I Quand utiliser le tri fusion ?. 89.

(90) Bilan des nouveaux algorithmes de tri. I Quand utiliser le tri par énumération ? I sur des listes L de naturels avec max L << O(|L|2 ) ; I |L| a un impact sur le temps et l’espace ;. I Quand utiliser le tri fusion ? I quand on peut se permettre de consommer O(|L|) en mémoire ;. 90.

(91) Bilan des nouveaux algorithmes de tri. I Quand utiliser le tri par énumération ? I sur des listes L de naturels avec max L << O(|L|2 ) ; I |L| a un impact sur le temps et l’espace ;. I Quand utiliser le tri fusion ? I quand on peut se permettre de consommer O(|L|) en mémoire ;. I Remarque : sorted et list.sort() mélangent des idées du tri fusion et du tri par insertion ;.

(92)

Références

Documents relatifs

– si les deux pointeurs sont non nuls, et que les valeurs point´ees sont identiques, on ajoute la valeur commune `a l’intersection et on incr´emente les deux pointeurs ;. – si

Lorsqu’une base de données est très volumineuse et non ordonnée, trouver une information dans cette base est très long et très ingrat.. En effet la seule solution est

Dans le tri rapide, après les 2 tris partiels, tous les éléments de la partie gauche sont inférieurs au pivot, alors que tous les éléments de la partie droite... naturelle, et

La dichotomie (couper en deux) est un processus de recherche où à chaque étape l’espace de recherche se réduit à l’une des parties. Pour exécuter ce processus il faut que

Principe du diviser pour régner : on divise la liste par deux jusqu’à obtenir une liste de longueur unitaire (ou nulle) facile à classer. On utilise une autre fonction pour

procedure saisie(var t:tab;var n:integer);.

[r]

Question : Est-il possible de trier un tableau de n ´el´ements en moins de n · log( n ) op´erations dans le pire cas. Non si on n’utilise que des comparaisons 2 `a 2 et sans