Java - Collections.sort () performances
Im en utilisant Les Collections.sort() pour trier une LinkedList dont les éléments implémente l'interface Comparable, de sorte qu'ils sont classés dans un ordre naturel. Dans la javadoc de la documentation de son dit cette méthode utilise mergesort algorithme, qui a n*log(n) de la performance.
Ma question est de savoir s'il existe un algorithme plus efficace pour trier mes LinkedList?
La taille de cette liste pourrait être très élevé et tri sera également très fréquentes.
Merci!
source d'informationauteur msr
Vous devez vous connecter pour publier un commentaire.
O(N log N)
est très bon à l'infini. Cela dit, il y a le temps linéaireO(N)
non-comparaison de tri, par ex. comptage, de tri et d'un seau de tri. Ceci est utile lorsque, par exemple, vous êtes le tri des millions et des millions d'entiers, mais ils sont entre 1..10.Aussi, si la liste est "presque trié", l'autre quadratique le tri par insertion est signalé effectivement être mieux dans certains scénarios.
Que ce soit ou non applicable, ou même la peine de mettre en œuvre, dépend de votre profilage des résultats. Je dirais qu'à moins qu'elle ne démontre de la sorte d'être un goulot d'étranglement, ne vous inquiétez pas à ce sujet.
Voir aussi
Questions connexes
Si vous dites la liste sera triée "très fréquents", vous devriez envisager la tenue de la liste triée dit tout le temps, comme à l'aide d'un arbre au lieu d'un
LinkedList
. Peut-être vous pouvez même utiliser certainsSortedSet
au lieu d'unList
si vous n'avez pas de valeurs dupliquées et n'ont pas besoin de la Liste des opérations (comme le tri de toute façon tout le temps). De vérifier laTreeSet
classe de laSortedSet
mise en œuvre.Si vous souhaitez effectuer une itération sur cette "liste" (qui est en fait un Ensemble), vous pouvez utiliser l'Itérateur de la classe.
Si vous avez des valeurs à l'intérieur de la Liste que vous devez utiliser quelques astuces (comme de mettre la valeur dans une nouvelle classe qui a également eu certains delta pour le tri de l'égalité de l'objet)
Il n'y a pas de tri général de l'algorithme de mieux que
n*log(n)
. Et c'est assez rapide. En général, je veux dire que vos données n'ont pas de propriétés particulières.Je suis expérimenter avec de grands ensembles de données (go de données) et ont mis en place une sorte de fusion (il y en est un bon exemple @ googlecode). Cependant, je suis en utilisant la Collection.sort() de pré-tri dans mes tampons temporaires et mon expérience de la Collection.trier() est ridiculement lente à un certain seuil de données. Avec un auxiliaire de la mémoire tampon de 96 MO, je peux trier un de ces tampons dans environ 30sec (note: cela dépend fortement de l'comparateurs vous utilisez - je utiliser une colonne personnalisée mise en page avec une assez complexe de la colonne de l'analyseur), cependant cette augmentation à une taille de bloc de 128 mo le saut dans le temps, à plus de 3 minutes. Ce n'est en aucun rapport avec le linéaire (ou quasi-linéaire) le comportement que je peux observer de plus petits morceaux. Cela a un impact tellement, qu'une sorte de fusion avec des petits tampons en presque (?) tous les cas plus rapide que dans la mémoire de tri à l'aide d'une 128 mo de mémoire tampon. Pour faire court: Fusion de tri est le chemin à parcourir pour de grands ensembles de données au-delà de la limite de 100 mo. Je ne peux pas vraiment répondre à pourquoi c'est, et ces chiffres pourraient même être dépend de la machine (le mien est un OS-X 2.6 GHz i7 & 16 go de mémoire).
En termes de tri de la liste, non, de toute comparaison en fonction des tris sur des données générales sont en O(N log(N)).
Si votre recours est due à des insertions, alors vous pouvez essayer de votre lot insertions et puis sorte de fusion avec la liste principale - si vous avez de nouveaux articles, vous de tri en O(B log(B)), puis faire un simple niveau de la fusion des deux listes qui est O(N+B).
Si votre recours est due à des changements dans les valeurs des éléments, vous pourriez être en mesure de faire un similaires dosage, si vous modifiez les valeurs mutables dans immuable et traiter les changements à un lot d'insertions et de suppressions. Sinon, vous ne serez pas en mesure d'éviter le tri de l'ensemble de la liste.
Si vos conditions le permettent, il y a plusieurs non-lié-liste des structures telles que les TreeSet disponibles qui maintiennent un ordre trié de manière plus efficace, mais échouera si les valeurs sont mutables.