Ответ 1
Какой предпочтительный метод получения подраздел списка и почему построена для поддержки GetSlice?
Возьмем последний вопрос и первый вопрос:
Почему списки не поддерживают GetSlice
Списки реализуются как связанные списки, поэтому у нас нет эффективного индексированного доступа к ним. Сравнительно говоря, foo.[|m..n|]
занимает O(n-m)
время для массивов, эквивалентный синтаксис занимает O(n)
время в списках. Это довольно большое дело, потому что это не позволяет нам эффективно использовать синтаксис разреза в подавляющем большинстве случаев, когда это было бы полезно.
Например, мы можем разрезать массив на равные размеры в линейном времени:
let foo = [|1 .. 100|]
let size = 4
let fuz = [|for a in 0 .. size .. 100 do yield foo.[a..a+size] |]
Но что, если бы мы использовали список? Каждый вызов foo.[a..a+size]
займет больше времени и дольше, и вся операция O(n^2)
, что делает его довольно непригодным для задания.
В большинстве случаев нарезка списка - неправильный подход. Обычно мы используем сопоставление шаблонов для перемещения и управления списками.
Предпочтительный метод для сортировки списка?
Если возможно, используйте шаблон, если сможете. В противном случае вы можете вернуться на Seq.skip
и Seq.take
, чтобы вырезать списки и последовательности для вас:
> [1 .. 10] |> Seq.skip 3 |> Seq.take 5 |> Seq.toList;;
val it : int list = [4; 5; 6; 7; 8]