Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么1D奇偶校验日志的大O运行时是(n)?_C_Bit_Parity - Fatal编程技术网

C 为什么1D奇偶校验日志的大O运行时是(n)?

C 为什么1D奇偶校验日志的大O运行时是(n)?,c,bit,parity,C,Bit,Parity,因此,我正在从这个网站上阅读一些代码: 它展示了如何确定一个数字是否有奇偶校验。但是,我不明白为什么运行时效率是log(n)。以下是代码供参考: # include <stdio.h> # define bool int /* Function to get parity of number n. It returns 1 if n has odd parity, and returns 0 if n has even parity */ bool getParity

因此,我正在从这个网站上阅读一些代码:

它展示了如何确定一个数字是否有奇偶校验。但是,我不明白为什么运行时效率是log(n)。以下是代码供参考:

# include <stdio.h>
# define  bool int

/* Function to get parity of number n. It returns 1
   if n has odd parity, and returns 0 if n has even
   parity */
bool getParity(unsigned int n)
{
    bool parity = 0;
    while (n)
    {
        parity = !parity;
        n      = n & (n - 1);
    }        
    return parity;
}
#包括
#定义布尔整数
/*函数以获取数字n的奇偶性。它返回1
如果n具有奇数奇偶校验,如果n具有偶数奇偶校验,则返回0
平价*/
布尔奇偶校验(无符号整数n)
{
布尔奇偶性=0;
while(n)
{
奇偶性=!奇偶性;
n=n&(n-1);
}        
返回奇偶性;
}

运行时效率为O(log(n)),其中
n
是您传入的整数的值。然而,这是使用O表示法的一种非传统方式

更常见的是,O表示法是根据输入的大小以位表示的(表示输入所需的位的#),在这种情况下,输入的大小是k=O(log2(n)),运行时是O(k)

(更准确地说,运行时是Θ(s),其中s是在n中设置的位数,尽管这假设位操作是O(1))。

这样看

如你所见,我们使用这个方法计算1的个数,循环将精确地运行n的二进制表示中的1(1)(比如p)位的个数

因此复杂性为Θ(p)

由于用于表示n的最大位数是log2(n),因此上界渐近id O(log2(n))。

那么k是总位数的#还是设置位数的#?我假设是设定位?从技术上讲是O(s),其中s是设定位的数量。然而,值得注意的是,如果将该算法扩展到任意大的整数,实际上将是O(s logn),因为按位操作是任意大整数上的O(logn)。