6
votes

Fusionner deux tableaux triés à Julia

Y a-t-il une fonction soignée dans Julia qui fusionnera deux tableaux triés et retourner la matrice de tri pour moi? J'ai écrit: xxx

mais n'y a pas de fonction native dans la base Julia pour faire cela?


0 commentaires

4 Réponses :


2
votes

Non, Cette fonction n'existe pas . Et en fait, je n'ai pas vu une langue qui a une telle fonction hors de la boîte.

Pour ce faire, vous devez conserver deux pointeurs dans chacun des tableaux, comparer les valeurs et déplacer le plus petit (basé sur ce que je vois, c'est exactement ce que vous faites).


0 commentaires

4
votes

Contrairement aux autres réponses, il y a en fait une méthode pour le faire dans la base Julia. Mais cela ne fonctionne que pour les tableaux d'entiers, et cela ne fonctionnera que si les tableaux sont uniques (en ce sens qu'aucun entier n'est répété dans l'une ou l'autre des matrogues). Utilisez simplement le type comme suit: xxx

Si vous exécutez le code ci-dessus, vous remarquerez que la fonction Union supprime les doublons À partir de la sortie, c'est pourquoi j'ai initialement indiqué que vos matrices doivent être uniques (sinon vous devez être heureux de disposer de duplicats supprimés dans la sortie). Vous remarquerez également que l'opération Union sur le (code> Intect fonctionne beaucoup plus rapide que Union sur un tri trié Vecteur {int} , puisque l'ancien exploite le fait qu'un composant est pré-trié.

Bien sûr, ce qui précède n'est pas vraiment dans l'esprit de la question, qui préoccupe davantage une solution pour tout type pour lequel l'opérateur lt est défini, ainsi que permettant des doublons.

Voici une fonction qui trouve efficacement l'union de Deux vecteurs uniques des les . Je n'ai jamais eu besoin d'un cas non unique moi-même, je n'ai donc pas écrit de fonction qui couvre ce cas, je crains que je crains: xxx

Une autre option est de regarder Dictionnaires triés, disponible dans le Datastructures.jl Package. Je ne l'ai pas fait moi-même, mais une méthode qui insère simplement toutes les observations dans un dictionnaire trié (vérification de la duplication de clé à votre guise), puis itière sur (touches, valeurs) devrait également être une moyen efficace d'attaquer ce problème.


1 commentaires

@Lindon Malheureusement, il n'y avait pas beaucoup de soutien pour la série Time à Julia, j'ai regardé. Les colis qui existent ont tendance à fournir simplement un cadre de base plutôt que les optimisations et les fonctions spécialisées que l'on pourrait éventuellement vouloir. Je pense que la plupart des parties intéressées se concentrent sur l'obtention de cadres de données à un niveau "Best-Business" pour l'instant et que la série temporelle prend un siège arrière. J'ai écrit un peu juste, mais n'a pas encore eu l'occasion de l'ajouter officiellement. C'est bon d'entendre qu'il y a plus de séries métriques trouvant Julia! :-)



2
votes

Bien que une fonction explicite pour fusionner deux vecteurs triées semble manquer, on peut être construit facilement à partir des blocs de construction existants (la question en a réellement démontré, mais cela ne définit pas une fonction).

La méthode suivante essaie de tirer parti du code existant et restez toujours efficace.

en code: xxx

Ce qui suit est un exemple suivant: xxx

je n'ai pas Benchmark La fonction, mais Quicksort (l'algorithme de tri par défaut) est généralement bonne performance sur des tableaux pré-triés. Il convient donc d'être correct et l'attribution d'un vecteur de résultat est requise dans n'importe quelle mise en œuvre.


0 commentaires

2
votes

Je continue à venir sur ceci dans différents projets, j'ai donc fait un forfait fusiforré ( https: // github .COM / VVJN / MERGESORTED.JL ). Vous pouvez l'utiliser comme suit.

a = sort!(rand(1000), order=Base.Reverse)
b = sort!(rand(1000), order=Base.Reverse)
c = mergesorted(a,b, order=Base.Reverse)
sort!(vcat(a,b), order=Base.Reverse) == c 


0 commentaires