我被要求仅使用位移,加法和减法来实现具有对数时间复杂度的整数除法。
我可以看到如何处理2的幂的除数,但是我如何处理奇数除数,以便时间保持对数?
甚至可能吗?
编辑:一种在非对数但仍优于线性的时间复杂度下进行此操作的方法也将受到欢迎。
由于
答案 0 :(得分:3)
这就像在纸上进行长时间划分而是二进制。您将位从分频器移位到累加器,直到它至少与除数一样大,然后从累加器中减去除数,并继续直到您已经处理了所有位,同时为每个移位记录0并且减去和每次减去时都为1。
15/5 (1111/101)
dividend accumulator result
1111 0000 0 - can't subtract, shift
1110 0001 0 - can't subtract, shift
1100 0011 0 - can't subtract, shift
1000 0111 0 - can subtract, set 1
1000 0010 1 - can't subtract, shift
0000 0101 10 - can subtract, set 1
0000 0000 11 - we're done since we shifted 4 times
答案是3(11)。
被除数的最高位移入累加器的底部。 每次分红/累加器移位时,结果都会移位。
股息价值的时间对数,而不是股息的位数。
答案 1 :(得分:0)
我不知道为什么答案是“不可能的”。也许我不明白这个问题。理论上是可以实现的,但是在支持并行计算的硬件上。在“普通”计算机中,创建和管理线程的成本很高。 假设我们有除法:
a/b = x
我们希望仅使用位移、加法和减法以对数时间计算 x。 所以我们正在寻找满足这一点的 x:
a = bx
可以通过二进制搜索找到它。 在二进制搜索的每一步中,我们必须进行一次乘法和一次比较。 乘法可以在对数时间内完成,因为我们可以进行多项式求和。可以使用多项式线程数。 通过实现加法器电路 (https://en.wikipedia.org/wiki/Adder_(electronics)),甚至可以在对数时间内完成求和。 当然也可以在对数时间内进行比较。 因此,您可以使用线程的多项式数进行对数时间的除法。