Я работаю над алгоритмом "разделяй и властвуй" (на самом деле, тот, который наводит кривые на несколько входных точек). Для части "divide" мне нужно рассчитать коэффициент ошибки для каждой точки, и если ошибка превышает заданный порог, я хочу разбить кривую в этой точке и обработать левый и правый участки входа отдельно. Простая петля делает трюк; но мне было бы полезно начать в середине текущего раздела и работать наружу. (Чтобы уточнить: если я нахожу точку, чья ошибка слишком велика, я рекурсивно вызываю и генерирую отдельные кривые для левого и правого секций - если все точки находятся в пределах порога, тогда моя кривая подходит и я возвращаюсь).
После небольшого поцарапания головы я придумал это (точки находятся в массиве, а текущий раздел от startIndex
до endIndex
включительно):
int steps = (endIndex+1-startIndex);
int i = (startIndex+endIndex)>>1;
int stepdir = 1;
for(int q=0; q<steps; q++, i+=stepdir*q, stepdir=-stepdir)
{
// test point i here and return early if error exceeds threshold
}
Другими словами, начиная с середины, пройдите один указатель вперед, два назад, три вперед, четыре назад... Это работает, и я уверен, что он эффективен, но мне кажется, что должен быть более чистый способ для этого, в частности, мне пришлось проверить спецификацию языка Java, чтобы убедиться, что операторы в выражении for update действительно оценивали последовательно (хотя это не оператор последовательности, как в C/С++).
Любые идеи с благодарностью оценили. Есть ли более чистый способ?