Сколько стоит "много раз"? Миллион?
Какие функции можно вводить? Можем ли мы предположить, что они непрерывны?
Вы пытались измерить, насколько хорошо работает ваш код?
(Извините, начал с вопросов!)
Вы можете попробовать один из двух подходов (или оба), кратко описанных ниже (возможно, их гораздо больше):
1) Разобрать деревья.
Вы можете создать дерево разбора. Затем выполните то, что делает большинство компиляторов, чтобы оптимизировать выражения, свертывание констант, исключение общих подвыражений (чего можно достичь, связав вместе поддеревья общих выражений и кэшируя результат) и т. Д.
Тогда вы можете использовать ленивые методы оценки, чтобы избежать целых поддеревьев. Например, если у вас есть дерево
*
/ \
A B
где A оценивается в 0, вы можете полностью избежать оценки B, поскольку вы знаете результат равен 0. С RPN вы проиграете в ленивой оценке.
2) Интерполяция
Предполагая, что ваша функция непрерывна, вы можете приблизить ее с высокой степенью точности, используя Полиномиальная интерполяция . Таким образом, вы можете выполнить сложное вычисление функции несколько раз (основываясь на выбранной вами степени полинома), а затем быстро выполнять полиномиальные вычисления в течение остального времени.
Чтобы создать начальный набор данных, вы можете просто использовать подход 1 или просто придерживаться своего RPN, поскольку вы будете генерировать только несколько значений.
Так что, если вы используете интерполяцию, вы можете оставить свой RPN ...
Надеюсь, это поможет!