Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Algorithm foo算法的复杂性_Algorithm_Computer Science_Complexity Theory - Fatal编程技术网

Algorithm 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)的θ吗?我不确定是否有一种“快速而肮

我有一个我解决不了的问题。。这个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)的θ吗?

我不确定是否有一种“快速而肮脏”的方法,但你可以使用古老的好数学。没有奇特的定理,只有简单的方程式


在递归的第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)