分析这个算法(big-o)

时间:2013-07-26 22:43:30

标签: c combinatorics asymptotic-complexity

问题

这个算法在做什么? 0x01代表什么? m = m>>是什么意思? 1内在while循环?这个算法的大O是什么?

while(n>0)
{
     m = n;
     while(m)
     {
          if(m & 0x01)
          {
                c++;
          }
          m = m >> 1;
     }
}

尝试

  1. 通过查看@算法,我知道m是右移一个地方 (例如,如果m = 1010,m>>> 1 = 0101.这是正确的吗?)

  2. 因为有一个嵌套的while循环,并且因为每次迭代n次,我的猜测是这个算法是O(n ^ 2)。这是对的吗?

3 个答案:

答案 0 :(得分:0)

内循环计算m中“1”位的数量。 它的成本是O(log m),因为每次迭代都会将m的值减半,直到达到0.

(如果你认为m是一个固定大小的整数,比如32位,那么你可以说内循环是O(1),因为它总是最多32个操作,这是一个常数)

外部循环,正如一些人所指出的那样,永远不会完成,因为n永远不会改变。 (除非n为0)。

总的来说,这段代码是O(无穷大),它永远不会完成。

答案 1 :(得分:0)

What is this algorithm doing?对于n的值,n中的位数会添加到c

0x01代表值1。它被用作位掩码来检查m的最低位是否打开。如果是,则递增c。这是计数部分。 然后,m右移一次,将下一位向下移动到LSB(最低有效位)的位置。 while(m)等于m后,0将停止;也就是说,当m没有更多位时。

算法的复杂性取决于你使用n做什么。如果你递减它,那么你的算法是O(n),因为内部部分(while(m))是常量(因为整数中有一个最大位数,那可能是32)。

复杂性可能是O(n * 32),但由于常量取自Big-Oh表示法,因此最终得到O(n)

答案 2 :(得分:0)

嗯......首先,这个功能实际上永远不会退出。开始时的while( n > 0 )将始终保持为真,因为“n”永远不会在循环内被修改。如果你试图运行它将会成为一个问题。

但要回答你的问题:

m & 0x01基本上会检查'm'是否为奇数。它通过在m0x01之间执行按位操作来完成此操作。值0x01是值1的十六进制表示。在它们之间执行&操作将导致每个位相互比较(二进制),并且当且仅当两个匹配位的值都为1时才设置为1。有关更多信息,请对二进制和十六进制表示以及按位运算符进行一些研究。

>>是另一个按位运算符,它将值中的所有位移位一个点。在十进制世界中,这相当于除以2.因此该行导致m的值在每次到达该行代码时被除以2。有<<的镜像运算符用于在相反方向上移位位,而等于乘以2。

希望这有帮助!