J'ai un tableau trié d'environ 500 000 ints. Actuellement, je sélectionne l'index correct en prenant les différences entre mon int cible, et tous les éléments, puis en triant par la différence minimale en utilisant LINQ (très inefficace). Je voudrais être en mesure de faire quelque chose de très similaire avec BinarySearch.Trouver l'index le plus proche par différence avec BinarySearch
Vu:
Pos Value
0 10
1 20
2 30
4 50
5 60
Si je veux trouver la valeur la plus proche de la valeur 24 Je veux l'indice a été à 1.
Vu:
int index = myArray.BinarySearch(values, 24);
if (index < 0)
index = ~index;
Cela renvoie 2 car il donne l'élément suivant en ligne, au lieu du plus proche. Est-il possible d'écrire un IComparer qui retournerait l'index le plus proche?
Valeurs données:
Value ExpectedReturn
20 1
24 1
25 2
26 2
30 2
Je suis en train de faire ce aussi vite que possible. Tout ce que j'ai fait jusqu'ici dans LINQ a été inférieur à ce que je pense que l'on peut réaliser avec une recherche binaire bien faite. Merci de votre contribution.
@Jon Skeet: +1, mais la réponse ne sera pas compilée, la parenthèse de fermeture manquante après le smiley. – RedFilter
comment faire "vous trouvez alors où il serait inséré" efficacement, il peut nécessiter une recherche tableau entier – TalentTuner
@Saurabh: Non, c'est exactement ce que 'BinarySearch' fait déjà - il retourne l'index où la valeur est trouvée si elle est déjà là , ou '~ insertionPoint' sinon. –