Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 代码的时间复杂度和输出_C_Algorithm_Time Complexity - Fatal编程技术网

C 代码的时间复杂度和输出

C 代码的时间复杂度和输出,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循环中的代

对我来说,分析以下代码的时间复杂度和输出是非常困难的。实际上,我甚至无法找到输出。我知道

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

一,

二,

十二,

三,

十三,

二十三

123


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
如果type
int
有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)