-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy path50.rkt
33 lines (29 loc) · 990 Bytes
/
50.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#lang racket
(define (insert key v l)
(cond
[(empty? l) (list v)]
[(<= (key v) (key (car l))) (cons v l)]
[else (cons (car l) (insert key v (cdr l)))])
)
(define (build-tree freq-sym)
(let iter ([init-list (foldl (curry insert car) empty freq-sym)])
(if (empty? (cdr init-list))
(car init-list)
(iter (insert car
(list (+ (caar init-list) (caadr init-list)) (car init-list) (cadr init-list))
(cddr init-list)))))
)
(define (encode tree)
(let traverse ([node tree][code empty])
(cond
[(empty? (cddr node)) (list (list (cadr node) (list->string (reverse code))))]
[else (append
(traverse (cadr node) (cons #\0 code))
(traverse (caddr node) (cons #\1 code)))]))
)
(define (huffman sym-freq)
(encode
(build-tree (map (lambda (pair) (list (cadr pair) (car pair))) sym-freq)))
)
;------------------------------
(huffman '((a 45)(b 13)(c 12)(d 16)(e 9)(f 5)))