而N位整数a> 1, a = a / 2
我当时认为它是log(n),因为每次你通过while循环时你都会将a除以2,但我的朋友认为它是2 logn(n)。
答案 0 :(得分:0)
显然,您的算法位于 big-Theta(log(a)) ,其中 a 是您的编号
但据我了解您的问题,您希望根据数字的位数了解渐近运行时间
这真的很难说,取决于你的号码:
假设您有一个n位整数,最高有效位为1.您必须将其除以n次,以获得小于1的数字。
现在让我们看一个整数,其中只有最小的siginficant位是1(因此它等于十进制系统中的数字1)。那里你只需要一个师。
所以我想说,它平均需要n / 2才能 big-Theta(n) 其中 n 是您的号码的位数。最坏的情况也是 big-Theta(n) ,最好的情况是 big-Theta(1) 强>
注意:在二进制系统中将数字除以2具有与在十进制系统中将数字除以10相似的效果
答案 1 :(得分:0)
通过以二进制表示法取数并移位,可以有效地实现将整数除以2。在最坏的情况下,所有的位都设置为你必须移位(n-1)位用于第一个除法,(n-2)位用于第二个等等,直到你在最后一次迭代中移位1位并且找到数字变得等于1,此时你就停止了。这意味着您的算法必须移位1 + 2 + ... +(n-1)= n(n-1)/ 2位,使您的算法O(n^2)
为输入位数。
使a
具有相同值的更有效算法是a = (a == 0 ? 0 : 1)
。这会在线性时间内生成相同的答案(等式检查在位数上是线性的)并且它起作用,因为如果a = 0
最初为零,则代码将只留下a
;在所有其他情况下,最高位最终在单位的位置。