Algorithm 多重递归算法的时间复杂度

Algorithm 多重递归算法的时间复杂度,algorithm,recursion,time-complexity,Algorithm,Recursion,Time Complexity,我试图了解以下算法的时间复杂性: static int g(int[] a) { return g(a, 0, a.length-1); } static int g(int[] a, int i, int j) { if(i == j) return a[i]; int onefourth = (j+1-i)/4; return g(a, i, i+onefourth) + g(a, i+onefourth+1, j); } 这是我的尝试: 算法g(int[]a,int i

我试图了解以下算法的时间复杂性:

static int g(int[] a) {
  return g(a, 0, a.length-1);
}

static int g(int[] a, int i, int j) {
  if(i == j) return a[i];
  int onefourth = (j+1-i)/4;
  return g(a, i, i+onefourth) + g(a, i+onefourth+1, j);
}
这是我的尝试:


算法g(int[]a,int i,int j)将数组a的维数除以4,并通过多次递归递归调用自身。我可以写出下面的递归方程T(n)=T(n/4)+T(3n/4)+c=…=T(n/4^k)+T(3n/4^k)+kc。在这里,我很难选择k的值。有人能帮我吗?

我不知道你学到了什么技巧,但我知道如何从零开始解决这个问题

划分问题时,将递归调用的成本按大小比例分摊到较低级别。然后问一个问题,到底什么是可以分配给底部任何值的最大值

这就是我的意思

如果你看的是长度范围
1
,你会有一些固定成本
c

如果您查看的是长度
2
的范围,那么对于
c+r/2
的每个元素的成本,将有一个常数递归成本
r
平均分配

如果要查看长度范围
3
,第一个元素的成本将为
c+r/3
,但后一个元素对首先在顶层获得
2/3r
,然后将其拆分为2,再加上另一个递归成本,总成本为
c+r/2+r/3

等等

现在是挑战。可以归因于特定调用的最大递归代价是什么?链中某个位置的最坏情况是其级别为
r
,其上级别为
3/4r
,其上级别为
(3/4)^2r
,依此类推。你能找到一个上限吗

你能把这个上限变成底部单个要素的成本上限吗


将这个界限乘以元素的数量,你就得到了你的
O(n)

我不知道你学到了什么技巧,但我知道如何从零开始解决这个问题

划分问题时,将递归调用的成本按大小比例分摊到较低级别。然后问一个问题,到底什么是可以分配给底部任何值的最大值

这就是我的意思

如果你看的是长度范围
1
,你会有一些固定成本
c

如果您查看的是长度
2
的范围,那么对于
c+r/2
的每个元素的成本,将有一个常数递归成本
r
平均分配

如果要查看长度范围
3
,第一个元素的成本将为
c+r/3
,但后一个元素对首先在顶层获得
2/3r
,然后将其拆分为2,再加上另一个递归成本,总成本为
c+r/2+r/3

等等

现在是挑战。可以归因于特定调用的最大递归代价是什么?链中某个位置的最坏情况是其级别为
r
,其上级别为
3/4r
,其上级别为
(3/4)^2r
,依此类推。你能找到一个上限吗

你能把这个上限变成底部单个要素的成本上限吗


将这个界限乘以元素的数量,你将得到你的
O(n)

T(n/4)+T(3n/4)+c=…=T(n/4^k)+T(3n/4^k)+kc
-这是不正确的,试着想想为什么。T(n)=T(n/4)+T(3n/4)+c只是一个方程,如果用n代替n/4,会出现更高的幂,这就是为什么它首先是一个递归方程。现在对我来说,如果你能用代换法(T(n)=O(nlogn))来解它,你就可以证明它是O(nlogn)。@有些人基本上代换任何函数都会满足方程-O(n),O(n^2),O(sqrt(n))等等所有的工作。@meowgoethedog不是所有的函数。你应该证明存在满足T(n)@SomeDude的值,你知道正确的答案是
O(n)
,而不是
O(n log(n))
T(n/4)+T(3n/4)+c=…=T(n/4^k)+T(3n/4^k)+kc
-这是不正确的,试着想想为什么。T(n)=T(n/4)+T(3n/4)+c只是一个方程,如果用n代替n/4,会出现更高的幂,这就是为什么它首先是一个递归方程。现在对我来说,如果你能用代换法(T(n)=O(nlogn))来解它,你就可以证明它是O(nlogn)。@有些人基本上代换任何函数都会满足方程-O(n),O(n^2),O(sqrt(n))等等所有的工作。@meowgoethedog不是所有的函数。你应该证明存在满足T(n)@SomeDude你知道正确答案是
O(n)
,而不是
O(n log(n))
?非常感谢。简而言之,你只考虑每个级别最昂贵的递归调用,在这种情况下,G(a,i+OnFeulth+ 1,j)。非常感谢。简而言之,您只考虑了每个级别的最昂贵的递归调用,在这种情况下,G(a,i+OnFeulth+ 1,j)。