我正在研究分而治之算法(实际上是一种对许多输入点进行曲线拟合的算法)。对于“除法”部分,我需要为每个点计算一个误差项,如果误差超过了给定的阈值,我希望在该点处分割曲线并分别处理输入的左右部分。一个简单的循环就可以解决问题。但对我来说,从当前部分的中间开始并向外进行将是有利的。 (为澄清起见:如果我发现误差太大的点,则递归调用并为左右部分生成单独的曲线-如果所有点都在阈值之内,则我的曲线拟合并返回)。
经过一番苦思冥想之后,我想到了这一点(这些点位于一个数组中,当前部分是从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/C++中那样是序列运算符)。
任何想法表示感谢。有没有更清洁的方法?
最佳答案
这将是更具可读性的恕我直言
for (int q=0; q < steps; q++) {
int index = i + ( q% 2 == 0 ? q/2 : -(q/2+1)); //index lookup here
}
关于java - 从中间向外遍历数组的算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6837990/