2010-06-11 2 views
3

J'ai quelques données comme ceci:obtenir une gamme d'objets avec la recherche binaire

ID Value 
1 AAA 
1 ABC 
2 dasd 
2 dsfdsf 
2 dsfsd 
3 df 
3 dwqef 

Ce sont des objets (pas le texte brut).
et je veux obtenir tous les objets avec l'ID = 2.
Je peux faire une recherche binaire binaire et obtenir l'index 3, mais comment puis-je obtenir (2 et 4) y at-il un algorithme efficace?
le vrai problème a des listes avec environ un million d'articles.

toute langue sauf bf et Lisp peut aider.

+0

Si je comprends bien, votre recherche binaire renvoie l'index où un nouvel élément avec une valeur donnée sera placé. Si vous êtes seulement intéressé par la plage d'index cela peut être plus rapide que ma solution quand il y a un grand nombre de valeurs par identifiant. Ma solution sera un peu plus rapide si vous avez besoin des valeurs (pas seulement la plage d'index) ou si le nombre de valeurs par identifiant est faible. Il est possible que votre conversion de type (nombre entier à float) puisse diminuer les performances. –

Répondre

1

Vous pouvez créer une carte mappant un ID à une collection de valeurs;

Map: 
1 => { AAA, ABC } 
2 => { dasd, dsfdsf, dsfsd } 
... 

Cela aura un temps de recherche efficace de O (1). Vous pouvez également effectuer la recherche binaire, mais les recherches seront moins efficaces.

algorithme de recherche binaire:

D'abord, vous créez une liste triée (arraylist, chaînée, etc.). Il doit être trié sur l'identifiant. Ensuite, vous effectuez une recherche binaire standard pour trouver un élément qui correspond à l'ID. Ensuite, vous traversez la liste vers le haut et vers le bas jusqu'à ce que l'élément ne corresponde pas à l'identifiant. Cela trouvera tous les objets avec l'ID donné.

Exemple Liste:

List Index, Object 
0 Id=1 Value=A 
1 Id=2 Value=B 
2 Id=2 Value=C 
3 Id=3 Value=D 
4 Id=3 Value=E 

recherche binaire retourne l'index 2. Maintenant boucle vers le bas d'abord trouver l'élément 1: Id = 2 qui correspond, alors élément 0: Id = 1 qui ne correspond pas à et se termine donc la boucle descendante. La boucle ascendante trouve d'abord l'élément 3: Id = 3 qui ne correspond pas. Ceci termine la boucle ascendante.

+0

+1 pour ma solution précédente, je fais une telle chose pour éviter d'utiliser un map.my but est d'utiliser moins de mémoire avec de bonnes performances. – Behrooz

+0

votre réponse m'a aidé à me répondre. Je vais l'ajouter à la question originale. – Behrooz