有没有办法在不使用数组的情况下计算所有数字的平均值/最小值/最大值?需要每秒最多计算10,000个数字。
答案 0 :(得分:2)
不确定。保留您收到的最小和最大数字,以及数字的总和和数量。当您需要最小或最大时,请将其退回。当您需要平均值时,将总和除以数字。
Boost Accumulators包括以上所有内容的实现,以及其他一些实现。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
}
答案 3 :(得分:1)
创建四个变量:一个用于存储minVal,一个用于存储maxVal,一个用于总和,一个用于在每次新输入后递增。将每个新输入与minVal和maxVal进行比较,并根据需要进行更新。将输入值添加到总和中,递增计数器。平均值始终是总和/计数器,因此您可以在需要时动态查询此值,或者在完成后立即计算它。
答案 4 :(得分:1)
您不需要在数组中存储任何数字来查找平均值/最小值/最大值,因为您正在迭代您执行的数字
if(currentSmallest > currentNumber)
currentSmallest = currentNumber
if(currentLargest < currentNumber)
currentLargest = currentNumber
此外,您将保留一个计数器和总和,并通过除以这些数字,您将获得平均值。无需将它们存储在数组中。