我正在研究一种分而治之的算法(实际上,一种对多个输入点进行曲线拟合的算法)。对于“划分”部分,我需要为每个点计算一个误差项,如果误差超过给定的阈值,我希望在该点分割曲线并分别处理输入的左右部分。一个简单的循环就可以解决问题;但是从当前部分的中间开始向外工作对我来说是有利的。 (澄清一下:如果我确实找到了一个误差太大的点,我会递归调用并为左右部分生成单独的曲线 - 如果所有点都在阈值内,那么我的曲线会拟合并返回)。
经过一番摸索之后,我想到了这个(点在一个数组中,当前部分是从 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/