String 用F#Async生成字谜
我正在想办法提高我的程序的速度,其中一个部分是字谜生成。在这种情况下,异步特性会有所帮助吗?还是有另一种操作字符串的技术String 用F#Async生成字谜,string,f#,anagram,f#-async,String,F#,Anagram,F# Async,我正在想办法提高我的程序的速度,其中一个部分是字谜生成。在这种情况下,异步特性会有所帮助吗?还是有另一种操作字符串的技术 let anagramWords = [|"rolex";"viagra";"win";"free";"cash";"grand";"prize"; "nude";"porn";"casino";"lottery";"spins";"sex";"gold"; "buy"; "clearance";
let anagramWords = [|"rolex";"viagra";"win";"free";"cash";"grand";"prize";
"nude";"porn";"casino";"lottery";"spins";"sex";"gold"; "buy"; "clearance";
"business"; "biz"; "money"; "opportunity"; "earn"; "extra"; "potential"; "sleep"; "discount";
"bargain"; "credit"; "affordable"; "loans"; "mortages"; "quote"; "dollars"; "invest"; "investment";
"bitcoin"; "silver"; "save"; "unsecured"; "pennies"; "million"; "billion";"bureaus";"stock";
"bankruptcy"; "eliminate"; "debt"; "billing"; "iphone"; "selling"; "obligation";"trial";
"vacation"; "winner";"membership"; "preview"; "sample"; "priority"; "website"; "gift"; "gifts";
"present"; "deal"; "fantastic"; "outstanding"; "values"; "act"; "lifetime"; "urgent"|]
let rec distribute e = function
| [] -> [[e]]
| x::xs' as xs -> (e::xs)::[for xs in distribute e xs' -> x::xs]
let rec permute = function
| [] -> [[]]
| e::xs -> List.collect (distribute e) (permute xs)
let genAnagrams word =
word
|>List.ofSeq
|>permute
|> List.map (fun x -> String(x |> Array.ofList))
|> Seq.ofList
|> Seq.toList
一个非常简单的方法是让
permute
使用数组而不是列表,并使用Array.Parallel.collect
而不是List.collect
。即使从数组中去掉头部的效率很低,但对于我来说,一个10个字符的单词也能快30%左右
open System
let rec distribute e = function
| [] -> [[e]]
| x::xs' as xs -> (e::xs)::[for xs in distribute e xs' -> x::xs]
let arrayHeadTail = function [||] -> None | xs -> Some (xs.[0], Array.tail xs)
let rec permute xs =
match arrayHeadTail xs with
| None -> [| [] |]
| Some (e, xs) -> Array.Parallel.collect (distribute e >> List.toArray) (permute xs)
let genAnagrams word =
word
|> Seq.toArray
|> permute
|> Array.map String.Concat<char>
开放系统
让rec分配e=函数
|[]->[[e]]
|x::xs'作为xs->(e::xs)::[对于分布式e xs'->x::xs中的xs]
让arrayHeadTail=function[| |]->None | xs->Some(xs.[0],Array.tail xs)
让rec置换xs=
将arrayHeadTail xs与
|无->
|一些(e,xs)->Array.Parallel.collect(分发e>>List.toArray)(排列xs)
让genAnagrams单词=
单词
|>序号:toArray
|>排列
|>Array.map String.Concat
但这种方法不会带来速度上的重大变化,因为我的代码需要很长时间来编译。。但是,是否有可能以某种方式在cpu内核之间划分生成过程?