Рассчитать режим списка целых чисел? - PullRequest
0 голосов
/ 10 мая 2018

Есть ли встроенная функция для расчета режима списка целых чисел в F #?

Если у меня есть список целых чисел, как показано ниже:

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

Я ожидаю, что результат будет 3.

1 Ответ

0 голосов
/ 10 мая 2018

Нет, такой встроенной функции нет. Вот наивная реализация для вас:

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 (или даже линейная, в зависимости от реализаций группировки и сортировки), поэтому нет необходимости оптимизировать до просмотра данных о производительности.

...