【发布时间】:2012-03-17 03:01:04
【问题描述】:
该算法通过在下限和上限之间迭代来找到给定值n,类似于二分查找。我该如何改进这个算法?一些细节。 n 的值几乎总是小于 1.0,但这不是边界条件。但是,它永远不会小于 0。
def approx_value(n, lower_bound, upper_bound, precision = 0.001):
approx = (lower_bound + upper_bound) / 2.0
while (abs(approx - n) > precision):
if n > approx:
lower_bound = approx
else:
upper_bound = approx
approx = (lower_bound + upper_bound) / 2.0
return approx
def approx_value_no_bounds(n, precision = 0.0001):
approx = 1.0
while (abs(approx - n) > precision):
if approx > n: #decrease volatility
return approx_value(n, 0.0, approx)
else:
approx *= 2
return approx
我知道这看起来很奇怪,因为 n 的值已经提供,但算法不完整。基本上,n 是一个复杂方程的解,无法以封闭形式求解approx,所以我正在迭代地做它。最终,该算法会将使用approx 时的函数值与n 的值进行比较,并返回approx 是否足够接近输入变量。
我希望将运行时间保持在O(log(n)),这就是为什么我在二进制搜索之后对其进行建模的原因,尽管只是因为不一定立即知道上限。
【问题讨论】:
-
试试看。该代码似乎应该可以工作。
-
代码完美运行,但我想确保我没有错过任何基本优化。我知道过早的优化很危险,但我只想知道我没有遗漏任何对更有经验的程序员来说显而易见的东西。
-
如果您担心速度,请尝试
PyPy(它是 Python 的直接替代品,但使用 JIT 编译器进行了优化)。如果您想更快,请尝试使用numpy并使用numpys 函数优化您的代码。更好的是,尝试用 C 或 C++ 编写代码。 -
这一行中的
guess是什么:if guess > n:? (只是一个错字?:)) -
看起来你想要做的是找到一个函数的逆。你能计算导数吗?如果是这样,您可以大大提高性能。