Hi Lindsay,

yes, Picolisp has been a great tool for me as well to explore algorithms
and datastructures.

You used the high level implementation of fastNth (took around 15 seconds)
instead of the
low level implementation (it took 3 seconds).

In fact, taken both implementations in isolation (without all that high
level code inside the loop), the low level implementation is 30 times
faster than the high level one on average.

The idx mechanism is a perfect implementation of associative array
functionality when the set of keys is a set of arbitrary strings.
But what happens when the set of keys is a more restricted set like a
sequence of numbers? That is a common scenario and I have seen people
implement that using idx, because Picolisp readily offers that solution.

I think that the Digital Search Tree structure (dst) is the perfect
solution for such a restricted set of keys (array functionality), perfect
in terms of memory space (keys are implicit, not stored), in terms of
execution time (no need to compare keys), and in terms of not needing to
change picolisp internally in order to implement arrays.

A dst complements idx, it does not substitute it.

Here is the code needed to compile the low level implementation of fastNth:

(load "@lib/gcc.l")
(gcc "fast" NIL 'fastNth)

any fastNth(any ex) {
   any x = cdr(ex);
   int n = (unDig(EVAL(cadr(x)))>>1) - 1;
   x = EVAL(car(x));
   NeedVar(ex,x);

   int i;
   int A = 7 & n;
   int B = 7 & (n >>= 3);
   int C = 7 & (n >>= 3);
   int D = 7 & (n >>= 3);
   int E = 7 & (n >>= 3);
   int F = 7 & (n >>= 3);
   int G = (n >> 3);

   for (i = 0; i < G; ++i) x = cdr(x); x = car(x);
   for (i = 0; i < F; ++i) x = cdr(x); x = car(x);
   for (i = 0; i < E; ++i) x = cdr(x); x = car(x);
   for (i = 0; i < D; ++i) x = cdr(x); x = car(x);
   for (i = 0; i < C; ++i) x = cdr(x); x = car(x);
   for (i = 0; i < B; ++i) x = cdr(x); x = car(x);
   for (i = 0; i < A; ++i) x = cdr(x);
   return x;
}
/**/

the /**/ is an end-delimiter.

Enrique.

Reply via email to