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)