中位数(Median)

转自:http://book.51cto.com/art/201004/193273.htm

中位数是将总体数据的各个数值按大小顺序排列,居于中间位置的变量,用Median表示。中位数将所有的数据等分成两半,中位数两端的数据个数相同,因此它也被称为二分位数。中位数的确定,仅仅取决于它在数列中的位置,不受极端值的影响,因此可以用它表示总体的一般水平。同时,中位数比算术平均数具有更好的稳定性。

一个大小为N的数列,要求其中位数,首先应把该数列按大小顺序排列,如果N为奇数,那么该数列的中位数就是 位置上的数;如果N为偶数,中位数则是该数列中第 与第 位置上的两个数值的平均数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Kotlin 编写的解题代码: ```kotlin class Solution { fun sampleStats(count: IntArray): DoubleArray { val min = count.indexOfFirst { it > 0 }.toDouble() val max = count.indexOfLast { it > 0 }.toDouble() val sum = count.foldIndexed(0.0) { i, acc, c -> acc + i * c.toDouble() } val mean = sum / count.sum() val mid = (count.sum() + 1) / 2 var mode = 0.0 var modeCount = 0 for (i in count.indices) { if (count[i] > modeCount) { mode = i.toDouble() modeCount = count[i] } } var median = 0.0 var countSoFar = 0 var i = 0 while (i < count.size) { countSoFar += count[i] if (mid <= countSoFar) { median = i.toDouble() if (countSoFar == mid && count[i] > 1) { for (j in i + 1 until count.size) { if (count[j] > 0) { median = (median + j) / 2.0 break } } } break } i++ } return doubleArrayOf(min, max, mean, median, mode) } } ``` 算法思路如下: 我们可以使用 `indexOfFirst` 和 `indexOfLast` 找到最小和最大的非零元素的索引,然后将它们转换为双精度浮点。接下来,我们可以使用 `foldIndexed` 计算所有元素的总和,然后将其除以元素总以获得平均值。 对于中位数,我们需要找到中间的元素。如果样本的元素是奇,则中位数是排序后的中间元素。否则,中位数是排序后的中间两个元素的平均值。我们可以使用 `sum()` 算出样本的元素总,然后计算出中位数所在的位置。接下来,我们可以使用一个循环来计算中位数。 对于众,我们可以使用一个循环来找到出现次最多的字,并记录它们的出现次。最后,我们只需要将所有这些值放入一个双精度浮点并返回即可。 时间复杂度为 $O(256)$,空间复杂度为 $O(1)$,其 256 是样本元素的范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值