Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parJosiane Sylvain Modifié depuis plus de 9 années
1
CSI25101 Tri Plus efficace
2
CSI25102 Tri récursif Le tri récursif divise les données de grande taille en deux presque moitiés et est appelé récursivement sur ces plus petites séries de données. Ceci est appelé le paradigme Diviser pour régner (Divide-and-Conquer). Nous verrons deux tris récursifs: tri par fusion (Merge Sort) tri rapide (Quick Sort)
3
CSI25103 Diviser pour règner Paradigme diviser pour régner : Diviser: Si la taille des données est trop grande pour les traiter d’une façon directe alors les diviser en deux ou plusieurs sous-ensembles disjoints. Appliquer récursivement: Utiliser l’approche diviser pour régner afin de résoudre les sous-problèmes associés aux sous-ensembles de données. Régner: Prendre les solutions aux sous-problèmes et “fusionner” ces solutions afin d’obtenir la solution au problème initial. Le cas de base pour la récursivité est le sous-problème trivial, souvent de taille 0 ou 1.
4
CSI25104 Tri par fusion (Mergesort)
5
CSI25105 Tri par fusion Le tri par fusion est un algorithme de tri basé sur le paradigme diviser pour régner Comme le tri par tas Il utilise un comparateur Il est exécuté en un temps O(n log n) Contrairement au tri par tas Il n'utilise pas une file à priorité auxiliaire Il accède aux données d’une manière séquentielle (convenable pour trier des données sur un disque)
6
CSI25106 Tri par fusion Le tri par fusion sur une séquence d'entrée S avec n éléments consiste en trois étapes: Diviser: diviser S en 2 groupes d’environ n/2 éléments chacun Appliquer récursivement : trier récursivement S 1 et S 2 Régner: fusionner S 1 et S 2 dans une séquence triée
7
CSI25107 Fusion de deux séquences triées : L’étape ‘Régner’ fusionne les 2 séquences triées A et B dans une séquence trié S Comment? Comparer l'élément le plus petit de A et celui de B et insérer le plus petit dans S La fusion des deux séquences triées, chacune avec n/2 éléments prend un temps O (n)
8
CSI25108 Tri par fusion Algorithm mergeSort(S, C) Input séquence S avec n éléments, comparateur C Output séquence S triée selon C if S.size() > 1 (S 1, S 2 ) partition(S, n/2) mergeSort(S 1, C) mergeSort(S 2, C) S merge(S 1, S 2, C) Pas sur-place
9
CSI25109 2 5 6 9 12 15 20 27 4 7 10 13 16 2 4 5 6 A B S
10
CSI251010 Fusion de deux séquences triées Algorithm merge(A, B,C) Input séquences triées A et B comparateur C Output séquence triée de A B S séquence vide while A.isEmpty() B.isEmpty() if C.isLessThan(A.first().element(), B.first().element()) S.insertLast(A.remove(A.first())) else S.insertLast(B.remove(B.first())) while A.isEmpty() S.insertLast(A.remove(A.first())) while B.isEmpty() S.insertLast(B.remove(B.first())) return S Pas sur-place
11
CSI251011 Arbre de tri par fusion 7 2 9 4 2 4 7 9 7 2 2 79 4 4 9 7 72 29 94 4 L’exécution du tri par fusion est représenté comme un arbre binaire chaque nœud représente un appel récursif du tri par fusion et emmagasine la séquence non triée avant l'exécution et sa partition La séquence triée à la fin de l'exécution la racine représente l’appel initial les enfants sont les appels pour les sous-séquences les feuilles sont les appels pour les séquences de taille 0 ou 1
12
CSI251012 Tri par fusion – Exemple1 Partition 7 72 29 94 43 38 86 61 1 7 2 9 4 3 8 6 1 12 CSI2510 - Aut.09 - Tris recursifs
13
CSI251013 Appel récursif + partition 7 2 9 4 7 2 9 4 3 8 6 1 13 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1
14
CSI251014 7 2 9 4 7 2 7 2 9 4 3 8 6 14 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1 Appel récursif + partition
15
CSI251015 7 2 9 4 7 2 7 77 7 7 2 9 4 3 8 6 1 15 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1 Appel récursif + appel de base
16
CSI251016 7 2 9 4 7 2 7 77 72 22 2 7 2 9 4 3 8 6 1 16 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1 Appel récursif + appel de base
17
CSI251017 Fusion 7 2 9 4 7 2 2 7 7 77 72 22 2 7 2 9 4 3 8 6 1 17 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1
18
CSI251018 Appel récursif, …, appel de base, fusion 7 2 9 4 7 2 2 7 9 4 4 9 7 77 72 22 29 94 4 7 2 9 4 3 8 6 1 18 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1
19
CSI251019 Fusion 7 2 9 4 2 4 7 9 7 2 2 79 4 4 9 7 77 72 22 29 94 4 7 2 9 4 3 8 6 1 19 CSI2510 - Aut.09 - Tris recursifs Tri par fusion - Example
20
CSI251020 7 2 9 4 2 4 7 9 3 8 6 1 1 3 8 6 7 2 2 79 4 4 93 8 3 86 1 1 6 7 77 72 22 29 94 43 33 38 88 86 66 61 11 1 7 2 9 4 3 8 6 1 20 CSI2510 - Aut.09 - Tris recursifs Tri par fusion - Example Appel récursif, …, appel de base, fusion
21
CSI251021 Fusion 7 2 9 4 2 4 7 93 8 6 1 1 3 8 6 7 2 2 79 4 4 93 8 3 86 1 1 6 7 77 72 22 29 94 43 33 38 88 86 66 61 11 1 7 2 9 4 3 8 6 1 1 2 3 4 6 7 8 9 21 CSI2510 - Aut.09 - Tris recursifs Tri par fusion – Exemple1
22
CSI251022 674523146339842 Tri par fusion – Exemple2
23
CSI251023 674523146339842 674523146339842
24
CSI251024 674523146339842 674523146339842 45231498
25
CSI251025 674523146339842 674523146339842 45231498 2398
26
CSI251026 674523146339842 674523146339842 45231498 2398 Fusionner
27
CSI251027 674523146339842 674523146339842 45231498 2398 23 Fusionner
28
CSI251028 674523146339842 674523146339842 45231498 2398 2398 Fusionner
29
CSI251029 674523146339842 674523146339842 45231498 23984514 2398
30
CSI251030 674523146339842 674523146339842 45231498 23984514 Fusionner 2398
31
CSI251031 674523146339842 674523146339842 45231498 23984514 Fusionner 2398
32
CSI251032 674523146339842 674523146339842 45231498 23984514 45 Fusionner 239814
33
CSI251033 674523146339842 674523146339842 45231498 23984514 Fusionner 98451423
34
CSI251034 674523146339842 674523146339842 45231498 23984514 Fusionner 9814 2345
35
CSI251035 674523146339842 674523146339842 45231498 23984514 Fusionner 2314 23 9845
36
CSI251036 674523146339842 674523146339842 45231498 23984514 Fusionner 23984514 2345
37
CSI251037 674523146339842 674523146339842 45231498 23984514 Fusionner 23984514 234598
38
CSI251038 674523146339842 674523146339842 45231498 23984514 6763342 23984514 234598
39
CSI251039 674523146339842 674523146339842 45231498 23984514 6763342 676 23984514 234598
40
CSI251040 674523146339842 674523146339842 45231498 23984514 6763342 676 Fusionner 23984514 234598
41
CSI251041 674523146339842 674523146339842 45231498 23984514 6763342 676 6 Fusionner 23984514 234598
42
CSI251042 674523146339842 674523146339842 45231498 23984514 6763342 676 Fusionner 239845146 234598
43
CSI251043 674523146339842 674523146339842 45231498 23984514 6763342 6763342 23984514676 14234598
44
CSI251044 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 23984514676 14234598
45
CSI251045 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 3323984514676 14234598
46
CSI251046 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 422398451467633 14234598
47
CSI251047 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 14234598
48
CSI251048 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 2398451464233 14234598 6 67
49
CSI251049 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 23984514633 14234598 633 6742
50
CSI251050 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 2398451464233 14234598 63342 67
51
CSI251051 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 14234598 6334267
52
CSI251052 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 234598 334267 14 6
53
CSI251053 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 234598 64267 6 14 33
54
CSI251054 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 144598 64267 614 23 33
55
CSI251055 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 142398 64267 61423 45 33
56
CSI251056 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 142398 63367 6142333 45 42
57
CSI251057 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 142398 63342 614233342 45 67
58
CSI251058 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 142345 63342 61423334245 98 67
59
CSI251059 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 14234598 6334267 6142333424567
60
CSI251060 674523146339842 674523146339842 45231498 23984514 6763342 6763342 Fusionner 239845146764233 14234598 6334267 614233342456798
61
CSI251061 674523146339842 674523146339842 45231498 23984514 6763342 6763342 239845146764233 14234598 6334267 614233342456798
62
CSI251062 674523146339842 614233342456798
63
CSI251063 Analyse du tri par fusion profondeur#séqstaille 01n 12 n2n2 i2i2i n2in2i ……… Le hauteur h de l'arbre de tri par fusion est O(log n) à chaque appel récursif, nous divisons la séquence en deux La quantité de travail aux nœuds de profondeur i est O(n) on divise et fusionne 2 i séquences de taille n 2 i on fait 2 i 1 appels récurrents Ainsi, le temps total d’exécution du tri par fusion est O(n log n)
64
Fusion CSI251064
65
Tri fusion CSI251065
66
CSI251066 Tri rapide (Quicksort)
67
CSI251067 Tri rapide Tri rapide est un algorithme de triage aléatoire basé sur le paradigme divide-and-conquer: Diviser: choisir un élément au hasard x (appelé le pivot) et partitionner S en sous-ensembles L: les éléments plus petit que x E: les éléments égaux à x G: les éléments plus grand que x Appliquer récursivement : tri L et G Conquérir : fusionner L, E et G x x L G E x
68
CSI251068 i PIVOT x S.elemAtRank(i) (L,G) Partition(S,x) QuickSort(L) QuickSort(G) QuickSort(S) x S x L G E Pas sur-Place
69
CSI251069 Partition Nous partitionnons une séquence d'entrée comme suit : Nous enlevons, un à un, chaque élément y de S et Nous insérons y dans L, E ou G, dépendant du résultat de la comparaison avec le pivot x Chaque insertion et suppression sont au début ou à la fin d'une séquence, et alors il prend un temps O (1) Ainsi, l'étape de partition du tri rapide prend un temps O(n) Algorithm partition(S, p) entrées séquence S, position p du pivot sortie sous-séquences L, E, G des éléments de S plus petits que, égaux à, ou plus grands que le pivot, resp. L, E, G séquences vides x S.remove(p) while S.isEmpty() y S.remove(S.first()) if y < x L.insertLast(y) else if y = x E.insertLast(y) else { y > x } G.insertLast(y) return L, E, G Pas sur-place
70
CSI251070 Tri rapide - Arbre Une exécution du tri rapide est représentée par un arbre binaire: Chaque nœud représente un appel récursif du tri rapide et emmagasine: La séquence non triée avant l'exécution et son pivot La séquence triée à la fin de l'exécution La racine est l'appel initial Les feuilles sont les appels sur les sous-séquences de taille 0 ou 1 7 4 9 6 2 2 4 6 7 9 4 2 2 47 9 7 9 2 29 9 70 CSI2510 - Aut.09 - Tris recursifs 4 47 7
71
CSI251071 Sélection du pivot 7 2 9 4 3 7 6 1 71 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1
72
CSI251072 Partition, appel récursif, sélection du pivot 2 4 3 1 7 2 9 4 3 7 6 1 72 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1
73
CSI251073 2 4 3 1 1 11 1 7 2 9 4 3 7 6 1 73 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1 Partition, appel récursif, appel de base
74
CSI251074 7 2 9 4 3 7 6 1 2 4 3 1 1 2 3 4 1 11 14 3 3 4 4 44 4 74 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1 Appel récursif,…, appel de base, joindre, joindre
75
CSI251075 7 9 7 7 2 9 4 3 7 6 1 2 4 3 1 1 2 3 4 1 11 14 3 3 4 4 44 4 75 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1 Partition, appel récursif,…, appel de base
76
CSI251076 Partition, …, appel récursif, appel de base 7 9 7 7 2 9 4 3 7 6 1 2 4 3 1 1 2 3 4 1 11 14 3 3 4 3 34 44 4 9 99 9 76 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1
77
CSI251077 Joindre, joindre 7 9 7 7 7 9 7 2 9 4 3 7 6 1 1 2 3 4 6 7 7 9 2 4 3 1 1 2 3 4 1 11 14 3 3 4 3 34 44 4 9 99 9 77 CSI2510 - Aut.09 - Tris recursifs Tri rapide – Exemple1
78
CSI251078 Pire de cas : temps d'exécution Le pire de cas pour le tri rapide arrive quand le pivot est l’élément unique minimum ou maximum Un des ensembles L et G a la taille n 1 et l'autre a la taille 0 Le temps d’exécution est proportionnel à la somme n (n 1) … 2 Alors, dans le pire des cas, le temps d'exécution du tri rapide est O(n 2 ) profondeurtemps 0n 1 n 1 …… 1 …
79
CSI251079 Temps moyen d'exécution Considérer un appel récursive au tri rapide sur une séquence de taille s. Soit: Pour la moitié des appels: la taille de L et G est inférieure à 3s 4 Pour l’autre moitié: soit L ou G a une taille plus grande que 3s 4 En moyenne, chaque niveau i traitera une séquence de taille ( 3 4 ) i 2 n Le dernier niveau est atteint lorsque ( 3 4 ) i 2 n = 1. C’est-à-dire i=2log4/3n La hauteur de l’arbre est donc O(log n )
80
CSI251080 Temps prévu d'exécution Ainsi, nous avons La hauteur prévue de l'arbre de tri rapide est O(log n) La quantité de travail total fait aux nœuds de même profondeur de l'arbre de tri rapide est O(n) Ainsi, le temps prévu d’exécution est O(n log n)
81
CSI251081 Dans l'étape de partition, nous utilisons des opérations de remplacement pour réarranger les éléments des séquences d’entrées tel que les éléments plus petits que le pivot ont des rangs plus petit que h les éléments égaux au pivot ont des rangs entre h et k les éléments plus grands que le pivot ont des rangs plus grand que k Les appels récursifs considèrent les éléments avec un rang plus petit que h les éléments avec un rang plus grand que k Tri rapide sur place
82
CSI251082 Étape 1 pour Diviser: l scrute la séquence de la gauche, et r de la droite Un échange est exécuté quand l est à un élément plus grand que le pivot et r est à un élément plus petit que le pivot. Tri rapide sur place
83
CSI251083 Un échange final avec le pivot complète l’étape pour Diviser Tri rapide sur place
84
CSI251084 Algorithm inPlacePartition(p,s,e) Entrées: position p du pivot; s et e sont les limites dans la séquence Sorties: l et r tel que : r-1=indice du dernier élément plus petit que le pivot l+1=indice du premier élément plus grand que le pivot l s, r e-1 swap S[p] with S[e], p e while l ≤ r while S[l] l l l+1 while S[r] > S[p] and r > l r r-1 if r > l swap S[r] with S[l] swap S[l] with S[p] return r,l On partitionne la séquence en utilisant deux indices pour la décomposer en L,E et G Répéter jusqu'à ce que l et r se croisent: l parcourt le tableau de gauche à droite jusqu’à trouver un élément ≥ le pivot r parcourt le tableau de droite à gauche jusqu’à trouver un élément < le pivot Échanger les éléments d’indices l et r Tri rapide sur place
85
CSI251085 Algorithm inPlaceQuickSort(S, l, r) Entrées séquence S, rangs l et r Sortirs séquence S avec les éléments des rangs entre l et r réarrangés dans l'ordre croissant if l r return i entier aleatoire entre l et r x S.elemAtRank(i) (h, k) inPlacePartition(i,l,r) inPlaceQuickSort(S, l, h 1) inPlaceQuickSort(S, k 1, r) Tri rapide sur place
86
CSI251086
87
CSI251087 AlgorithmTimeNotes Tri par sélection O(n 2 ) tous les cas sur-place lent (acceptable avec peu de données) Tri par insertion O(n 2 ) pire et moyen sur-place lent (acceptable avec peu de données) Tri rapide O(n 2 ) au pire O(n log n) en moyenne sur-place, partition très simple le plus rapide (bon avec un grand nombre d’entrées) Tri par monceau O(n log n) tous les cas sur-place rapide (bon avec un grand nombre d’entrées) Tri fusion O(n log n) tous les cas accès séquentiel (distribuées) fast (bon avec un très grand nombre d’entrées)
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.