[英]Any SDK function in Java to Push number unto a Stack and calculate the average?
我嘗試向Google尋求答案,但我認為我使用了錯誤的關鍵字。 我正在嘗試做的是-我有一個數字(int)集合,當我添加新數字時,我正在計算新的平均值。 我注意到隨着數組的增長,一旦達到一定數量的元素(比如說200),計算時間就會變得很明顯。 我想知道是否可以使用任何內置的SDK函數來提高代碼性能? 我將在Android上運行代碼。
int[] numbers = new int[3];
private int average(int number){
//some buildin operation to push in array an int?
for(int i=0; i < numbers.length -1 ; i++){
numbers[i]=numbers[i+1];
}
numbers[numbers.length -1] = number;
;
//numbers[0] = numbers[1];
//numbers[1] = numbers[2];
//numbers[2] = number;
int sum = 0;
//any operation to get average?
for(int i=0; i < numbers.length ; i++)
sum = sum + numbers[i];
//calculate average value
double average = sum / numbers.length;
return (int)average;
}
可以平均計算運行平均值(整數類型):
sum -= oldest_value;
sum += new_value;
avg = (double)sum / num_elements;
為避免每次都需要在數組中移動所有元素,應將數組用作循環緩沖區 。
有點晚了,但這是一種方法:
public class RunningAverage
{
ArrayList<Integer> numList = new ArrayList<Integer>();
private int runningSum = 0;
private int sampleSize;
public RunningAverage(int[] initialSetOfValues)
{
if(initialSetOfValues == null || initialSetOfValues.length == 0)
{
// Abort gracefully
// left as an exercise...
}
sampleSize = initialSetOfValues.length;
for (int num : initialSetOfValues)
{
numList.add(num);
runningSum += num;
}
}
public int getRunningAverage(int newestVal)
{
numList.add(newestVal);
int oldestVal = numList.remove(0);
runningSum = runningSum - oldestVal + newestVal;
return runningSum / sampleSize;
}
public static void main(String args[])
{
RunningAverage r = new RunningAverage(new int[]{4, 5 , 6, 7});
System.out.println(r.getRunningAverage(8));
System.out.println(r.getRunningAverage(9));
System.out.println(r.getRunningAverage(10));
}
}
現在我只是將自己設置為循環緩沖區(如Oli Charlesworth所建議)。
這是我的實現:
/** Circular buffer */
private class WindowBuffer {
private final float [] values;
private final int capacity;
private float sum;
private float average;
private int head = -1;
private boolean full = false;
WindowBuffer(final int capacity) {
this.capacity = capacity;
values = new float[capacity];
for (int i = 0; i < capacity; i++) {
values[i] = 0f;
}
}
void clean() {
if (head == -1) return;
for (int i = 0; i < capacity; i++) {
values[i] = 0f;
}
sum = 0;
average = 0;
head = -1;
full = false;
}
void put(final float value) {
head++;
if (head >= capacity) {
head = 0;
full = true;
}
sum -= values[head];
sum += value;
values[head] = value;
calculateAverage();
}
private void calculateAverage() {
if (full) {
average = sum / capacity;
} else {
average = sum / (head + 1);
}
}
float getAverage() {
return average;
}
}
UPD
void clean() {
if (head == -1) return;
if (full) {
for (int i = 0; i < capacity; i++) {
values[i] = 0f;
}
} else {
for (int i = 0; i <= head; i++) {
values[i] = 0f;
}
}
sum = 0;
average = 0;
head = -1;
full = false;
}
如果我是我,我會一直使用ArrayList。 看一看與您的代碼完全相同的代碼。
ArrayList<Integer> numbers = new ArrayList<Integer>();
private Integer average(Integer number){
numbers.add(number);
Integer sum = 0;
for(Integer num : numbers) {
sum = sum + num;
}
double average = sum / numbers.size();
return (Integer)average;
}
而且,如果您可以保存變量總和以備重用,那么您肯定會確定如何找到新的平均值:)
沒有更好的算法來計算平均值。 優化的代碼(使用相同的數據結構)將是:
private int average(int number){
int sum = 0;
for(int i=0; i<(numbers.length-1); i++){
numbers[i] = numbers[i+1];
sum += numbers[i];
}
numbers[numbers.length -1] = number;
return (int)((sum+number) / numbers.length);
}
我正在努力理解您的問題和代碼。 我完全不知道第一個循環是干什么的。
但是,如果您只是想找到平均值,那么您幾乎是對的
int sum =0;
for(int i=0; i<array.length();i++){
sum=sum+array[i];
}
average = sum/array.length();
不是最快的方法,而是所有易於閱讀的方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.