Transformer pour régner

Slides:



Advertisements
Présentations similaires
Algorithmes et structures de données avancés
Advertisements

Introduction à l’Algorithmique
Sensibilisation à l’Algorithmique et structure de données
Calculs de complexité d'algorithmes
Problème de 8 dames: Sachant que dans un jeu des échecs, une dame peut pendre toute pièce se trouvant sur la colonne ou sur la ligne ou sur les diagonales.
1 UMLV Optimalité des tris par comparaisons : O(n logn) Classements linéaires Tris lexicographiques Tri lexicographique.
Traitement Co-Séquentiel: Appariment et Fusion de Plusieurs Listes
Utilisation des tableaux
Arbre binaire de recherche
Les algorithmes: complexité et notation asymptotique
Chapitre VII. Tri Tri par tas Tri rapide.
Arbre Rouge Noir.
Gestion de Fichiers Arbres B.
Les fichiers indexés (Les B-arbres)
LES ARBRES IUP 2 Génie Informatique
Les points importants des chapitres 1 et 2. Ce quil faut retenir Les 2 conception du pgcd() (méthode force brute et diminuer pour régner) Définition de.
Structures de données IFT-2000
Structures de données IFT-2000
Coloration gap sommet identifiante de graphes
Les Fonctions. Définir une fonction Sections de code indépendantes que lon peut appeler à nimporte quel moment et dans nimporte quel ordre. Bout de code.
Introduction à la programmation I Fonctions Structures de contrôle Structures de données (arrays simples et indexés) Variables locales et globales.
Gestion de Fichiers Indexes basés sur les structures d’arbres binaires et indexes à niveaux multiples.
Gestion de Fichiers Tri Interne Efficace et Tri Externe.


Algorithmes d ’approximation
Efficacité des algorithmes
Arbres binaires complets
Gestion de Fichiers GF-10: Traitement Co-Sequentiel: Appariment et Fusion de Plusieures Listes (Base sur les sections de Folk, Zoellick & Riccardi,
Les Algorithmes de Tri Introduction Tri par Sélection
Tutorat en bio-informatique Le 21 novembre Exercices 2 et 3 (MAT1400) - solutions Chapitre 11.7, Analyse - concepts et contextes vol. 2 27) Cherchez.
Chapitre 5 Diminuer pour régner Mario Marchand
Structures de données IFT-2000
Transformations linéaires et sous-espaces associés
Structures de données IFT-2000 Abder Alikacem Semaine 11 Gestion des arbres binaires de tri et de recherche. Les arbres cousus. Les arbres n-aires Département.
INF1101 Cours11 Monceaux INF1101 – Algorithmes et structures de données.
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.

IFT Complexité et NP-complétude Chapitre 0 Rappels.
Analyse d’algorithmes
201 UMLV  Type « dictionnaire » sous-ensembles finis de E (ordonné) avec les opérations : Ens_vide :  Ens Ajouter : Ens x Elément  Ens Enlever.
Structures alternative et répétitive
Faire face aux limitations algorithmiques

Les limites de la puissance algorithmique
Structures de données IFT-2000
1 Notations Asymptotiques Et Complexité Notations asymptotiques : 0 et  Complexité des algorithmes Exemples de calcul de complexité.
ALGORITHME DE TRI Le tri par insertion.
ASI 3 Méthodes numériques pour l’ingénieur
Dév. d’application interactive III Recherche de chemin.
ALGORITHMIQUE Recherches : Tris : séquentielle, dichotomique
Suites numériques Définitions.
O-notation 1. Introduction 2. O-notation 3. Opérations 3.1 Somme 3.2 Produit 4. Règles générales 5. Exemple 6.Analyse des algorithmes récursifs 6.1 Dilatation.
Gestion de Fichiers GF-12: Comment Gerer les Indexes qui ne tiennent pas en Memoire de Maniere Efficace?: II. Arbres B (Base sur les Sections de.
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
Algorithmes de tri et de recherche
Programmation linéaire en nombres entiers
Méthodes de tri.
Les tris Tri Action de mettre une structure de données en ordre (croissant ou décroissant). Le plus simple est d’insérer en ordre. Les algorithmes de tri.
Chapitre 1 Nombres relatifs.
Tas et Tas Tri Exercice 1 Insérer dans un min-tas vide des numéros suivants:25, 17, 36, 2, 3, 100, 1, 19, 17 Supprimer.
Tutorat en bio-informatique Le 28 novembre Au programme… Algorithmes de tri dans un tableau (suite) Récursivité MAT1400.
1 UMLV  FICHIERS Mémoire de masse découpée en blocs Fichier :liste chaînée de blocs, ou arbre de blocs (répertoires - fichiers)‏ Bloc d’éléments Bloc.
Cours 5 - Trois algorithmes de tri d'un tableau
Structures de données IFT-2000
VI. Tri par tas.
Les monceaux (Heap) Monceaux Propriétés des Monceaux
Arbres AVL - Hauteur d’un arbre AVL - Insertion et restructuration
4/25/2017 4:30 PM Arbres (2,4) CSI2510 CSI2510.
CSI25101 Tri Plus efficace. 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.
Transcription de la présentation:

Transformer pour régner Chapitre 6 Transformer pour régner Mario Marchand IFT-17588 (Hiver 2005)

L’approche « transformer pour régner » Cette méthode de conception regroupe plusieurs techniques qui s’appuient toutes sur l’idée générale de transformer les instances pour qu’elles soient plus faciles à solutionner. Il existe trois grandes classes de transformations: Simplification de l’instance: l’instance est transformée en une instance du même problème mais qui est plus simple (et moins coûteuse) à traiter. Ex: « pré triage »: on trie le tableau avant de le traiter Changement de représentation: l’instance est représentée sous une autre forme plus adaptée au problème initial Ex: on transforme un tableau en un tas (monceau) Réduction (d’un problème à un autre): le problème initial est transformé en un autre problème pour lequel on possède un algorithme efficace Il faut alors toujours pouvoir reconstruire la solution du problème initial à partir de la solution du nouveau problème (exemples au chapitre 10) Mario Marchand IFT-17588 (H-05), Chapitre 6

Le « pré triage » Plusieurs opérations sur un tableau s’effectuent plus rapidement lorsqu’il est trié Considérons le problème de déterminer si tous les n éléments d’un tableau sont distincts Si l’on tente de résoudre ce problème sur un tableau non trié, il faut alors comparer, en pire cas, toutes les n(n-1)/2 paires d’éléments Cela nécessite (n2) comparaisons en pire cas Si l’on trie d’abord le tableau, il suffit simplement d’examiner chaque paire A[i], A[i+1] d’éléments consécutifs Cela nécessite alors (n) comparaisons en pire cas Mais le tri fusion nécessite (n log n) opérations Le temps d’exécution total (trier + balayer) est donc (n log n) en pire cas (selon la règle du maximum) Ce problème se résout donc plus rapidement si l’on tri d’abord le tableau. Mario Marchand IFT-17588 (H-05), Chapitre 6

Le « pré triage » (suite) Considérons le problème de recherche d’un élément K dans un tableau de n éléments Nous pouvons effectuer une recherche séquentielle sur un tableau non trié. Cela nécessite (n) comparaisons en pire cas Nous pouvons trier d’abord le tableau et ensuite faire une recherche binaire sur le tableau trié Le tri-fusion nécessite (n log n) opérations en pire cas Le recherche binaire nécessite (log n) comparaisons en pire cas Le temps total d’exécution (tri + recherche) en pire cas sera donc de (n log n) en vertu de la règle du maximum Ce problème se résout donc moins rapidement en triant d’abord Mario Marchand IFT-17588 (H-05), Chapitre 6

Le « pré triage » (suite) (… suite au problème de recherche d’un élément K dans un tableau de n éléments) Cependant, si le tableau n’est pas modifié pour les r prochaines recherches La recherche séquentielle nécessite (r¢n) comparaisons en pire cas Mais le trie, nécessitant (n log n) opérations, est exécuté une seule fois Et les r recherches binaires nécessitent (r¢log n) opérations. Cela donne donc un temps d’exécution total de: (max{n log n, r log n}) en pire cas Cela se compare avantageusement à la recherche séquentielle lorsque r 2 (log(n)). Mario Marchand IFT-17588 (H-05), Chapitre 6

Les tas (monceaux) Un tas est une structure de données très utilisée pour la mise en œuvre des files de priorité Ex: file d’attente de processus (avec priorités) Une file de priorité doit supporter efficacement les opérations suivantes: Trouver un item avec la priorité la plus élevée Enlever un item ayant la priorité la plus élevée Ajouter un item à la file de priorité Le tas est une structure intermédiaire utilisée par l’algorithme du tri par tas (« heapsort ») Un tableau est d’abord transformé en un tas Ensuite les éléments sont repositionnés en ordre croissant Le tableau est alors trié Mario Marchand IFT-17588 (H-05), Chapitre 6

Définition du tas Un arbre binaire dont chaque nœud contient une valeur (ou un élément) est appelé un tas lorsque ces deux propriétés sont satisfaites: L’arbre binaire est essentiellement complet: tous les niveaux sont remplis excepté (possiblement) le dernier et, dans ce cas, les nœuds manquant sont tous à droite La valeur d’un nœud est toujours supérieure où égale à celle de ses enfants (propriété du tas) la valeur de la racine est donc la valeur maximale du tas Mario Marchand IFT-17588 (H-05), Chapitre 6

Le tas et son tableau associé Les éléments (valeurs) du tas peuvent se positionner dans un tableau H[1..n] comme suit: La valeur de la racine est placé en H[1] Le premier élément du niveau suivant est placé en H[2] Le second élément de ce niveau est placé en H[3] … L’assignation se fait donc du niveau supérieur au niveau inférieur en balayant chaque niveau de gauche à droite Mario Marchand IFT-17588 (H-05), Chapitre 6

Propriétés des tas Un nœud n’ayant pas d’enfants est appelée une feuille Un nœud ayant au moins un enfant est appelé un parent (ou nœud interne) La hauteur d’un arbre est la longueur du chemin menant de la racine à la feuille la plus profonde Ex: l’arbre de la page précédente possède une hauteur de 3 Considérons un tas de n nœuds et de hauteur h Numérotons chaque niveau en débutant par le niveau supérieur Le niveau 0 contient 20 nœuds (la racine) Le niveau 1 contient 21 nœuds Le niveau i contient 2i noeuds Seul le niveau h (niveau inférieur) est possiblement non plein Le nombre l de nœuds dans ce niveau inférieur est au minimum 1 et au maximum 2h. Mario Marchand IFT-17588 (H-05), Chapitre 6

Propriétés des tas (suite) Nous avons alors: n = 20 + 21 + … 2h-1 + l avec 1 · l · 2h Alors: n = 2h – 1 + l Alors: n ¸ 2h ) h · log2(n) De plus: n · 2h – 1 + 2h = 2h+1 – 1 ) n < 2h+1 ) log2(n) < h + 1 Alors: h · log2(n) < h + 1 ) blog2(n)c = h La hauteur h d’un tas de n nœuds est alors donné par: h = blog2(n)c Mario Marchand IFT-17588 (H-05), Chapitre 6

Propriétés des tas (suite) Déterminons le nombre de feuilles f contenu dans un tas de n noeuds. Soit l = nombre de nœuds présents dans le niveau (inférieur) h Rappel: 1 · l · 2h Le nombre de nœuds présent dans le niveau h-1 est de 2h-1 Si l = 1 ) f = 2h-1 + 0 Si l = 2 ) f = 2h-1 + 1 Si l = 3 ) f = 2h-1 + 1 Si l = 4 ) f = 2h-1 + 2 Si l = i ) f = 2h-1 + bi/2c Alors: f = 2h-1 + bl/2c Or: l = n +1 – 2h ) bl/2c = b(n+1)/2 - 2h-1c = b(n+1)/2c – 2h-1 Alors: f = b(n+1)/2c = dn/2e = f Puisqu’un nœud est soit une feuille ou un parent, le nombre p de parents contenu dans un tas de n nœuds est p = bn/2c. Mario Marchand IFT-17588 (H-05), Chapitre 6

Propriétés des tas (suite) H[20] H[21] H[21+1] H[22] H[22+1] H[22+2] H[22+3] H[23] H[23+1] H[23+2] H[23+3] H[23+4] H[23+5] H[23+6] H[23+7] . . . . H[2h+2h-1] H[2h] H[2h+1] . . . . Les élément du tas sont disposés dans H[1..n] comme ci-dessus Nous remarquons que les enfants de H[2k] sont H[2k+1] et H[2k+1+1] (lorsqu’ils existent) Et les enfants de H[2k+j] sont H[2k+1+2j] et H[2k+1+2j+1] (s’ils existent) Les enfants de H[i] sont alors H[2i] et H[2i+1] (lorsqu’ils existent) Le parent de H[i] est alors H[bi/2c] Mario Marchand IFT-17588 (H-05), Chapitre 6

Construction d’un tas du bas vers le haut Pour que le tableau H[1..n] initial soit un tas il faut satisfaire H[i] ¸ H[2i] et H[i] ¸ H[2i+1] pour i = 1...bn/2c (les nœuds parents). Nous devons permuter certains éléments pour obtenir cette propriété L’algorithme de construction débute avec le parent i = bn/2c . Si H[i] < max{H[2i], H[2i+1]}, on «swap» H[i] avec max{H[2i], H[2i+1]} On recommence avec le parent i-1 jusqu’à la racine (i=1) Lorsque l’on interchange H[i] avec l’un de ses enfants H[j] il faut recommencer cette procédure avec cet enfant H[j] (et non avec l’autre) Mario Marchand IFT-17588 (H-05), Chapitre 6

L’algorithme HeapButtomUp pour la construction d’un tas Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse de HeapButtomUp Comptons le nombre de comparaisons effectuées par HeapBottomUp pour estimer son temps d’exécution Pour chaque parent i de bn/2c … 1, il faut comparer H[i] avec ses deux enfants H[2i] et H[2i+2] (le parent i = bn/2cpossède parfois un seul enfant) Alors disons que nous effectuons 2 comparaisons pour chaque parent En meilleur cas, H[1..n] est déjà (initialement) un tas et satisfait H[i] ¸ H[2i] et H[i] ¸ H[2i+1] pour i = 1… bn/2c Pour ces cas, chaque parent occasionnera uniquement 2 comparaisons et il ne sera jamais nécessaire de vérifier la propriété du tas pour les enfants On a alors Cbest(n) = 2 bn/2c. En pire cas, il y a toujours un des enfants H[j] de H[i] qui a H[j] > H[i] Cela se produit lorsque H[i] < H[2i] pour i = 1… bn/2c. Ex: lorsqu’un tableau d’éléments tous distincts est déjà trié Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse de HeapButtomUp (suite) Dans ces pire cas, pour chaque parent i, il faut faire 2 comparaisons par niveau qu’il y a sous le parent i. Si le nœud i se trouve au niveau k, le nombre de niveaux qu’il y a sous le noeud i est donné par h – k (où h est la hauteur du tas) Le nombre de comparaisons qu’il faut faire en pire cas pour le parent i est alors de 2(h – k) Soit p(k) le nombre de parents présents au niveau k Nous avons p(k) = 2k pour k = 0, 1, ... h – 2 Pour k = h – 1, nous avons p(k) · 2k (voir figures pages 8 et 12) Le nombre de comparaisons Cworst(n) effectuées au total en pire cas est donc donné par: Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse de HeapButtomUp (suite) Or en annexe A on trouve: Alors: Ainsi: Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse de HeapButtomUp (suite) Or, en page 10, nous avions que 2h – 1 = n – l < n et h = blog2(n)c Alors: Cworst(n) · 4(2h – h – 1) < 4(n – h) = 4(n – blog2(n)c) 2 (n) Alors Cworst(n) 2 O(n) Or nous avions Cbest(n) 2 (n) Le temps requis pour construire un tas de n noeuds avec l’algorithme HeapBottomUp est donc 2 (n) Mario Marchand IFT-17588 (H-05), Chapitre 6

Insertion d’un élément dans un tas Pour la mise en œuvre d’une file de priorité, nous devons pouvoir insérer rapidement un nouvel item dans un tas Pour cela, nous insérons d’abord le nouvel élément K dans une nouvelle feuille que nous positionnons juste après la dernière feuille du tas (ou, plus simplement, nous faisons H[n+1] Ã K) Nous comparons K avec son parent H[b(n+1)/2c]: Si K · H[b(n+1)/2c] ne rien faire car H[1..n+1] est un tas Sinon on interchange K avec H[b(n+1)/2c] Nous recommençons jusqu’à ce que K est · à la valeur de son parent (ou jusqu’à ce que K devienne la racine) Le nombre maximal de comparaisons requises est donc de h’ = blog2(n+1)c Mario Marchand IFT-17588 (H-05), Chapitre 6

Enlever la racine d’un tas Pour la mise en œuvre d’une file de priorité, nous devons fréquemment enlever la racine d’un tas car c’est un élément dont la priorité est la plus élevée Pour cela, nous interchangeons l’élément H[n] avec H[1] et nous reconstruisons le tas H[1..n-1] comme suit: nous comparons la valeur de H[1] avec celle de ses enfants et l’interchangeons avec le max de ses enfants si c’est nécessaire Nous continuons jusqu’au niveau inférieur (si c’est nécessaire) tel que prescrit par HeapBottumUp pour l’élément i = 1. Cela nécessite au plus 2blog2(n-1)c comparaisons (pour reconstruire H[1..n-1]) Mario Marchand IFT-17588 (H-05), Chapitre 6

Le tri par tas À partir d’un tableau non trié, nous construisons d’abord un tas H[1..n] à l’aide de l’algorithme HeapBottumUp en un temps 2 (n) La racine est donc un élément de valeur la plus élevée Nous interchangeons H[1] avec H[n] et reconstruisons le tas H[1..n-1] à l’aide de l’algorithme de la page précédente Cela nécessite au plus 2blog2(n-1)c comparaisons Nous recommençons cette opération avec H[1..n-1], ensuite H[1..n-2], et puis H[1..n-3] … finalement l’on s’arrête en H[1]. H[1..n] est alors trié Le pseudo code de l’algorithme se trouve à la page suivante Le nombre C(n) de comparaison requises est alors borné par: Mario Marchand IFT-17588 (H-05), Chapitre 6

L’algorithme du tri par tas HeapSort Algorithm HeapSort(H[1..n]) //input: an array H of n elements //output: the array H sorted if n > 1 HeapBottumUp(H[1..n]) for m à n downto 2 do swap(H[1], H[m]) k à 1; v à H[1]; heap à false while not heap and 2 £ k · m-1 do j à 2 £ k if j < m-1 //there are 2 children if H[j] < H[j+1] j à j + 1 if v ¸ H[j] heap à true else H[k] à H[j]; k à j H[k] à v Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse du tri par tas Alors le nombre de comparaisons est borné par: Nous venons donc de démontrer que C(n) 2 O(n log n) Alors Cworst(n) 2 O(n log n) En fait, il est possible de démontrer que Cworst(n) 2 (n log n) de la manière suivante. Le pire cas est réalisé lorsque le tableau initial est trié dans l’ordre inverse (avec des éléments tous distincts) car, dans ce cas: HeapBottumUp garde ce tableau inchangé (car c’est déjà un tas) en un temps (n) De plus, cela prend 2blog2(n-1)c comparaisons pour interchanger H[1] avec H[n] et reconstruire le tas pour H[1..n-1] car H[1] est (après l’interchange H[1]$H[n]) le plus petit élément de H[1..n-1] Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse du tri par tas (suite) Alors, en pire cas, nous avons: Or s ln(x) dx = x ln(x) - s dx. Alors on a: Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse du tri par tas (suite) Alors: Or, la fonction à droite de « ¸ » est 2 (n log n) Alors Cworst(n) 2 (n log n) Or nous avions que Cworst(n) 2 O(n log n). Alors: Cworst(n) 2 (n log n) Le meilleur cas est celui où tous les éléments du tableau sont identiques. Dans ce cas HeapBottumUp produit un tas qui est à la fois un tableau trié et HeapSort effectue au plus deux comparaisons (une par enfant) pour chaque valeur de m de la boucle for. Alors: Cbest(n) 2 (n) Mario Marchand IFT-17588 (H-05), Chapitre 6

Analyse du tri par tas (suite) Il est également possible de montrer que Cavg(n) = (n log n) mais la démonstration est difficile… En moyenne, le nombre de comparaisons effectuées par le tri par tas est légèrement supérieur à celui du tri rapide i.e.: la constante multiplicative devant (n log n) est légèrement inférieure pour le tri rapide Des analyses empiriques confirment une légère supériorité du tri rapide (en moyenne) Le tri par tas semble légèrement supérieur au tri fusion (en moyenne) Mario Marchand IFT-17588 (H-05), Chapitre 6