我正在研究一种分治算法(实际上是曲线拟合到多个输入点).对于“分割”部分,我需要计算每个点的误差项,如果误差超过给定阈值,我希望在该点分割曲线,并单独处理输入的左侧和右侧部分.一个简单的循环就是诀窍;但是,从现在的这一部分开始,向外工作是有利的. (要澄清:如果我找到一个错误太大的点,我递归地调用并生成左右两个部分的单独曲线 – 如果所有点都在阈值内,那么我的曲线适合我返回).
经过一点头痛之后,我想出了这一点(点数在数组中,当前部分是从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语言规范,以确保更新表达式中的语句按顺序进行评估(即使不是C/C++中的序列运算符).
任何想法感激不尽.有没有更清洁的方法?
解决方法
这将是更可读的imho
for (int q=0; q < steps; q++) { int index = i + ( q% 2 == 0 ? q/2 : -(q/2+1)); //index lookup here }
编辑:在索引查找中实现了一个错误