我正在阅读Writing an Efficient Method to Check if a Number is Multiple of 3上的一篇文章。
此处说明的方法是采用二进制表示中数字的oddsum
和evensum
之间的差异。如果差异可被3整除,那么数字也是如此。我理解为什么我们这样做,但我无法理解为什么时间复杂度为O(log n)。
答案 0 :(得分:1)
递归前的操作数以O(log n)为界,因为这是表示n
所需的位数,以及随后将任何n
转换为所需的移位操作数零。以下递归接收最多n
的{{1}},因此其循环具有复杂度O(log(log n / 2))。由于该项小于初始循环复杂度(并且所有后续递归甚至更少),因此可以省略。确切地说,所有递归的 sum 必须小于要保持的初始循环,但我非常有信心(尽管我没有确切的证明),这就是这种情况。< / p>
答案 1 :(得分:0)
在递归之前的计数采用O(logN)并且它将输入减少到logn / 2,因此遵循定义以下的递归方程: -
T(n)= T(logn / 2)+ O(logn)
T(n)= logn + log(logn / 2)+ log(log(logn / 2)/ 2).....
忽视2
T(n)&lt; logn + log(logn)+ log(log(logn)).....
log * n给出的迭代日志在实际上收敛得非常快 log * n&lt; 5T(n)&lt; logn + log(logn)+ log2(n)+ log3(n)+ log4(n)&lt; 5 * LOGN
T(n)= O(logn)