[plt-scheme] help on how to write a frequency-counting function in a more functional way
Frequencies come in ranges and my guess is that you have the full
range of them.
If so, I would have no hesitations giving up pure FP and use a vector
in the proper range. I doubt very much any FP technique comes close
in efficiency.
-- Matthias
On Apr 18, 2009, at 4:18 PM, keydana at gmx.de wrote:
> Hi,
>
> today on one of the extremely rare occasions where I can use scheme
> at work, I had to get at the frequencies for a list of ids
> extracted from a logfile. E.g., I had a list like
>
> '(1234 1234 5678 1234)
>
> and wanted to, on the one hand, remove the duplicates and, on the
> other hand, store how many instances there were of each id.
> For example, if represented as an alist, the result might have
> looked like this:
>
> '((1234 3) (5678 1))
>
> However, I could not imagine a "purely functional" way to do this,
> and so I used a box to update the frequencies, like so:
>
> (define count
> (lambda (lst)
> (let count-accum ((lst lst) (frequencies '()))
> (if (null? lst)
> frequencies
> (let ((first (car lst)))
> (cond ((assoc first frequencies)
> (let ((count-box (cdr (assoc first frequencies))))
> (begin (set-box! count-box (+ 1 (unbox count-
> box)))
> (count-accum (cdr lst) frequencies))))
> (else (count-accum (cdr lst) (cons (cons first
> (box 1)) frequencies)))))))))
>
>
> (I also considered a hashtable, which would have been equally
> "impure" and less practical, because the next processing step again
> required a list).
>
> I suppose there must be "more functional" (if I may say so) and
> more elegant ways to perform this task. I'd be glad to learn and
> thankful for any suggestions :-)
>
> Ciao
> Sigrid
>
>
> _________________________________________________
> For list-related administrative tasks:
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20090418/9fa34888/attachment.html>