Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 计算整数列表的模式?_F#_Average - Fatal编程技术网

F# 计算整数列表的模式?

F# 计算整数列表的模式?,f#,average,F#,Average,是否有一个内置函数来计算F#中整数列表的模式 如果我有一个整数列表,如下所示: let integers = [1; 2; 3; 4; 5; 3] 我希望结果是3不,没有这样的内置函数。下面是一个简单的实现: let mode = function | [] -> None | xs -> let mostFrequentTwo = xs |> Seq.groupBy id

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

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

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

我希望结果是
3

不,没有这样的内置函数。下面是一个简单的实现:

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*logn
(甚至是线性的,取决于分组和排序实现),因此似乎没有必要在看到性能数据之前进行优化。

注意,有
Seq.countBy
,这相当于您的
Seq.groupBy id>>Seq.map(…)