Tengo una matriz ordenada de aproximadamente 500,000 ints. Actualmente selecciono el índice correcto tomando las diferencias entre mi int objetivo y todos los elementos, y luego ordenando por la diferencia mínima usando LINQ (muy ineficiente).Encuentra el índice más cercano por diferencia con BinarySearch
Me gustaría poder hacer algo muy similar con BinarySearch.
Dado:
Pos Value
0 10
1 20
2 30
4 50
5 60
Si quiero encontrar el valor más cercano para el valor 24 Me gustaría que el índice volvió a ser 1.
Dado:
int index = myArray.BinarySearch(values, 24);
if (index < 0)
index = ~index;
Esto devuelve 2 ya que le da al siguiente elemento en línea, en lugar de al más cercano. ¿Es posible escribir un IComparer que devuelva el índice más cercano?
Dados los valores:
Value ExpectedReturn
20 1
24 1
25 2
26 2
30 2
estoy tratando de hacer esto lo más rápido posible. Todo lo que he hecho hasta ahora en LINQ ha sido inferior a lo que creo que se puede lograr con una búsqueda binaria bien hecha. Gracias por la aportación.
@Jon Skeet: +1, pero la respuesta no se compila, falta el corchete de cierre después de la carita. – RedFilter
cómo hacer "a continuación, encuentre dónde se insertaría" de manera eficiente, puede requerir buscar toda la matriz – TalentTuner
@Saurabh: No, eso es exactamente lo que 'BinarySearch' ya hace - devuelve el índice donde se encuentra el valor si ya está allí , o '~ insertionPoint' de lo contrario. –