De retour d'un élément à partir d'un TreeSet à l'aide de la recherche binaire
Dans TreeSet il existe une méthode appelée contient que renvoie la valeur true si un élément est dans le jeu. Je suppose que cette méthode utilise les binaires de recherche et de ne pas parcourir tous les éléments dans l'ordre croissant. Suis-je le droit?
J'ai un TreeSet qui contient les objets d'une classe qui utilise la Chaîne de deux variables d'instance pour le distinguer des autres objets de la même classe. Je veux être en mesure de créer une méthode qui permet de rechercher le TreeSet en comparant les objets de deux variables d'instance (à l'aide de méthodes get, bien sûr) avec les deux autres variables de type String et s'ils sont égaux, le retour de l'élément. Si les variables d'instance sont à moins d'aller vers le premier élément dans le sous-arbre droit ou s'ils sont supérieurs de recherche dans le sous-arbre gauche etc. Est-il un moyen de faire cela?
Je sais que je pourrais juste stocker les objets dans une liste de tableaux et d'utiliser les binaires de recherche pour trouver l'objet, mais ce ne serait pas aussi rapide que la simple recherche de la TreeSet.
ArrayList
n'est pas aussi rapide? Avez-vous essayé?Je veux dire en passant les éléments de la TreeSet à une nouvelle liste de tableaux à chaque fois que je dois rechercher un élément et le retour c'est lent.
ah, oui, qui aurait certainement être très lent. Mais si vous construisez d'abord la définir, puis de rechercher à plusieurs reprises, le tri et le binaire de la recherche d'un
ArrayList
pourrait être assez rapide.Que faire si une variable d'instance est plus grande que son homologue et l'autre est moins que son homologue? Comment devrait-tri?
Manaster: Les Objets sont triés en premier lieu par l'une des Chaînes, puis l'autre. Tout comme une liste de noms d'abord triées sur le nom puis le prénom.
OriginalL'auteur exent | 2011-04-05
Vous devez vous connecter pour publier un commentaire.
Plutôt que d'utiliser un
TreeSet
, vous pouvez stocker vos objets dans unTreeMap<Foo, Foo>
ouTreeMap<FooKey, Foo>
(si vous ne pouvez pas créer facilement un nouveauFoo
chaque fois que vous voulez la recherche).Set
s ne sont pas vraiment destinés à la recherche.Pour la
FooKey
exemple,FooKey
serait une simple immuable classe qui contient simplement les deuxString
s et estComparable
. Trouver la valeur deFoo
pour deuxString
s serait alors une simple question detreeMap.get(new FooKey(firstString, secondString))
. Ce n'est bien sûr utiliser l'arbre transversal vous voulez trouver la valeur.OriginalL'auteur ColinD
fait ce que vous voulez.
OriginalL'auteur greg
Vous devez soit mettre en œuvre Comparable sur votre objet ou de la création d'un Comparateur de classe que vous passez à l'époque TreeSet est construit. Cela vous permet de souligner votre entrée personnalisée logique de comparaison et de laisser le TreeSet ne optimisé de son magasin/search chose.
Essayez de TreeMap au lieu de TreeSet.
OriginalL'auteur Konstantin Komissarchik
Une chose que je me demandais pourquoi vous souhaitez rechercher dans un ensemble trié? Si vous voulez être en mesure d'effectuer une itération dans l'ordre ainsi que de recherche rapidement, vous pourriez bénéficier de stocker vos objets dans deux structures de données. L'un comme votre
SortedSet<Foo>
et puis aussi unHashMap<FooKey,Foo>
similaire à ce que ColinD mentionné. Ensuite, vous obtenez de la constante de temps des recherches au lieu de log(n) sur le TreeMap. Vous avez une réduction de peine d'avoir à écrire sur les deux structures, et une mémoire de ressources peine d'avoir les deux structures de données, mais vous avez optimisé votre accès aux données.Également si la mémoire les ressources sont limitées, et vos cordes sont vraiment ce qui différencient les objets, alors vous pouvez simplement mettre en œuvre
hashcode()
etequals()
sur votre objetFoo
puis il suffit d'utiliser à la fois comme la clé et la valeur (commeHashMap<Foo,Foo>
. L'inconvénient, c'est que vous avez à construire uneFoo
à l'appel de la lecture.HashMap
pour les recherches est certainement préférable. L'OP n'a pas dit pourquoi ils ont besoin d'un triées de la structure, donc peut-être qu'ils n'ont pas réellement et juste pensé que ce serait le plus efficace.OriginalL'auteur Justin Waugh
Vous eu la réponse sur l'utilisation de comparables ou de comparaison, mais j'ai pensé que je dirais que vous êtes de droite qui contient() effectue une recherche binaire, bien que vous ne devriez pas besoin de connaître ces détails
En général, vous ne devriez pas connaître les détails de la façon dont un particulier de la mise en œuvre d'une interface dans le JDK est mis en œuvre. Vous ne pouvez pas garantir qu'il en sera toujours ainsi. C'est pourquoi il est derrière une interface.
Mais dans ce cas je ne sais pas si binaire de recherche ou de la recherche séquentielle. C'est une grande différence.
Vous devriez regarder la performance garantit que le JDK collections. Par exemple,
TreeMap
états "Cette application offre la garantie log(n) coût du temps pour lacontainsKey
,get
,put
etremove
opérations". C'est le log(n) le temps que vous voulez, pas binaire de recherche (la recherche binaire s'applique spécifiquement aux triés fondé sur l'indice des structures comme des tableaux et des Listes, arbres).J'ai pensé qu'il était aussi appelé binaire de recherche pour l'arbre de recherche la méthode que j'ai décrite.
OriginalL'auteur Justin Waugh