私はOCamlの "ツリー"形式の数式を持っていると仮定します。Ocamlで文字列にツリー構造を高速に印刷する方法は?
type expr =
Number of int
|Plus of expr*expr
まあ、これは非常に簡素化の定義ですが、それが問題を記述するだけで十分です。それは、このような代数型として表されます。
Plus (Number i, Number j)
が(+ i j)
になるように、それを逆ポーランド表記の文字列に変換したいと考えています。簡単な実装は
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^")")
だろう。しかし事は、それは(大きな木の深さを持っている)、いくつかの入力に信じられないほど遅いだということです。例えば、この入力は私のマシンで5秒間動作します:それはy
が長い文字列である文字列の連結x^y
を、思わ
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
を、パフォーマンス上の問題があります。実際、"(+"^s^" "^p^")"
の式をs^p
と置き換えると、それはとなります。
連結の代わりにprintf
を使用してもそれ以上の高速化はありません。 Cに変換すると助けになるかもしれませんが、OCamlソリューションはありませんか?
をSchlemielてはいけません:-) http://www.joelonsoftware.com/articles/fog0000000319.html –
@クリスええ、問題はCと同じくらい古いです:) –