6
votes

Méthode intégrée pour fusionner deux listes triées dans Ruby

J'ai deux listes d'objets FOO. Chaque objet FOO a un horodatage, FOO.TMESTAMP. Les deux listes sont initialement triées par horodatage en ordre décroissant.

Je veux fusionner les deux listes d'objets FOO d'une manière où la liste finale est également triée par horodatage en ordre décroissant.

Mise en œuvre Ce n'est pas difficile, mais je me demandais s'il existe des méthodes de rubis intégrées qui peuvent le faire, car je suppose que les méthodes intégrées produiront les meilleures performances.

Merci.


0 commentaires

4 Réponses :


5
votes

Cela fonctionnera, mais cela ne donnera pas de grandes performances car il ne tirera pas parti des listes déjà triées à l'avance:

list = (list1 + list2).sort_by(&:timestamp)


0 commentaires


2
votes

Processus impératif malodorant de fusionner les deux ... xxx

peut-être utiliser .Slice! Pour prendre le premier élément serait mieux que d'inverser et de sauter?

====================

édité après le quatrième commentaire:

Droite ... J'ai eu une autre pièce, mais j'ai besoin de continuer avec un vrai travail ou je vais être tiré; -) < P> Sur un grand nombre d'entiers, ma méthode d'origine fonctionne plus rapidement que d'utiliser Sort_By, mais après avoir rempli les tableaux avec 100 000 objets openvers et trier sur un attribut, le tri_by était 100 fois plus rapide.

Voici mes résultats d'analyse comparative: xxx

de sorte que le résultat semble être que vous pouvez écrire une méthode qui les libérera tout en maintenant une commande assez rapide (et il y a probablement d'autres gains d'efficacité Pour sortir de la méthode Shift_Merge, mais pour l'avantage supplémentaire, cela vaut-il vraiment la peine pas simplement les rejeter et utiliser Sort_By pour la facilité d'entre eux?: -)

I J'espère que cela ne compte pas comme une digression ...


4 commentaires

L'OP a dit "la mise en œuvre n'est pas difficile", alors je ne pense pas qu'il vous demande de la mettre en œuvre pour lui. De plus, vous devriez être capable d'éviter appeler inverse quatre fois.


a) Oui ... J'ai suggéré l'inversion n'était pas géniale (même si elle serait une fois sur un tableau Nil .. mais toujours, c'est puante). J'utilisais principalement le code comme point de départ qui pourrait indiquer vers des façons de mélanger les deux ensemble, sans appel à régler à nouveau. b) J'avais négligé le "Ce n'est pas difficile ..." dans l'op. Oups - je n'aurais probablement pas posté que j'ai remarqué cela, mais je remarque que vous avez également mis en place une solution non difficile aussi ;-)


FWIW: Je viens de recevoir un violon avec des repères bruts - à l'aide de ".sort_by" sur deux tableaux d'éléments 100 000 remplis de nombres aléatoires dure environ 0,7 seconde ici. En utilisant quatre appels «inverse» comme ci-dessus, la même action prend environ 0,3 seconde. Supprimer les inverse et remplacer .pop avec .Slice! (0) prend plus de 7 secondes. Dans la vie réelle - Sort_by ou Trier serait probablement assez simple pour le garder à une ligne et ne pas m'inquiéter trop de cela :-)


Intéressant. Donc, pop est plus rapide que SLICE! (0) . Qu'en est-il de shift ?



0
votes

Utilisez la méthode étendre () code> pour ajouter list2 code> à la fin de list1 code>:

list1 = ["a", "b" , "c"]
list2 = [1, 2, 3]

list1.extend(list2)
print(list1)


0 commentaires