我的算法太慢

时间:2016-04-27 06:08:13

标签: algorithm

我有一个算法,用于整数x和一个起始整数i,使得1< i< x i的下一个值由i = floor(x / i) + (x mod i)计算。这一直持续到我们已经看到的i为止。

在JavaScript中(虽然这个问题与语言无关):

function f(x, i) {
    var map = {};
    while(!map[i]) {
        map[i] = true;
        i = Math.floor(x / i) + (x % i); // ~~(x / i) is a faster way of flooring
    }
    return i;
}

我可以证明我们最终会到达i我们已经看过的人,但我想知道:

  1. 是否有更有效的方法来计算下一个i
  2. (更重要的是)有没有办法计算第n i而没有经过循环n次?
  3. 只是为了澄清 - 我知道有更快的方法比使用JS哈希映射进行检查,并且该地板可以用其他语言的整数除法代替。我已经完成了这两个优化,但我把它们排除在外,试图让代码更容易理解。抱歉有任何困惑。

    提前致谢!

1 个答案:

答案 0 :(得分:3)

我认为主要的时间吃 - 地图。它使用一些散列函数(可能不简单)。如果i范围受到合理值的限制,最好使用位/布尔数组(或Javascript模拟)

第二个 - 两个部门。 Javascript中浮点数和整数是否明显不同?可以进行一次整数除法,找到带乘法和减法的模数(由于整数除法/模数定义的基本属性):

p = x \\ i
i = p + (x - p * i)
or
i = x - (x \\ i) * (i - 1)

注意:大多数处理器中的整数除法同时计算商和残差

mov eax, 17          //dividend
mov ecx, 3           //divisor
xor edx, edx         //zero
div ecx              //edx:eax pair divide by ecx
//now eax contains quotient 5, edx contains residue (modulus) 2

如果你可以在C中使用asm,或者有一些像delphi DivMod这样的函数,你可以更快地进行计算。