所以我试图找到这个java方法的递归关系:
public static Pair min/max(int start, int end, int[] a) {
int mid;
Pair pair = new Pair(a[start], a[end]);
Pair p1;
Pair p2;
if (start == end) { //if n = 1
return pair;
}
else if (end == start + 1) { //if n = 2
if (a[start] > a[end]) {
pair.upper = a[end];
pair.lower = a[start];
} else {
pair.upper = a[start];
pair.lower = a[end];
}
return pair;
}
mid = (end + start) / 2; //if n > 2
p1 = min/max(end, mid, a);
p2 = min/max(mid + 1, ub, a);
if (p1.lower < p2.lower)
pair.upper = p1.lower;
else
pair.lower = p2.lower;
if (p1.upper > p2.upper)
pair.upper = p1.upper;
else
pair.upper = p2.upper;
return pair; //the min and max pair
}
这应该通过总是使用⌈3n/ 2 - 2⌉比较来找到数组的最大值和最小值。它也使用这个类:
class Pair {
int lower;
int upper;
Pair ( int a, int o ) { lower = a; upper = o; }
}
那么这个方法的递归关系是什么?我知道它的开头是:
C(n) = 0 if n=1
1 if n=2
现在我想弄清楚当n>时方程式是什么? 2.首先,上述方法总是在⌈3n/ 2 - 2⌉比较中运行。我只是想知道因为行mid = (lb + ub) / 2
让我觉得我仍然将数组分成⌈n/2⌉和⌊n/2⌋部分,这些部分不会让我⌈3n/ 2 - 2 each每次比较。我知道有更好的方法来做同样的事情,但我写的代码必须使用递归。
更新:添加计数器语句后,我发现上面的代码不对每个数组使用⌈3n/ 2 - 2⌉比较。我认为问题在于变量mid。中间我应该分裂阵列,但我不认为我正确分裂它以进行适当数量的比较。
答案 0 :(得分:0)
让n = end - start + 1
。我认为你的意思是表示比较次数的复发。
在一般情况下,您对每个递归级别进行4次比较,并将列表拆分为一半。所以复发是:
T(n) = 4 + T( floor(n/2) ) + T( ceiling(n/2) ) for n > 1
注意:您似乎已经开始使用lb
和ub
,并且仅部分切换为start
和end
。