Huffman coding: Difference between revisions
Content added Content deleted
(added Ol) |
|||
Line 4,185: | Line 4,185: | ||
print_string "Symbol\tHuffman code\n"; |
print_string "Symbol\tHuffman code\n"; |
||
print_tree [] tree</lang> |
print_tree [] tree</lang> |
||
=={{header|Ol}}== |
|||
<lang scheme> |
|||
(define phrase "this is an example for huffman encoding") |
|||
; prepare initial probabilities table |
|||
(define table (ff->list |
|||
(fold (lambda (ff x) |
|||
(put ff x (+ (ff x 0) 1))) |
|||
{} |
|||
(string->runes phrase)))) |
|||
; just sorter... |
|||
(define (resort l) |
|||
(sort (lambda (x y) (< (cdr x) (cdr y))) l)) |
|||
; ...to sort table |
|||
(define table (resort table)) |
|||
; build huffman tree |
|||
(define tree |
|||
(let loop ((table table)) |
|||
(if (null? (cdr table)) |
|||
(car table) |
|||
(loop (resort (cons |
|||
(cons |
|||
{ 1 (car table) 0 (cadr table)} |
|||
(+ (cdar table) (cdadr table))) |
|||
(cddr table))))))) |
|||
; huffman codes |
|||
(define codes |
|||
(map (lambda (i) |
|||
(call/cc (lambda (return) |
|||
(let loop ((prefix #null) (tree tree)) |
|||
(if (ff? (car tree)) |
|||
(begin |
|||
(loop (cons 0 prefix) ((car tree) 0)) |
|||
(loop (cons 1 prefix) ((car tree) 1))) |
|||
(if (eq? (car tree) i) |
|||
(return (reverse prefix)))))))) |
|||
(map car table))) |
|||
</lang> |
|||
{{Out}} |
|||
<lang scheme> |
|||
(print "weights: ---------------------------") |
|||
(for-each (lambda (ch) |
|||
(print (string (car ch)) ": " (cdr ch))) |
|||
(reverse table)) |
|||
(print "codes: -----------------------------") |
|||
(map (lambda (char code) |
|||
(print (string char) ": " code)) |
|||
(reverse (map car table)) |
|||
(reverse codes)) |
|||
</lang> |
|||
<pre> |
|||
weights: --------------------------- |
|||
: 6 |
|||
n: 4 |
|||
i: 3 |
|||
f: 3 |
|||
e: 3 |
|||
a: 3 |
|||
s: 2 |
|||
o: 2 |
|||
m: 2 |
|||
h: 2 |
|||
x: 1 |
|||
u: 1 |
|||
t: 1 |
|||
r: 1 |
|||
p: 1 |
|||
l: 1 |
|||
g: 1 |
|||
d: 1 |
|||
c: 1 |
|||
codes: ----------------------------- |
|||
: (0 0 0) |
|||
n: (1 1 0) |
|||
i: (0 1 0 0) |
|||
f: (0 1 0 1) |
|||
e: (0 0 1 0) |
|||
a: (0 0 1 1) |
|||
s: (0 1 1 1) |
|||
o: (1 0 1 0) |
|||
m: (1 0 1 1) |
|||
h: (1 0 0 0) |
|||
x: (0 1 1 0 1) |
|||
u: (0 1 1 0 0 0) |
|||
t: (0 1 1 0 0 1) |
|||
r: (1 1 1 1 0) |
|||
p: (1 1 1 1 1) |
|||
l: (1 1 1 0 0) |
|||
g: (1 1 1 0 1) |
|||
d: (1 0 0 1 0) |
|||
c: (1 0 0 1 1) |
|||
</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |