计算整数列表的模式?

莫高斯

是否有内置函数来计算F#中的整数列表的模式?

如果我有一个整数列表,如下所示:

let integers = [1; 2; 3; 4; 5; 3]

我希望结果是3

费奥多·索金(Fyodor Soikin)

不,没有这样的内置功能。这是一个简单的实现:

let mode = function
    | [] -> None
    | xs -> 
        let mostFrequentTwo =
            xs
            |> Seq.groupBy id 
            |> Seq.map (fun (n, ns) -> n, Seq.length ns)
            |> Seq.sortByDescending snd
            |> Seq.truncate 2
            |> Seq.toList

        match mostFrequentTwo with
        | [(x, xSize); (_, ySize)] when xSize > ySize -> Some x
        | [(x, _)] -> Some x
        | _ -> None

首先,它将列表中的数字分组,然后取每个组的大小,然后按其大小降序对组进行排序,然后选择前两个。如果有两个组,第一个组较大,则为模式。如果只有一组,那就是模式;否则没有模式。

我称此实现为“幼稚”,因为严格来说,它不需要做某些事情:一种更好的方法是首先对数字进行排序,然后对它们进行恰好足以看到前两组的数字,然后比较它们的大小。但是,编写起来会更加复杂并且难以理解,但是上述解决方案的计算复杂度仍然是n * log n(甚至是线性的,取决于分组和排序的实现方式),因此在看到性能之前似乎没有必要进行优化。数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章