Кубическими сплайнами - думаю оптимально будет.
Там поиск линейно делается:
//*************************************************************************/
//Подсчет значения интерполянты в заданной точке
//*************************************************************************/
double Interpolate(double x)
{
//double result;
int i=0;
while (KnotArray[i].x < x)
i++;
i--;
return Coef[i][0] + Coef[i][1]*(x-KnotArray[i].x) + Coef[i][2]*powf((x-KnotArray[i].x),2) + Coef[i][3]*powf((x-KnotArray[i].x),3);
}