Ich habe versucht, Memoisierungstechnik zu verwenden, um die Berechnung von Fibonacci zu optimieren. Mein Code ist:Ocaml Memoization fehlgeschlagen, wenn auf Fibonacci-Serie angewendet
let memo f =
let vtable = ref [] in
let rec match_function x vt=
match vt with
|(x',y)::_ when x=x' -> y
|_::l ->
match_function x l
|[] ->
let y = (f x) in
vtable := (x,y):: !vtable;
y
in
(fun x -> (match_function x !vtable));;
let rec ggfib = function
0|1 as i -> i
|x -> ggfib(x-1) + ggfib(x-2);;
let memoggfib = memo ggfib;;
let running_time f x =
let start_time = Sys.time() in
let y = f x in
let finish_time = Sys.time() in
Printf.printf "Time lapse:%f\n" (finish_time -. start_time);
y;;
running_time ggfib 30;;
running_time memoggfib 30;;
Die Ausgabe lautet:
Time lapse:0.357187
Time lapse:0.353663
Der Unterschied nicht so viel ist .. Warum ?? Und noch schlimmer, als ich versuchte, Fibonacci zu berechnen, bei 40 unter Verwendung
running_time ggfib 40;;
running_time memoggfib 40;;
Das Programm erscheint in einer Endlosschleife laufen und zur Ausgabe zu stoppen.
Was ist hier falsch? Auf welches Problem habe ich nicht geachtet?
Ich habe den obigen Code geändert, um eine 'statische' vtable für Memoization einzuführen.
let rec ggfib = function
0|1 as i -> i
|x -> ggfib(x-1) + ggfib(x-2);;
let running_time x0 =
let vtable = ref [] in
let start_time = Sys.time() in
let x = ref 1 in
let rec match_function ff x vt=
match vt with
|(x',y)::_ when x=x' -> y
|_::l ->
match_function ff x l
|[] ->
let y = (ff x) in
vtable := (x,y):: !vtable;
y
in
let y=ref 1 in
while !x<x0 do
y:= match_function ggfib !x !vtable;
x:=!x+1;
done;
let finish_time = Sys.time() in
Printf.printf "Time lapse:%f\n" (finish_time -. start_time);
y;;
let running_time2 x0=
let start_time = Sys.time() in
let x = ref 1 in
while !x<x0 do
ggfib !x;
x:=!x+1;
done;
let finish_time = Sys.time() in
Printf.printf "Time lapse:%f\n" (finish_time -. start_time);;
running_time 40;;
running_time2 30;;
Es funktioniert immer noch als das gleiche Prinzip. Ich sah keine wesentliche Verbesserung ....
Time lapse:0.581918
Time lapse:0.577813
Vielen Dank !!! Bitte erlauben Sie mir irgendwann, über Ihren Beitrag nachzudenken. Viel zu viel für einen neuen Lernenden. – lkahtz