Chr*_*ash 10 c c++ java algorithm
我正在研究一种分而治之的算法(事实上,这种算法可以对多个输入点进行曲线拟合).对于"除法"部分,我需要计算每个点的误差项,如果误差超过给定的阈值,我希望在该点分割曲线并分别处理输入的左右部分.一个简单的循环就可以了; 但对我来说,从当前部分的中间开始并向外工作将是有利的.(澄清一下:如果我确实发现了一个误差太大的点,我会递归调用并为左右两部分生成单独的曲线 - 如果所有的点都在阈值范围内,那么我的曲线适合我返回).
经过一番头疼之后,我想出了这个(点数在一个数组中,当前部分从包含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
}
Run Code Online (Sandbox Code Playgroud)
换句话说,从中间开始,前进一个指数,前进两个,前进三个,后退四个......它有效,我确信它有效,但是我觉得应该有一个更清洁的方法来做到这一点特别是,我最终必须检查Java语言规范,以确保for update表达式中的语句按顺序进行评估(即使它不是C/C++中的序列运算符).
感谢任何想法.有更干净的方式吗?
jon*_*tro 14
这将是更可读的imho
for (int q=0; q < steps; q++) {
int index = i + ( q% 2 == 0 ? q/2 : -(q/2+1)); //index lookup here
}
Run Code Online (Sandbox Code Playgroud)