我正在努力完成“加速C ++”练习3-2。我已经测试了,下四分位数和中位数的计算正确,但上四分位数不是。
例如,假设输入“50,60,70,80,90,100”,它将输出四分位数为60,75和80.
我想解决两个问题:
1)在这种情况下,上四分位数应为90。 2)如何让我的程序显示我的数字的浮点数或双倍数?较低的一个更精确的四分位数是62.5,而不是60。
P_Latitude
答案 0 :(得分:2)
对于初学者来说,你的代码有点乱,难以阅读。如果你使用现代的C ++编译器,你就不需要那种愚蠢的typedef。您可以使用类型扣除:
auto size = set.size();
使用size % 2 == 0
作为布尔是一个满口的,它通常被写为(size % 2)
为清晰起见,只使用该表达式一次可能是谨慎的
确定四分位数有三种方法,它们给出不同的答案,你的代码不匹配其中两种(因为每个方法都检查数据集中项目的实际数量)。编码它匹配&# 34; 1-Var Stats"因bug而无法返回所需值的方法。
使用中位数将有序数据集分成两半。
如果原始有序数据集中存在奇数个数据点,则不包括中间值(有序列表中的中心值)。
如果原始有序数据集中有偶数个数据点,请将此数据集分成两半。
较低的四分位数值是数据下半部分的中位数。上四分位数值是数据上半部分的中位数。
我想,你期待Tukey的铰链(midhinge)一个?
使用中位数将有序数据集分成两半。
较低的四分位数值是数据下半部分的中位数。上四分位数值是数据上半部分的中位数。
如果关于统计的书太遥远,那么wiki和应用数学堆栈交换中都会有算法。
研究你的代码行为:你计算" mid"只是通过划分数组的大小,如果你采取上面或下面的中间"值。为什么?理论上,如果计数不均匀,你总是会取上限值,如果向上舍入,但实际上你只取较低值,因为你用整数值操作,其中除法的结果将被截断。对于size = 11,你的mid将是5.而且" upper"索引?
auto upper = size - mid; //? upper = 6 That's not right
应该是
auto upper = (size + mid)/2;
这将为第一种方法提供正确的答案:60 75 90