C 代码的时间复杂度和输出
对我来说,分析以下代码的时间复杂度和输出是非常困难的。实际上,我甚至无法找到输出。我知道 1Q1)我认为这是一个与Q3类似的问题 Q2)for循环内的代码将执行多少个整数“i”有1位。如果N=N,“i”在1到2^N-1的范围内。这意味着你可以很容易地这样想 有n个位插槽。”我将迭代除0以外的n位插槽可以生成的所有情况 例如,在N=3的情况下,有3位插槽OOO和'i'将迭代除0以外的所有情况。001, 010, 011, 100, 101, 110, 111. 正如我提到的,for循环中的代码将从最低索引开始执行,并在“1”位打开时打印一个数字 N=3 一, 二, 十二, 三, 十三, 二十三 123C 代码的时间复杂度和输出,c,algorithm,time-complexity,C,Algorithm,Time Complexity,对我来说,分析以下代码的时间复杂度和输出是非常困难的。实际上,我甚至无法找到输出。我知道 1Q1)我认为这是一个与Q3类似的问题 Q2)for循环内的代码将执行多少个整数“i”有1位。如果N=N,“i”在1到2^N-1的范围内。这意味着你可以很容易地这样想 有n个位插槽。”我将迭代除0以外的n位插槽可以生成的所有情况 例如,在N=3的情况下,有3位插槽OOO和'i'将迭代除0以外的所有情况。001, 010, 011, 100, 101, 110, 111. 正如我提到的,for循环中的代
Q3)O(N*2^N)。我认为它太大,无法计算。关于外循环和
if
测试的迭代次数,您的分析基本上是正确的。只要N
使1Q1)If条件将被测试N*(2^N-1)次
if主体将针对i中的每个设定位执行
在本例中,我取[1,8]范围内的值。在此范围内,3个值设置了1位;3个值设置了2位;1值设置了3位。您有3*1+3*2+1*3=12个if body执行
对于N=N>0,您可以想象有多少不同数量的长度N正好设置了k位。这是n个元素在k组中的组合,即牛顿二项式(n除以k)
因此,对于[0,n]中的i,执行(n)=和(i*(n除以i))
这是执行(n)=n*2^(n-1)
证明:
[0,n]中i的和(i*(n/i))=在[0,n/2]中i的和(i*(n/i)+(n-i)*(n/n-i))
但是(n比i)=(n比n-i)
因此,我们可以将前面的表达式写成
求和((i+(n-i))*(n对i))=n*求和(n对i)对于[0,n/2]中的i
我们知道[0,n]=2^n中所有i的和(n除以i)
由于它是对称的,所以一半范围内的和为2^n/2=2^(n-1)
所以,
执行(n)=n*2^(n-1)
例如,执行(3)=3*2^2=12
问题2)
输出是数组中元素的所有可能组合,不考虑顺序,不包括空集
数组大小为N,程序生成长度为N的所有可能的二进制数,除了零
它将位位置与数组位置匹配,并在与设置位对应的位置打印出数组的值。当然,如果对所有可能的N位值都这样做,那么就有了所有可能的集合位组合,也就有了所有可能的数组元素组合(不包括空集合)
您可以通过将i初始化为零来包含空集,但只会得到一个空行
程序如何将设置位与数组位置匹配
Ok j从0变为N-1,因此扫描所有位/阵列位置
要检查位j的值,请计算i的当前值和掩码之间的位and,掩码在位置j处仅包含一个1,在所有其他位置包含零。因此,按位and将导致除j以外的所有位置为零,并且i的位置j中的位的实际值为零
1定义N 3
。。。所以1这是“N位左移1”是的,这是一个打字错误。更正。这就是我被否决的原因吗?也许不是,但“产出是什么?”真的吗?只需自己运行代码请在投票前告诉原因我真的想在这里问我的疑问:(这是胡说八道。“i”范围1能否请你再解释一下如果成功执行了多少次?我无法理解未定义行为的条件,即n字符位
,在
中定义的是一个字节中的位数,sizeof(int)
是int
CHAR\u BIT*sizeof(int)中的字节数
是一个int
中的总位数,包括符号位。在大多数当前的体系结构中,这是8*4=32。通过其类型或更多类型中的值位调用未定义的行为,将常量1
(其类型为int
)左移。因此,示例中N
的最大值为de>30
如果typeint
有32位。@GouthamMuraleedharan:谢谢你坚持,答案是错误的。我用我希望更清楚的分析重写了它。答案比我最初想象的要简单。
#include <stdio.h>
#define N 3
int main() {
int array[N] = {1,2,3};
int i,j;
for ( i=1; i<(1<<N); i++) {
for( j=0; j<N; j++) {
if((1<<j)&i) {
printf("%d", array[j]);
}
}
printf("\n");
}
return 0;
}
1<<N
if((1<<j)&i)