【发布时间】:2013-08-13 05:06:48
【问题描述】:
我正在尝试以函数的形式设计一种算法,该算法接受两个参数,一个数组和数组的大小。我希望它返回数组的模式,如果有多种模式,则返回它们的平均值。我的策略是获取数组并首先对其进行排序。然后计算一个数字的所有出现次数。当该数字出现时,将计数器加一并将该计数存储在数组 m 中。所以 m 保存所有计数,另一个数组 q 保存我们比较的最后一个值。
例如:我的列表是{1, 1, 1, 1, 2, 2, 2}
然后我会m[0] = 4 q[0] = 1
and then m[1] = 3 and q[1] = 2.
所以模式是q[0] = 1;
不幸的是,到目前为止我还没有成功。希望有人能帮忙。
float mode(int x[],int n)
{
//Copy array and sort it
int y[n], temp, k = 0, counter = 0, m[n], q[n];
for(int i = 0; i < n; i++)
y[i] = x[i];
for(int pass = 0; pass < n - 1; pass++)
for(int pos = 0; pos < n; pos++)
if(y[pass] > y[pos]) {
temp = y[pass];
y[pass] = y[pos];
y[pos] = temp;
}
for(int i = 0; i < n;){
for(int j = 0; j < n; j++){
while(y[i] == y[j]) {
counter++;
i++;
}
}
m[k] = counter;
q[k] = y[i];
i--; //i should be 1 less since it is referring to an array subscript
k++;
counter = 0;
}
}
【问题讨论】:
-
你没有从你的函数中返回任何东西。我很不清楚您对 mode 的含义和/或函数的结果应该是什么。如果它应该是所有值的平均值,可以只是
return std::accumulate(x, x + n, 0.0) / n;。顺便说一句,C++ 没有可变大小的数组。但是,您可以改用std::vector<int> y(n);。 -
@DietmarKühl 该功能未完成。模式是指数组中最常出现的值。我没有使用可变大小的数组,因为数组的大小是参数 n。
-
您可能想查看
std::map或std::unordered_map来计算每个值出现的次数。显而易见的替代方法是改用 Boostbimap。