1

配列を使用せずにすべての数値の平均/最小/最大を計算する方法はありますか? 1 秒あたり最大 10,000 の数値を計算する必要があります。

4

5 に答える 5

2

もちろん。数値の合計と数とともに、受け取った最小および最大の数値を保持します。最小または最大が必要な場合は、返却してください。平均が必要な場合は、合計を数値で割ります。

Boost Accumulatorには、上記のすべての実装に加えて、かなりの数の実装が含まれています。

于 2012-04-27T20:45:56.937 に答える
2

はい、

高い値に初期化された最小変数を保持し、低い値が表示された場合は更新します。

最大変数で反対のことを行います。

すべての数値を合計し、その合計を合計数で割って平均を求めます。

次のコードは境界チェックを行いません (たとえば、count > 0、total はオーバーフローしません) が、アイデアは得られるはずです:

int minimum = // Initialize to large #, in C# would be int.MaxValue
int maximum = // Initialize to most negative #, in C# would be int.MinValue
int count = 0;
int total = 0;

void StatsForNewNumber(int number)
{
    if (number < minimum) minimum = number;
    if (number > maximum) maximum = number;
    count++;
    total += number;
}

int Average()
{
    return total / count;
}
于 2012-04-27T20:46:06.840 に答える
1

Create four variables: one to store the minVal, one for the maxVal, one for the total sum, and one to increment after each new input. compare each new input against minVal and maxVal and update as necessary. Add the input value to the total sum, increment the counter. The average is always the total sum/counter, so you can query this value on the fly if you need to or just calculate it at the end when you're done.

于 2012-04-27T20:48:31.377 に答える
1

You don't really need to store any numbers in an array to find the average/min/max, as you are iterating through the numbers you do

if(currentSmallest > currentNumber)
     currentSmallest = currentNumber

if(currentLargest < currentNumber)
     currentLargest = currentNumber

and in addition you will keep a counter and the total sum, and by dividing those numbers you will get the average. No need to store them in an array.

于 2012-04-27T20:49:14.337 に答える
1

絶対に: 一度に 1 つの項目を計算できるすべて。

現在の最小値と現在の最大値を保持し、現在の合計とカウントを計算します。平均が必要な場合は、現在の合計をカウントで割ると、答えが得られます。

class calc {
    double minVal, maxVal, total;
    int count;
public:
    calc()
    :   minVal(numeric_limits<double>::max)
    ,   maxVal(numeric_limits<double>::min)
    ,   total(0)
    ,   count(0) {
    }
    void process(double num) {
        minVal = min(minVal, num);
        maxVal = max(maxVal, num);
        total += num;
        count++;
    }
    double getAvg() {
        // TODO: Check count to be > 0 here
        return total / count;
    }
    double getMin() {
        return minVal;
    }
    double getMax() {
        return maxVal;
    }
}
于 2012-04-27T20:46:39.517 に答える