这与Check if one integer is an integer power of another上的问题相同,但是我想知道解决此问题的方法的复杂性。
给定一个整数n
,给一个整数m
和另一个整数n = m^p
是p
。请注意,^
是幂运算,而不是xor
。
有一个简单的O(log_m n)解决方案,该解决方案基于将n
反复除以m
直到其为1或存在非零余数。
我正在考虑一种受二进制搜索启发的方法,我不清楚在这种情况下应如何计算复杂度。
基本上,您从m
开始,然后转到m^2
,然后依次到m^4
,m^8
,m^16
等。
找到m^{2^k} > n
时,检查由m^{2^{k-1}}
和m^{2^k}
界定的范围。这个解决方案是O(log_2 (log_m(n)))
吗?
如果我做类似的事情,与此有关
m^2 * m^2
vs。
m * m * m * m
这两个是否具有相同的复杂性?如果他们这样做,那么我认为我想出的算法仍然是O(log_m (n))
答案 0 :(得分:0)
不完全是。首先,让我们假设乘法是O(1)
,乘幂a^b
是O(log b)
(使用平方运算)。
现在,使用将指数p_candidate
加倍然后进行二进制搜索的方法,您可以在p
个步骤中找到真实的log(p)
(或者观察到p
不存在)。但是在二进制搜索中,每次尝试都需要您计算m^p_candidate
,它受m^p
的限制,假设O(log(p))
。因此,总体时间复杂度为O(log^2(p))
。
但是我们要用输入n
和m
来表示时间复杂度。从关系n = m^p
中,我们得到p = log(n)/log(m)
,因此得到log(p) = log(log(n)/log(m))
。因此,总体时间复杂度为
O(log^2(log(n)/log(m)))
如果您想摆脱m
,则可以使用来提供更宽松的上限
O(log^2(log(n)))
,它与O(log(log(n)))
接近,但不完全相同。
(请注意,由于所有对数函数仅相差一个常数,因此您始终可以省略O表示形式的对数底数。)
现在,有趣的问题是:此算法是否优于O(log(n))
的算法?我还没有证明,但是我可以肯定O(log^2(log(n)))
在O(log(n))
中是这种情况,反之亦然。有人愿意证明吗?