Algorithm foo算法的复杂性
我有一个我解决不了的问题。。这个foo算法的复杂性是什么Algorithm foo算法的复杂性,algorithm,computer-science,complexity-theory,Algorithm,Computer Science,Complexity Theory,我有一个我解决不了的问题。。这个foo算法的复杂性是什么 int foo(char A[], int n, int m){ int i, a=0; if (n>=m) return 0; for(i=n;i<m;i++) a+=A[i] return a + foo(A, n*2, m/2); } 所以。。我猜它是log(n)*内部for循环的某个东西。。我不确定是log(n)还是什么 它可能是log^2(n)的θ吗?我不确定是否有一种“快速而肮
int foo(char A[], int n, int m){
int i, a=0;
if (n>=m)
return 0;
for(i=n;i<m;i++)
a+=A[i]
return a + foo(A, n*2, m/2);
}
所以。。我猜它是log(n)*内部for循环的某个东西。。我不确定是log(n)还是什么
它可能是log^2(n)的θ吗?我不确定是否有一种“快速而肮脏”的方法,但你可以使用古老的好数学。没有奇特的定理,只有简单的方程式
在递归的第k级(
k
从零开始),循环将有~n/(2^k)-2^k
迭代。因此,对于0我不确定是否有一种“快速而肮脏”的方法,但你可以使用旧的好数学方法,循环迭代的总量将是S=sum(n/2^i)-sum(2^i)
。没有奇特的定理,只有简单的方程式
在递归的第k级(k
从零开始),循环将有~n/(2^k)-2^k
迭代。因此,对于0,循环迭代的总量将是S=sum(n/2^i)-sum(2^i)
根据n和X=m-n重写:
int foo(char A[], int n, int X){
int i, a=0;
if (X < 0) return 0;
for(i=0;i<X;i++)
a+=A[i+n]
return a + foo(A, n*2, (X-3n)/2);
}
注意到惩罚随X增加而增加,随n减少
T(X, n) < X + T(X/2, n)
并将其插入主定理,求出U(X)=O(X)-->复杂性为O(m-n)这是主定理的一个伟大应用:
根据n和X=m-n重写:
int foo(char A[], int n, int X){
int i, a=0;
if (X < 0) return 0;
for(i=0;i<X;i++)
a+=A[i+n]
return a + foo(A, n*2, (X-3n)/2);
}
注意到惩罚随X增加而增加,随n减少
T(X, n) < X + T(X/2, n)
把这个插入到主定理中,求出U(X)=O(X)-->复杂性是O(m-n)不,这是我今天做的一个考试,我试图理解我是否做对了(我怀疑…)拜托,也许在这里问这个问题不太合适,但是我在cstheory.stackexchange上问过,他们说我应该在这里问。我不认为在学校作业中提问有什么问题,我认为这只是一种礼节(我相信)很清楚地表明区分大小写是不好的(a
和a
都有定义),因为这会降低代码的可读性,代码搜索结果的相关性等。此外,m
的值应在函数本身内部进行计算,以便进行干式编码。然后,当你不知道它的值时,你正在除以一个整数。接下来,假设这是C,那么a+=a[i]
行上有一个语法错误。最后但并非最不重要的一点是,第一次没有检查n
和m
值的大小,因此当m
很大而n
很小时,很容易发生堆栈溢出。错误代码。真不敢相信这居然出现在考试上。啊哈!你说得对!这比其他的都好。。这就是我们所拥有的…不,这是我今天做的一次考试,我试图理解我是否做对了(我怀疑…)拜托,也许在这里问不太合适,但我已经在cstheory.stackexchange上问过了,他们说我应该在这里问。我认为在学校作业中问问题没有问题,这只是礼节而已(我认为)非常清楚地表明它有助于区分大小写是不好的(a
和a
都有定义)由于这会降低代码可读性、代码搜索结果的相关性等。此外,对于干编码,m
的值应该在函数本身内部进行计算。然后,您在不知道其值的情况下除以一个整数。接下来,假设这是C,则a+=a[i]上存在语法错误
行。最后但并非最不重要的一点是,第一次没有检查n
和m
的值的大小,因此当m
很大而n
很小时,很容易发生堆栈溢出。糟糕的代码。不敢相信这会出现在考试中。啊哈!你是对的!与其他人相比,这是相当好的。仍然没有这就是我们所拥有的。@luca我意识到并非所有人都接触过非正式称为CLR的介绍性算法文本:@luca我意识到并非所有人都接触过非正式称为CLR的介绍性算法文本:
T(X, n) < X + T(X/2, n)
U(X) = X + U(X/2)