Je prends une classe d'algorithmes et les devoirs les plus récents me bloquent vraiment. Essentiellement, l'affectation consiste à implémenter une version de tri de fusion qui n'alloue pas autant de mémoire temporaire que l'implémentation dans CLRS. Je suis censé le faire en créant seulement 1 tableau temporaire au début, et y mettre toutes les choses temporaires tout en divisant et en fusionnant.Mergesort qui sauve la mémoire
Je devrais également noter que la langue de la classe est Lua, ce qui est important car les seules structures de données disponibles sont les tables. Ils sont comme des cartes Java dans la mesure où ils viennent en paires clé-valeur, mais ils sont comme des tableaux dans lesquels vous n'avez pas besoin d'insérer des choses par paires - si vous insérez seulement une chose, elle est traitée comme une valeur. sera ce que son index serait dans un langage avec de vrais tableaux. Au moins c'est comme ça que je le comprends, puisque je suis nouveau à Lua aussi. En outre, n'importe quoi, primitives, chaînes, objets, etc. peuvent être une clé - même des types différents dans la même table.
Quoi qu'il en soit, 2 choses qui me source de confusion:
Tout d'abord, eh bien, comment est-il fait? Est-ce que vous continuez d'écraser le tableau temporaire avec chaque récursion de division et de fusion? En second lieu, je suis vraiment confus au sujet des instructions de devoirs (je vérifie la classe gratuitement donc je ne peux pas demander n'importe quel membre du personnel). Voici les instructions:
Ecrire une procédure haut niveau merge_sort qui prend comme argument le rayon Ar- trier. Il doit déclarer un tableau temporaire, puis appeler merge_sort_1, une procédure de quatre arguments: Le tableau à trier, celui à utiliser comme espace temporaire tem- , et les index de début et de fin dans lesquels cet appel à merge_sort_1 devrait fonctionner.
Maintenant, écrivez merge_sort_1, qui calcule le point milieu de l'intervalle début-fin, et se fait un appel récursif à lui-même pour chaque moitié. Après cela, les appels fusionnent pour fusionner les deux moitiés. La procédure de fusion que vous écrivez maintenant sera une fonction du tableau permanent et du tableau temporaire, du début, du milieu et de la fin. Il maintient un index dans le tableau temporaire et indexe i, j dans chaque moitié (triée) du tableau permanent. Il doit parcourir le tableau temporaire du début à la fin, en copiant une valeur provenant de la moitié inférieure du tableau permanent ou de la moitié supérieure du tableau permanent . Il choisit la valeur à i dans la moitié inférieure si elle est inférieure ou égale à la valeur à j dans la moitié supérieure, et avance i. Il choisit la valeur à j dans la moitié supérieure si elle est inférieure à la valeur à i dans la moitié inférieure, et avance j. Une fois qu'une partie du tableau permanent est épuisée, assurez-vous de copier le reste de l'autre partie. Le manuel utilise une astuce avec une valeur infinie ∞ à évitez de vérifier si l'une ou l'autre partie est épuisée. Cependant, cette astuce est difficile à appliquer ici, puisque où le mettriez-vous? Enfin, copiez toutes les valeurs du début à la fin dans le tableau temporaire retour au tableau permanent.
numéro 2 est confus parce que je ne sais pas ce que merge_sort_1 est censé faire, et pourquoi il doit être une méthode différente de merge_sort. Je ne sais pas non plus pourquoi il faut passer les index de début et de fin. En fait, peut-être que j'ai mal lu quelque chose, mais les instructions sonnent comme merge_sort_1 ne fait pas de vrai travail.
En outre, l'affectation entière prête à confusion parce que je ne vois pas dans les instructions où la division est faite pour faire 2 moitiés du tableau original. Ou suis-je mal compris mergesort?
J'espère que j'ai fait du sens. Merci tout le monde!
http://www.cs.princeton.edu/algs4/22mergesort/ - peut aider à la visualisation. idée est de "flip" quelle partie du tableau est utilisée - regardez la section "améliorations"; ou considérer la variante BU –