1

有没有办法在不使用数组的情况下计算所有数字的平均值/最小值/最大值?每秒需要计算多达 10,000 个数字。

4

5 回答 5

2

当然。保留您收到的最小和最大数字,以及数字的总和和计数。当您需要最小或最大的时,请将其退回。当您需要平均值时,将总和除以数字。

Boost Accumulators包括上述所有的实现,以及其他一些实现。

于 2012-04-27T20:45:56.937 回答
2

是的,

保留一个初始化为较高值的最小变量,如果您看到较低的值,请更新它。

用最大变量做相反的事情。

将所有数字相加,然后将该总和除以总数得到平均值。

以下代码不进行边界检查(例如计数 > 0,总计不溢出),但应该给您一个想法:

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

绝对:一次可以计算一个项目。

保持当前最小值和当前最大值,计算运行总数和计数。当您需要平均值时,将运行总数除以计数,您就会得到答案。

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 回答
1

创建四个变量:一个用于存储 minVal,一个用于 maxVal,一个用于总和,一个用于在每次新输入后递增。将每个新输入与 minVal 和 maxVal 进行比较,并根据需要进行更新。将输入值添加到总和,递增计数器。平均值始终是总和/计数器,因此您可以在需要时即时查询该值,或者在完成后在最后计算它。

于 2012-04-27T20:48:31.377 回答
1

您实际上不需要在数组中存储任何数字来查找平均值/最小值/最大值,因为您正在迭代您所做的数字

if(currentSmallest > currentNumber)
     currentSmallest = currentNumber

if(currentLargest < currentNumber)
     currentLargest = currentNumber

此外,您将保留一个计数器和总和,通过将这些数字相除,您将得到平均值。无需将它们存储在数组中。

于 2012-04-27T20:49:14.337 回答