【发布时间】:2009-09-15 21:40:44
【问题描述】:
我正在处理一系列 Y 值相同但 X 值不同的点。我通过将 X 加一来遍历这些点。例如,我可能有 Y = 50,X 是从 -30 到 30 的整数。我的算法的一部分涉及找到从每个点到原点的距离,然后进行进一步处理。
分析后,我发现距离计算中的 sqrt 调用占用了我大量的时间。有没有迭代的方法来计算距离?
换句话说:
我想有效地计算:r[n] = sqrt(x[n]*x[n] + y*y))。我可以保存上一次迭代的信息。每次迭代都会通过增加 x 来改变,所以 x[n] = x[n-1] + 1。我不能使用 sqrt 或 trig 函数,因为它们太慢了,除了在每个扫描线的开头。
我可以使用近似值,只要它们足够好(误差小于 0.l%)并且引入的错误是平滑的(我无法将其放入预先计算的近似值表中)。
附加信息: x 和 y 总是介于 -150 和 150 之间的整数
我明天将尝试几个想法,并根据最快的答案标记最佳答案。
结果
我做了一些计时
- 距离公式:16 ms/迭代
- Pete 的交叉解决方案:8 毫秒/迭代
- wrang-wrang 预计算解:8ms / 迭代
我希望考试能在两者之间做出决定,因为我喜欢这两个答案。我会选择 Pete's,因为它使用的内存更少。
【问题讨论】:
-
我的第一个问题是:你真的需要计算 r,而不是 r^2,因为 (x+1)^2 = x^2 +2x + 1,这对更新。
-
是的,我确实需要计算 r,而不是 r^2。为什么人们一直问我这个?
-
...因为这就是让它变得困难的原因:-)您实际上是使用所有这些 r 值,还是只使用其中一些?如果我站在你的立场上,那我就会集中精力。
-
... 8 毫秒,60 点 = 133us / 点。这对我来说听起来很重要。
-
每次迭代都会处理数百条这样的扫描线。
标签: optimization mathematical-optimization