Fusion de Tri du Temps et de l'Espace de la Complexité
Profitons de cette mise en œuvre de la Fusion de Tri comme un exemple
void mergesort(Item a[], int l, int r) {
if (r <= l) return;
int m = (r+l)/2;
mergesort(a, l, m); ------------ (1)
mergesort(a, m+1, r); ------------(2)
merge(a, l, m, r);
a) Le moment de la complexité de cette opération de Tri est O(nlg(n)). Va parallélisation (1) et (2) donner à toute pratique de gain ? Theorotically, il semble que, après la parallélisation eux aussi vous vous retrouvez en O(nlg(n). Mais pratiquement, pouvons-nous obtenir les gains ?
b) l'Espace de la complexité de cette opération de Tri ici est O(n). Cependant, si j'ai choisi d'effectuer place de fusion de trier en utilisant les listes chaînées (je ne sais pas si on peut le faire avec des tableaux raisonnablement) l'espace complexité O(lg n)), puisque vous avez à prendre en compte la récursivité de la pile la taille d'image ?
Peut-on traiter O(lg(n)) comme une constante, car il ne peut pas être plus de 64 ? J'ai peut-être mal compris ce à quelques endroits. Quelle est exactement la signification de 64 ?
c) http://www.cprogramming.com/tutorial/computersciencetheory/sortcomp.html dit de fusion le tri exige une constante de l'espace à l'aide de listes chaînées. Comment ? Ont-ils traiter O(lg n) constante ?
d) [Ajouté pour avoir plus de clarté] Pour l'espace de la complexité de calcul est-il juste de supposer l'entrée de tableau ou de la liste est déjà en mémoire ? Quand je fais de la complexité des calculs, j'ai toujours calculer le "plus" de l'espace, je vais avoir besoin en plus de l'espace déjà prises par entrée. Sinon, l'espace de la complexité sera toujours en O(n) ou pour le pire.
- cette réponse pourrait être utile pour certains concepts: stackoverflow.com/a/35050103/550393
Vous devez vous connecter pour publier un commentaire.
a) Oui - dans un monde parfait, vous auriez à faire log n fusionne de taille n, n/2, n/4, ... (ou pour mieux dire 1, 2, 3 ... n/4, n/2, n - ils ne peuvent pas être parallélisé), ce qui donne O(n). Il est toujours en O(n log n). Dans le pas-si-parfait-monde que vous n'avez pas infini le nombre de processeurs et de commutation de contexte et de synchronisation des décalages éventuels gains.
b) l'Espace de la complexité est toujours Ω(n) que vous avez à stocker les éléments quelque part. De l'espace supplémentaire de complexité peut être O(n) dans une mise en œuvre à l'aide de tableaux et de O(1) dans la liste liée implémentations. Dans la pratique, implémentations à l'aide de listes de besoin d'espace supplémentaire pour la liste de pointeurs, sauf si vous avez déjà la liste dans la mémoire, il ne devrait pas d'importance.
modifier
si vous comptez pile d'images, il est alors O(n)+ O(log n) , encore en O(n) dans le cas des tableaux. Dans le cas de listes, il est O(log n) de la mémoire supplémentaire.
c) les Listes seulement besoin de quelques conseils changé au cours du processus de fusion. Qui a constamment besoin de mémoire supplémentaire.
d) C'est pourquoi, dans de fusion-trier l'analyse de la complexité de gens mention supplémentaire "besoin d'espace" ou des choses comme ça. Il est évident que vous avez à stocker les éléments quelque part, mais c'est toujours mieux de parler de l '" de la mémoire supplémentaire pour garder les puristes à la baie.
MergeSort temps la Complexité est O(nlgn) qui est un des fondamentaux de la connaissance.
Fusion de Tri de la complexité de l'espace sera toujours en O(n), y compris avec des tableaux.
Si vous dessinez l'espace arbre, il semble que, même si l'espace de la complexité est O(nlgn). Cependant, comme le code est un parcours en Profondeur d'Abord le code, il vous sera toujours seulement être en expansion le long d'une branche de l'arbre, par conséquent, le total de l'utilisation de l'espace requis sera toujours borné par O(3n) = O(n).
Par exemple, si vous dessinez à l'espace de l'arbre, il me semble qu'il est O(nlgn)
où la hauteur de l'arbre est en O(logn) => Espace complexité est en O(nlogn) + n) = O(nlogn).
Cependant, ce n'est pas le cas dans le code comme il ne les exécute pas en parallèle. Par exemple, dans le cas où N = 16, c'est la façon dont le code pour mergesort exécute. N = 16.
remarquez comment le numéro de l'espace utilisé est de 32 = 2n = 2*16 < 3n
Puis il fusionner vers le haut
ce qui est de 34 < 3n.
Puis il fusionner vers le haut
36 < 16 * 3 = 48
puis il fusionner vers le haut
16 + 16 + 14 = 46 < 3*n = 48
dans un plus grand cas, n = 64
qui est de 64*3 <= 3*n = 3*64
Vous pouvez le prouver par induction pour le cas général.
Par conséquent, l'espace de la complexité est toujours borné par O(3n) = O(n), même si vous mettez en œuvre avec des tableaux aussi longtemps que vous le nettoyage de l'espace utilisé après la fusion et de ne pas exécuter du code en parallèle, mais de manière successive.
Exemple de mon application est donnée ci-dessous:
Espérons que cette aide!=)
Bientôt Chee Loong,
De l'université de Toronto
a) Oui, bien sûr, la parallélisation de fusion tri peut être très bénéfique. Il reste nlogn, mais votre constante doit être significativement plus faible.
b) l'Espace de la complexité avec une liste liée devrait être O(n), ou plus spécifiquement de O(n) + O(logn). Notez que c'est un +, pas un *. Ne pas vous préoccuper des constantes beaucoup quand on fait de l'analyse asymptotique.
c) Dans l'analyse asymptotique, seul le terme dominant dans l'équation beaucoup de questions, donc le fait que nous avons un + et non un * fait O(n). Si nous étions en reproduisant les sous-listes de tous les cours, je crois que ce serait O(nlogn) de l'espace - mais une puce reliée à base de liste de fusion de tri peuvent partager des régions des listes.
Pire des cas, la performance de la fusion de tri : O(n log n),
Dans le meilleur des cas les performances de la fusion de tri : O(n log n) typiquement, O(n) variante naturelle,
La moyenne des performances de fusion tri : O(n log n),
Pire-cas de l'espace de la complexité de la fusion de tri : О(n) total O(n) auxiliaire
L'espace de la Complexité: Ses nlogn si subarray/sous-liste sont créés à chaque niveau (logn niveaux * n l'espace requis à chaque niveau => logn*n).
Et si non, et l'espace de pile est considéré, il serait logn pour LinkedList et n (n + logn = n) pour le Tableau.
Le temps de la Complexité : nlogn pour le pire et le cas moyen