我正在研究一种分而治之的算法(事实上,这是一种对多个输入点进行曲线拟合的算法)。对于“划分”部分,我需要计算每个点的误差项,如果误差超过给定阈值,我希望在该点分割曲线并分别处理输入的左右部分。一个简单的循环就可以解决问题;但从当前部分的中间开始并向外工作对我来说是有利的。 (澄清一下:如果我确实找到一个误差太大的点,我会递归调用并为左右部分生成单独的曲线 - 如果所有点都在阈值内,则我的曲线拟合并返回)。
经过一番绞尽脑汁后,我想出了这个(点在一个数组中,当前部分来自startIndex
to 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)