我有一个递归算法来计算加权中位数。我试图弄清楚Big-O的时间复杂度是什么,但我有点被卡住了。有谁可以帮助我吗。谢谢大家的帮助。这是JAVA中的代码:
public static double WeightedMedian(ArrayList<Double> a1, ArrayList<Double> a2, int p, int r) {
if (r == p) {
return a1.get(p);
}
if (r-p == 0) {
if (a2.get(p) == a2.get(r)) {
return (a1.get(p) + a1.get(r))/2;
}
if (a2.get(p) > a2.get(r)) {
return a1.get(p);
} else {
return a1.get(r);}
}
long q = partition(a1, p, r);
double wl=0,wg=0;
for (int i=p; i<=q-1; i++) {
wl += a2.get(i);
}
for (int i=(int) (q+1); i<=r; i++) {
wg += a2.get(i);
}
if (wl<0.5 && wg<0.5) {
return a1.get((int)q);
} else {
if (wl > wg) {
double x = a2.get((int)q) + wg;
a2.set((int) q,x);
return WeightedMedian(a1,a2, p+1, (int)q);
} else {
double x = a2.get((int)q) + wl;
a2.set((int) q,x);
return WeightedMedian(a1, a2, (int)q, r);
}
}
抱歉,这是我第一次在这里发布文章,因此即时通讯不是太好,我试图更好地格式化代码,但它总是在奇怪的地方等等。总之,分区代码如下:
public static long partition (ArrayList<Double> arr, int low, int high)
{
double pivot = arr.get(high);
int i = low - 1;
for (int j = low; j <= high- 1; j++)
{
if (arr.get(j) <= pivot)
{
i++;
double temp = arr.get(i);
arr.set(i,arr.get(j));
arr.set(j,temp);
}
}
double temp1 = arr.get(i + 1);
arr.set(i + 1, arr.get(high));
arr.set(high,temp1);
return i + 1;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。