C 为什么1D奇偶校验日志的大O运行时是(n)?
因此,我正在从这个网站上阅读一些代码: 它展示了如何确定一个数字是否有奇偶校验。但是,我不明白为什么运行时效率是log(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
# 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)。