仅使用位移加法和减法的对数时间整数除法
Posted
技术标签:
【中文标题】仅使用位移加法和减法的对数时间整数除法【英文标题】:Logarithmic time integer division using bit shift addition and subtraction only 【发布时间】:2017-09-20 15:34:36 【问题描述】:我被要求仅使用位移、加法和减法来实现具有对数时间复杂度的整数除法。
我可以看到如何处理 2 的幂的除数,但如何处理奇数除数,以使时间保持对数?
有可能吗?
编辑:一种在非对数但仍优于线性的时间复杂度内的方法也将受到欢迎。
谢谢
【问题讨论】:
据我所知,一般情况下不可能。除法最多可以像乘法一样有效,即 O(M(n)) 的时间复杂度,而基于 Schönhage-Strassen 的乘法的复杂度为 O(n log n log log n)。常数很大,所以这种方法通常只对数千位的操作数有意义。你的问题是理论上的吗?如果是这样,我建议在Computer Science Stackexchange 上提问。如果你有一个实际的应用程序(用例),你的操作数有多大? 嗨,这是一个装配练习。我认为下面建议的方式有对数时间。 以下答案中概述的方法的时间复杂度为 O(n)。 这取决于你选择的 n - 如果 n 是被除数,它是对数的(例如,40 亿需要 32 次移位),如果 n 是被除数中的位数,它是线性的,但是您已经记录了股息的日志以获取位数。 @Tony Lee 这不是传统的算术函数复杂性衡量方式。 【参考方案1】:这就像在纸上做长除法,但是是二进制的。您将除数中的位移入累加器,直到它至少与除数一样大,然后从累加器中减去除数并继续,直到您一直处理所有位,同时为每个移位记录一个 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)。
被除数的最高位移动到累加器的底部。 每次移动被除数/累加器时,结果都会移动。
被除数的值是时间的对数,而不是被除数的位数。
【讨论】:
太棒了。我设法在汇编中实现了它,它似乎有效。谢谢!【参考方案2】:我不知道为什么答案是“不可能的”。也许我不明白这个问题。理论上它是可能的,但是在支持并行计算的硬件上。在“普通”计算机中,创建和管理线程的成本很高。 假设我们有除法:
a/b = x
我们希望仅使用位移、加法和减法以对数时间计算 x。 所以我们正在寻找满足这一点的 x:
a = bx
可以通过二分查找找到它。 在二分查找的每一步中,我们必须进行一次乘法和一次比较。 乘法可以在对数时间内完成,因为我们可以做多项式的和。可以使用多项式线程数。 通过实现加法器电路(https://en.wikipedia.org/wiki/Adder_(electronics)),可以在对数时间内完成求和。 当然比较也可以在对数时间内完成。 因此,您可以使用多项式线程数进行对数时间除法。
【讨论】:
但是二进制搜索需要多项式的步数,不能并行:(.以上是关于仅使用位移加法和减法的对数时间整数除法的主要内容,如果未能解决你的问题,请参考以下文章