Question

Hmmm ... son défi un peu à trouver une méthode de lecture / écriture de données suffisamment rapide pour obtenir dans ce problème ACCEPTÉ ( https://www.spoj.pl/problems/INTEST/ ) avec F # .

Mon code ( http://paste.ubuntu.com/548748/ ) obtient TLE. ..

Toutes les idées comment accélérer la lecture des données?

Était-ce utile?

La solution

Cette version de mes passe la limite de temps (mais est encore terriblement lent ~ 14 secondes):

open System
open System.IO

// need to change standard buffer, not to add an additional one
let stream = new StreamReader(Console.OpenStandardInput(4096))

let stdin = Seq.unfold (fun s -> if s = null then None else Some (s,stream.ReadLine())) <| stream.ReadLine()

let inline s2i (s : string) = Array.fold (fun a d -> a*10u + (uint32 d - uint32 '0') ) 0u <| s.ToCharArray()

let calc = 
    let fl = Seq.head stdin
    let [|_;ks|] = fl.Split(' ')
    let k = uint32 ks
    Seq.fold (fun a s -> if (s2i s) % k = 0u then a+1 else a) 0 <| Seq.skip 1 stdin

printf "%A" calc

Bien que le goulot d'étranglement de cette version est en fait la conversion string -> uint32 (fonte standard uint32 de chaîne est encore plus lent) la lecture elle-même prend environ 2 secondes (vs 6 sec du temps total) sur mon entrée échantillon (fichier ~ 100M) - toujours pas un grand résultat. Une fois s2i est réécrite dans un style impératif, le total d'exécution peut être réduite à 10 secondes sur SPOJ:

let inline s2i (s : string) =
    let mutable a = 0u
    for i in 0..s.Length-1 do a <- a*10u + uint32 (s.Chars(i)) - uint32 '0'
    a

Autres conseils

Je ne sais pas vraiment, mais je suppose que la lecture d'un depuis caractère à la fois est mauvais, et vous devriez lire par exemple 4k dans un tampon à la fois et de traiter ensuite le tampon.

let buf =
    let raw = System.Console.OpenStandardInput()
    let bytebuf = new System.IO.BufferedStream(raw)
    new System.IO.StreamReader(bytebuf)

buf.Read()     // retrieves a single character as an int from the buffer
buf.ReadLine() // retrieves a whole line from the buffer
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top