中值JS函数.错了
Median JS function. Wrong
最近我做了一个测试任务,其中有必要计算中位数和其他东西。我写了下一个函数
function quartile(n) {
var observation = n * (len + 1) / 4 - 1;
if (n * (len + 1) % 4 === 0) {
return sortedSet[observation];
} else {
return Math.round((sortedSet[Math.floor(observation)] + (observation - Math.floor(observation)) *
(sortedSet[Math.ceil(observation)] - sortedSet[Math.floor(observation)])) * 10e3) / 10e3;
}
}
在反馈中,我以错误的方式计算中位数。现在我不知道在哪些情况下这个函数会不正确。你能解释一下这里出了什么问题吗?附注:像这样使用quartile(2)
只是排序
我找到了问题所在。我用过array.sort(),不知道排序是非自然顺序的。
好吧,你的等式错了,你的条件也错了。
对于第一个和第三个四分位数,您的观察值计算偏差0.5,对于0和4,偏差1。而你的情况,最好是if(observation%1 === 0)
或if(observation === Math.floor(observation))
这里是一个固定的版本,正如在注释中提到的,格式化/舍入浮点数不是这个函数的工作。
function quartile(n) {
//compute the position in the Array you want to fetch
//n==0 return the first, n == 4 returns the last item in the Array
var pos = n/4 * (len-1),
//separate the index ...
i = Math.floor(pos),
//and the fractional part
t = pos - i;
return t? //if there is a fractional part
//interpolate between the computed and the next index
(1-t) * sortedSet[i] + t * sortedSet[i+1]:
//otherwise return the value at the computed index
sortedSet[i];
}
编辑:我在维基百科上查了一下这个话题。天哪,这是一个奇怪的,递归的,非数学的方法。更糟糕的是,关于如何计算这些四分位数,没有一个,有三种不同的定义,它们返回不同的结果。
//a utility, processes the part left <= indices < right
function _median(arr, left, right){
var i = (left+right)>>1;
return (right-left) & 1? arr[i]: .5 * (arr[i-1] + arr[i])
}
方法1和方法2比数学方法更实用,但由于它们的递归性质,在某种程度上相当直接
var method1 = {
Q1(arr){
return _median(arr, 0, arr.length>>1)
},
Q2(arr){
return _median(arr, 0, arr.length);
},
Q3(arr){
var len = arr.length;
return _median(arr, (len>>1)+(len&1), len);
}
}
var method2 = {
Q1(arr){
var len = arr.length;
return _median(arr, 0, (len>>1) + (len&1))
},
Q2(arr){
return _median(arr, 0, arr.length);
},
Q3(arr){
var len = arr.length;
return _median(arr, len>>1, len);
}
}
方法3感觉更像是:"我们不能同意使用哪种方法,1还是2。"让我们取两者的平均值,最后结束这个话题
var method3 = {
Q1(arr){
var len = arr.length,
r = (len >> 1) + (len&1),
i = r>>1;
return (r & 1)? arr[i]: .75 * arr[i-1] + .25*arr[i];
},
Q2(arr){
return _median(arr, 0, arr.length);
},
Q3(arr){
var len = arr.length,
l = len>>1,
i = (l+len)>>1;
return (len-l)&1? arr[i]: .25 * arr[i-1] + .75*arr[i];
}
}
相关文章:
- 我怎么把范围弄错了?无法从jQuery访问此函数;.在“上”;
- JavaScript 错误:未捕获的类型错误:undefined 不是第 4 行的函数;我不知道我做错了什么
- 在 c#.net 中执行 javascript 函数.我做错了什么
- Javascript Date.getTime 函数没有返回正确的值,或者我做错了什么
- D3 TypeError: link.exit 不是函数 link.exit().remove();我做错了什么
- 当单击jquery-ui选项卡时,我需要运行一个函数,我做错了什么
- 我在nodejs/mongodb上的更新函数上做错了什么
- 回调不是一个函数:我做错了什么
- 函数仍在异步调用.我做错了什么
- 我有一个javascript函数,我可以'Don't tell what I;我做错了
- 我的谷歌电子表格脚本只运行一个函数.我把剧本编错了吗
- 在类的每个项上运行jquery函数,我做错了什么
- 我以为我有一个this引用传递到Javascript闭包中的私有函数,我想错了
- onComplete属性必须是javascript函数名;我打错了什么?
- Backbone.Model.extend()不是一个函数,我做错了什么?
- appendChild不是一个函数-我做错了什么?
- AngularJS-链接函数中的作用域被重置,我做错了什么
- 什么'错了我的ajax函数获取图像
- 中值JS函数.错了
- 使用JavaScript函数作为“类”:我在这里做错了什么?