Angenommen, ich habe einen mathematischen Ausdruck in einer "Baum" -Form in OCaml. Es ist, als ein algebraischer Typ wie folgt dargestellt:Wie drucke ich eine Baumstruktur in Ocaml schnell?
type expr =
Number of int
|Plus of expr*expr
Nun, das ein ist sehr Definition vereinfachte, aber es ist genug, um das Problem zu beschreiben.
Ich möchte es in eine umgekehrte polnische Notation umwandeln, so dass Plus (Number i, Number j)
(+ i j)
wird. Eine einfache Implementierung würde
let rec convert = function
Number i -> string_of_int i
|Plus (a,b) -> (let s = convert a in let p = convert b in "(+"^s^" "^p^")")
sein Aber die Sache ist, dass es unglaublich langsam auf eine Eingabe (die einen großen Baumtiefe haben). Zum Beispiel arbeitet dieser Eingang 5 Sekunden auf meinem Rechner:
let rec make_pain so_far = function
0 -> so_far |i -> make_pain (Plus (Number 1,so_far)) (i-1)
let pain = make_pain (Number 1) 20000
let converted = convert pain
es, dass die String-Verkettung scheint x^y
, wo y
eine lange Reihe ist, ist das Leistungsproblem. In der Tat, wenn ich die "(+"^s^" "^p^")"
Ausdruck mit nur s^p
ersetzen, wird es schneller viel.
Die Verwendung von printf
anstelle der Verkettung macht es nicht schneller. Konvertieren in C könnte helfen, aber gibt es keine OCaml-Lösung?
Sie ein Schlemiel nicht sein :-) http://www.joelonsoftware.com/articles/fog0000000319.html –
@ Chris ja Das Problem ist so alt wie C :) –