Supposons que j'ai une expression mathématique dans un formulaire "arbre" dans OCaml. Il est représenté comme un type algébrique comme ceci:Comment imprimer une structure arborescente en une chaîne rapide dans Ocaml?
type expr =
Number of int
|Plus of expr*expr
Eh bien, cela est une très simplifiée définition, mais il suffit de décrire le problème. Je veux le convertir en une chaîne dans une notation polonaise inverse, de sorte que Plus (Number i, Number j)
devient (+ i j)
. Une mise en œuvre simple serait
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^")")
Mais la chose est qu'il est incroyablement lent sur une entrée (qui ont une grande profondeur de l'arbre). Par exemple, cette entrée fonctionne 5 secondes sur ma machine:
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
Il semble que la concaténation de chaîne x^y
, où y
est une longue chaîne, est le problème de performance. En effet, si je remplace l'expression "(+"^s^" "^p^")"
par un simple s^p
, il devient beaucoup plus vite.
L'utilisation de printf
au lieu de la concaténation ne le rend pas plus rapide. La conversion en C peut aider, mais n'y a-t-il pas une solution OCaml?
Ne soyez pas Schlemiel :-) http://www.joelonsoftware.com/articles/fog0000000319.html –
ouais @ Chris , le problème est aussi vieux que C :) –