Может быть, позвольте мне изложить мою ситуацию в псевдо-C ++ - сначала код:
std:vector<double> sample(someFunctor f, double lower, double upper) {
double t = (lower + upper)/2;
double newval = f(t);
if (f(upper) - newval > epsilon)
subsample1 = sample(f, t, upper);
if (newval - f(lower) > epsilon)
subsample2 = sample(f, lower, t);
return concat(subsample2, newval, subsample1);
}
, где concat просто, ну, в общем, объединяет возвращаемые векторы.По сути, я выполняю выборку функции таким образом, чтобы между двумя сохраненными значениями функции была лишь небольшая разница.
Я не доволен изложенным выше способом, поскольку кажется, что на каждом рекурсивном шаге выделяется немного памяти (выделяйте два подвектора, затем объединяйте эти и другой элемент).Этот фрагмент кода должен работать в той части моего алгоритма, которая критична для производительности.Если upper - lower
довольно мало, оценка f
не займет много времени.
Итак, мои вопросы:
Видите ли вы умный способ использовать одну и ту же структуру данных во всех рекурсивных вызовах и просто заполнить текущие части этого вектора?(Помните, что количество необходимых оценок функций не известно заранее).Мысли об этом:
- Использование списка вместо вектора.Но я чувствую, что перестройка памяти не подходит для простого хранения двойных чисел.
- Сохраняйте дыры в векторе и поддерживайте другой вектор, говоря, какие записи заполнены.В конце рекурсивного вызова сдвиньте записи так, чтобы между
subsample
s и newval
не было дыр.Но теперь я переключаю копирование, переключаясь с дополнительной работой на второй вектор - возможно, это плохая идея.
Вы видите способ полностью избавиться от рекурсии?Однако для правильности важно, чтобы я использовал шаблон «разделяй и властвуй», изложенный выше.Функция f
интенсивно использует верхнюю и нижнюю границы и благодаря этому значительно повышает производительность.
Спасибо за ваши мысли.
В соответствии с запросом Space_C0wb0y позвольте мне попытаться перефразировать мою проблему.Возможно, первое объяснение было не очень ясным.
У меня есть некоторая функция (в математическом смысле), которую я хочу отобрать (например, оценить в определенных точках) в заданном интервале.
Предположим, что интервал равен [0,100].Я знаю значения функций в 0 и в 100. Может быть, это f(0)=0
и f(100) = 40
.Теперь я оцениваю функцию в средней точке интервала, которая равна 50. Скажем, моя функция возвращает f(50)=10
.Поскольку f(0)-f(50) <= 10
, мне не нужны дополнительные выборки в интервале [0,50].Однако мне нужны дальнейшие вычисления для интервала [50,100].Таким образом, на следующем (рекурсивном) шаге я оцениваю f(75)
.Теперь повторите рекурсивную логику.
В конце я хотел бы (два) вектора, дающие мне значения функции с соответствующими параметрами, подобными этим:
parameter = vector(0, 50, 56.25, 62.5, 75, 100)
value = vector(0, 10, 17.21, 25 34, 40)
Я ищу лучшее (как наиболее эффективно)подход к построению этих векторов рекурсивно.
Надеюсь, это прояснит ситуацию.