i got almost the same time as with my previous (incorrect) method by using a single hash table and an alist instead of a hash for the inner structure. memory usage isnt so good though. :(
using a sparse multiple-alist structure seems to work nicely in small space and good time. i can post the code if interested. -elf On Sun, 24 Aug 2008, Jim Ursetto wrote:
Note that your solution effects a mapping of x -> y, not from x -> y -> #t. That gets the job accomplished correctly, but doesn't reflect the original Perl code. For a fair comparison, you have to change the perl code to match, and then it runs in 1/3 of the memory and 1/2 the time of the original perl code. This is what I mean concretely: print "Filling the array with 250000 entries.\n"; foreach $n (0 .. 250000) { $x = int(rand(500000)); $y = int(rand(500000)); $a{$x} = $y; # change to one-level hash } print "Reading from the array 10000 times\n"; $hits=0; foreach $n (0 .. 10000) { $x = int(rand(500000)); $y = int(rand(500000)); if (exists $a{$x} and $a{$x} == $y) { # quell warning on undef $hits++; } } print "Done (hits $hits)\n"; On Sun, Aug 24, 2008 at 5:56 AM, Elf <[EMAIL PROTECTED]> wrote:for an improvement in time (surprisingly), use (define a (alist->hash-table (let loop ((i 0) (r '())) (if (fx= 250000 i) r (loop (fx+ 1 i) (cons (cons (random 500000) (random 500000)) r)))) =))
_______________________________________________ Chicken-users mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/chicken-users
