Friday, 10 February 2017

Déménagement Moyen Récursif Implémentation

Comme Sort de fusion. QuickSort est un algorithme Divide and Conquer. Il sélectionne un élément comme pivot et partitionne le tableau donné autour du pivot sélectionné. Il existe de nombreuses versions de quickSort qui sélectionnent le pivot de différentes façons. Choisissez toujours le premier élément comme pivot. Choisissez toujours le dernier élément en tant que pivot (implémenté ci-dessous) Choisissez un élément aléatoire comme pivot. Choisissez la médiane comme pivot. Le processus clé dans quickSort est partition (). La cible des partitions est, étant donné un tableau et un élément x du tableau comme pivot, mettez x à sa position correcte dans le tableau trié et mettez tous les éléments plus petits (plus petits que x) avant x, et mettez tous les éléments supérieurs (supérieurs à x) après X. Tout cela devrait être fait en temps linéaire. Pseudo Code pour la fonction récursive QuickSort: Algorithme de partition Il peut y avoir plusieurs façons de faire une partition, le pseudo-code suivant adopte la méthode donnée dans le livre CLRS. La logique est simple, nous partons de l'élément le plus à gauche et suivons l'indice des éléments plus petits (ou égaux) comme i. En parcourant, si nous trouvons un élément plus petit, nous échangeons l'élément courant avec arri. Sinon, nous ignorons l'élément courant. Pseudo code pour partition () Illustration de partition (): Implémentation: Voici les implémentations C, Java et Python de QuickSort. Analyse du QuickSort Le temps pris par QuickSort en général peut s'écrire comme suit. Les deux premiers termes sont pour deux appels récursifs, le dernier terme est pour le processus de partition. K est le nombre d'éléments qui sont plus petits que le pivot. Le temps pris par QuickSort dépend du tableau d'entrée et de la stratégie de partition. Voici trois cas. Pire Cas: Le pire cas survient lorsque le processus de partition sélectionne toujours le plus grand ou le plus petit élément comme pivot. Si nous considérons la stratégie de partition ci-dessus où le dernier élément est toujours sélectionné comme pivot, le pire cas se produit lorsque le tableau est déjà trié en ordre croissant ou décroissant. Voici la récurrence dans le pire des cas. Meilleur cas: Le meilleur cas se produit lorsque le processus de partition sélectionne toujours l'élément central comme pivot. Voici la récurrence pour le meilleur cas. Cas moyen: Pour faire une analyse de cas moyenne, nous devons considérer toute permutation possible de la matrice et calculer le temps pris par chaque permutation qui ne semble pas facile. Nous pouvons obtenir une idée du cas moyen en considérant le cas où la partition place O (n9) éléments dans un ensemble et O (9n10) éléments dans l'autre ensemble. Voici la récurrence de ce cas. La solution de la récurrence ci-dessus est également O (nLogn) Bien que la complexité du temps la plus défavorable de QuickSort soit O (n 2) qui est plus que beaucoup d'autres algorithmes de tri comme Merge Sort et Heap Sort. QuickSort est plus rapide dans la pratique, parce que sa boucle interne peut être efficacement mis en œuvre sur la plupart des architectures, et dans la plupart des données réelles. QuickSort peut être implémenté de différentes manières en changeant le choix du pivot, de sorte que le pire cas se produit rarement pour un type donné de données. Toutefois, le tri de fusion est généralement considéré comme meilleur lorsque les données sont énormes et stockées dans le stockage externe. Qu'est-ce que 3-Way QuickSort Dans l'algorithme QuickSort simple, nous sélectionnons un élément comme pivot, partitionnez le tableau autour du pivot et récitez pour les sous-tableaux à gauche et à droite du pivot. Considérons un tableau qui a beaucoup d'éléments redondants. Par exemple, . Si 4 est sélectionné comme pivot dans Simple QuickSort, nous ne fixons qu'un seul 4 et nous traitons récursivement les occurrences restantes. Dans QuickSort 3 voies, un tableau arrl..r est divisé en 3 parties: a) arrl..i éléments moins que pivot. B) éléments arri1..j-1 égaux au pivot. C) arrj..r éléments plus grand que pivot. Voir ceci pour la mise en œuvre. Pouvons-nous implémenter QuickSort Iteratively Oui, veuillez consulter Iterative Quick Sort. Pourquoi Quick Sort est préféré à MergeSort pour trier Arrays Quick Sort dans sa forme générale est un tri sur place (c'est-à-dire qu'il ne nécessite pas de stockage supplémentaire) alors que le tri de fusion requiert O (N) de stockage supplémentaire, N indiquant la taille de tableau qui peut être assez cher. Allouer et de-allocation de l'espace supplémentaire utilisé pour le tri de fusion augmente le temps de fonctionnement de l'algorithme. En comparant la complexité moyenne, nous trouvons que les deux types de sortes ont O (NlogN) complexité moyenne, mais les constantes diffèrent. Pour les tableaux, les pertes de type fusion échouent en raison de l'utilisation d'espace de stockage supplémentaire O (N). La plupart des implémentations pratiques de Quick Sort utilisent la version aléatoire. La version aléatoire a une complexité temporelle attendue de O (nLogn). Le pire cas est possible dans la version aléatoire aussi, mais le pire cas ne se produit pas pour un motif particulier (comme le tableau trié) et le triage rapide randomisé fonctionne bien dans la pratique. Quick Sort est également un algorithme de triage de cache friendly car il a une bonne localité de référence lorsqu'il est utilisé pour les tableaux. Quick Sort est également queue récursive, donc l'optimisation des appels queue est fait. Pourquoi MergeSort est préféré à QuickSort pour les listes liées Dans le cas des listes liées, le cas est différent principalement en raison de la différence dans l'allocation de mémoire des tableaux et des listes liées. Contrairement aux tableaux, les noeuds de liste liés peuvent ne pas être adjacents en mémoire. Contrairement au tableau, dans la liste liée, nous pouvons insérer des éléments au milieu dans O (1) espace supplémentaire et O (1) temps. Par conséquent, l'opération de fusion du tri de fusion peut être implémentée sans espace supplémentaire pour les listes liées. Dans les tableaux, nous pouvons faire un accès aléatoire car les éléments sont continus en mémoire. Supposons que nous ayons un entier A (4 octets) tableau A et que l'adresse de A0 soit x alors pour accéder à Ai, nous pouvons accéder directement à la mémoire à (x i4). Contrairement aux tableaux, nous ne pouvons pas faire d'accès aléatoire dans la liste chaînée. Quick Sort nécessite beaucoup de ce type d'accès. Dans la liste liée pour accéder à l'index ith, nous devons parcourir chaque noeud de la tête au ième noeud car nous n'avons pas de bloc continu de mémoire. Par conséquent, les frais généraux augmentent pour une tri rapide. Merge sort les données d'accès séquentiellement et le besoin d'accès aléatoire est faible. Merge Sort Like QuickSort. Merge Sort est un algorithme Divide and Conquer. Il divise la matrice d'entrée en deux moitiés, s'appelle lui-même pour les deux moitiés, puis fusionne les deux moitiés triées. La fonction de fusion () est utilisée pour fusionner deux moitiés. La fusion (arr, l, m, r) est un processus clé qui suppose que arrl..m et arrm1..r sont triés et fusionne les deux sous-ensembles triés en un seul. Voir l'implémentation C suivante pour plus de détails. Le diagramme suivant de wikipedia montre le processus de tri complet de fusion pour un tableau d'exemple. Si nous examinons de plus près le diagramme, nous pouvons voir que le tableau est récursivement divisé en deux moitiés jusqu'à ce que la taille devient 1. Une fois la taille devient 1, les processus de fusion entrent en action et commencent à fusionner des tableaux jusqu'à ce que le tableau complet soit fusionné. Time Complexity: Tri des tableaux sur différentes machines. Merge Sort est un algorithme récursif et la complexité du temps peut être exprimée comme suit la relation de récurrence. T (n) 2T (n2) La récurrence ci-dessus peut être résolue soit en utilisant la méthode Recurrence Tree ou Master. Il tombe dans le cas II de la Méthode Maître et solution de la récurrence est. La complexité en temps de Merge Sort est dans les 3 cas (pire, moyenne et meilleure) car le tri de fusion répartit toujours le tableau en deux moitiés et prend un temps linéaire pour fusionner deux moitiés. Le classement par tri est utile pour trier les listes liées dans le temps O (nLogn). Dans le cas des listes liées, le cas est différent principalement en raison de la différence dans l'allocation de mémoire Des tableaux et des listes liées. Contrairement aux tableaux, les noeuds de liste liés peuvent ne pas être adjacents en mémoire. Contrairement au tableau, dans la liste liée, nous pouvons insérer des éléments au milieu dans O (1) espace supplémentaire et O (1) temps. Par conséquent, l'opération de fusion du tri de fusion peut être implémentée sans espace supplémentaire pour les listes liées. Dans les tableaux, nous pouvons faire un accès aléatoire car les éléments sont continus en mémoire. Supposons que nous ayons un entier A (4 octets) tableau A et que l'adresse de A0 soit x alors pour accéder à Ai, nous pouvons accéder directement à la mémoire à (x i4). Contrairement aux tableaux, nous ne pouvons pas faire d'accès aléatoire dans la liste chaînée. Quick Sort nécessite beaucoup de ce type d'accès. Dans la liste liée pour accéder à l'index ith, nous devons parcourir chaque noeud de la tête au ième noeud car nous n'avons pas de bloc continu de mémoire. Par conséquent, les frais généraux augmentent pour une tri rapide. Le tri de fusion permet d'accéder aux données séquentiellement et le besoin d'accès aléatoire est faible. Problème de nombre d'inversions utilisé dans le tri externe


No comments:

Post a Comment