Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 用F#Async生成字谜_String_F#_Anagram_F# Async - Fatal编程技术网

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内核之间划分生成过程?