2013-09-25 60 views
0

我正在做一个练习题,我被卡住了。现在的问题是Java数组建议

“给定阵列的n个(比如说加倍),考虑计算 平均第i个数字,用于i0n-1的问题。也就是说,计算 数组b长n,其中 b[i] = a[0] + a[1] ....+ a[i]/(i + 1)0 <= i < n。 写Java程序来解决这个问题,你的程序可以生成自己的 阵列,例如a[i] = i + 1。见数组多大,你可以在不到 5秒处理。(对于完全的信贷,它应该至少有一百万。) 表征算法的时间复杂性。“

这是我在解决它的尝试:

public class largeArray{ 

public static void main(String[] args){ 

    double[] aa = new double[1000000]; 
    System.out.println(CalculateAvg(aa)); 




} 
public static double CalculateAvg(double[] a){ 
    int i =0; 
    double[] array = new double[i]; 
    a[i] = i + 1; 

    for(int k=0; k<array.length; i++){ 
    double total = a[k]+a[k]; 
    double sum = ((total)/a[i]); 
    } 

return a[i]; 
} 
} 
+7

你没有真正总结的价值观 - 你宣布对循环的每个迭代一个新的局部变量和加倍现有的价值......,什么是对的'array'价值? –

+0

@JonSkeet基本上我想要做的是创建一个程序,它有一个不固定值的数组,并且在5秒后找到平均值的问题已经相应地解决了这个问题。我不太清楚如何初始化初始值,但要继续运行。数组值是在5秒后测试多少次。它没有真正的意义,只是一个考验而已。 – user2045470

+0

我看不到在5秒*之后找到平均值*的地方。它必须在* 5秒之前完成*。提示:尝试声明循环中的总数*,从零开始,并将这些值相加。然后想想平均值是多少... –

回答

0

要开始做一个函数来得到n个已知数(maxNum

public int getAvgForNumbers(int maxNum){ 
int sum = 0; 

for(int k=1; k<=maxNum; k++){ 
    sum = sum + k; 
    } 

return sum/maxNum; 
} 

的平均现在使用此功能来填充数组通过调用它从值1开始 - getAvgForNumbers(1)直到您感觉会得到的数字getAvgForNumbers(x)

1

如果我得到它相关ctly您必须生成一个数组B,其中B [i]是输入数组的前i个元素的平均值。

如果这是问题,你可以做一个单一的循环,总和A [i] + B [i-1],然后做B [i-1]/i;

所以应该如果A是输入阵列和B是输出:

B[0] = A[0] 
for (int i = 1; i < n; i ++) { 
    B[i] = A[i] + B[i-1]; 
    B[i-1] /= i; 
} 
B[n-1] /= n; 

这是O(n),它是在复杂度方面的最佳值(因为这个问题是计算的n的平均数是T(n),即不能用小于O(n)的复杂度来解决)。

由于每个循环只有几条指令,所以常数也很低。这应该让你保持5秒钟的方式。

Ahh我忘记了,A的产生超出了5秒分析(这是输入)。

问候

+0

对不起,我只是忘记了数组B的最后一个元素(最后一个平均值)的划分。我刚刚添加了它 – luiso1979