F# 有没有更有效的方法来提取索引依赖于列表的数组子集?

F# 有没有更有效的方法来提取索引依赖于列表的数组子集?,f#,subset,F#,Subset,我编写了一个函数,返回数组的子集(作为列表),该数组由索引等于(n+另一个列表的某个索引)的元素组成 为了提高效率,使用了一个数组而不是一个列表,但是使用一个列表也可以达到同样的效果 我的测试表明该功能运行良好。但我想知道是否有更快的方法来实现这一点,因为函数在我看来有点麻烦 下面是函数: let shiftFrom (n: int) (xs: 'T list) (arr: 'T []) : 'T list = let len = arr.Length - 1 l

我编写了一个函数,返回数组的子集(作为列表),该数组由索引等于
(n+另一个列表的某个索引)
的元素组成

为了提高效率,使用了一个数组而不是一个列表,但是使用一个列表也可以达到同样的效果

我的测试表明该功能运行良好。但我想知道是否有更快的方法来实现这一点,因为函数在我看来有点麻烦

下面是函数:

let shiftFrom (n: int) (xs: 'T list) (arr: 'T []) : 'T list =
        let len = arr.Length - 1
        let rec loop (acc: 'T list) (zs: list<int>*list<'T>) =
            match zs with
            | [], _ -> acc
            | _, [] -> acc
            | (i::is), (w::ws) ->
                if i + n > len then acc
                elif w = arr.[i] then  loop (arr.[i+n]::acc) (is, ws)
                else loop acc (is, w::ws)  
        loop [] ([0..len], xs)
        |> List.rev
有没有更有效的方法来实现这一点

(对于这个具体的例子,有一个很明显的例子,我的问题与一般情况有关,
arr
不太好)。

怎么样

let shiftFrom (n: int) (xs: int list) (arr: 'T []) : 'T list =
    xs |> List.choose (fun i -> arr |> Array.tryItem (i + n))

假设
xs
arr
的子集:

xs 
|> List.choose (fun x -> Array.tryFindIndex ((=) x) arr)
|> List.choose (fun x -> Array.tryItem (x+n) arr)

你的功能与我的完全不同。请注意,例如,我的代码中的
elif w=arr.[i]
,我的
xs
不是一个
int
列表,而是一个
'T
列表,就像
arr
是一个
'T
数组。Re:
有没有更有效的方法来实现这一点?
执行速度有问题吗(在这种情况下,一些基准计时会很有帮助)或者代码的复杂性?你能澄清一下
elif w=arr[i]是什么吗那么…
应该做什么?确实不清楚你的函数应该做什么。我建议提供一个以字符串作为元素的示例。你的元素与索引的类型相同,这让人很困惑。
xs
是否保证是
arr
的子集?在
xs
中是否有不属于部分的元素关于
arr
?@s952163-两者,请参阅我对已接受答案的评论。这正是我想要的!我使用
n=3
xs=[0.0..3.0..100000.0]
arr=[0.0..100000.0]|>Array.ofList
测试了速度。您的解决方案比我自己的解决方案快2500倍。
xs 
|> List.choose (fun x -> Array.tryFindIndex ((=) x) arr)
|> List.choose (fun x -> Array.tryItem (x+n) arr)