簡體   English   中英

Java中是否有任何SDK函數可將數字推入堆棧並計算平均值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM