【问题标题】:What is the fastest way to increase the value of a variable until it matches the value of another variable in Javascript?增加一个变量的值直到它与 Javascript 中另一个变量的值匹配的最快方法是什么?
【发布时间】:2019-04-10 05:26:32
【问题描述】:

我有一个代码将变量“x”的值增加 0.01,并进行一些计算,直到它与另一个变量“y”的值匹配。当“X”增加时,“y”不是线性减少。

找到“x”和“y”相同或最接近的值的最佳逻辑是什么?将“x”增加 0.01 就可以了,但由于我真的很菜鸟,我想有一个聪明的方法。

提前致谢

【问题讨论】:

  • 每次增加x时检查x >= y
  • 蛮力是要走的路
  • 计算出y 的下降率并在数学上将它们等同起来。
  • 没有看到代码答案是菠萝
  • 如果我正确理解了这个问题,那么任何寻根算法都应该可以工作。

标签: javascript algorithm logic matching


【解决方案1】:

如果我理解正确,您想找到一个x,这样f(x) = y 对应一个常量y,而f(x) 是非线性的,但没有其他输入。这是正确的吗?

让我们进一步假设f(x) 严格增加或减少(即:它不会上下摆动并在几个xs 处交叉y)。然后,您可以使用标准的二进制搜索来查找单个截距:

  1. 寻找价值

    • x_lo 这样f(x_lo) < y
    • x_hi 这样f(x_hi) > y
  2. 查看中点m = (x_hi + x_lo) / 2

    • 如果f(m) < y,则使用x_lo = m,并重复此步骤
    • 如果f(m) > y,则使用x_hi = m,并重复此步骤
    • 如果f(m) == y,或者它足够接近你的需要,你就完成了!

找到x_hix_lo的初始值的简单方法是测试f(any)的值,并根据它是更大还是分配x_hi=anyx_lo=any 小于y。一旦你有一个极端,你可以通过快速增加或减少它来快速找到另一个。假设我们有x_lo,我们可以用x_hi = x_lo*(2^i) 测试i=1, 2, 3, ...^ 代表取幂。

如果f(x) 在多个点与y 交叉,这不起作用 - 因为它可以直接跳过第 2 步中重要的x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多