University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

huffman.scm 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. ;;;;
  2. ;;;; Prekode til innlevering 2a i INF2810 (V17): Prosedyrer for å jobbe med
  3. ;;;; Huffman-trær, fra SICP, Seksjon 2.3.4.
  4. ;;;;
  5. ;;; Merk at koden under gjør bruk av diverse innebygde kortformer for
  6. ;;; kjeder av car og cdr. F.eks er (cadr x) det samme som (car (cdr x)),
  7. ;;; og (caadr x) tilsvarer (car (car (cdr x))), osv.
  8. ;;;
  9. ;;; Abstraksjonsbarriere:
  10. ;;;
  11. (define (make-leaf symbol weight)
  12. (list 'leaf symbol weight))
  13. (define (leaf? object)
  14. (eq? (car object) 'leaf))
  15. (define (symbol-leaf x) (cadr x))
  16. (define (weight-leaf x) (caddr x))
  17. (define (make-code-tree left right)
  18. (list left
  19. right
  20. (append (symbols left) (symbols right))
  21. (+ (weight left) (weight right))))
  22. (define (left-branch tree) (car tree))
  23. (define (right-branch tree) (cadr tree))
  24. (define (symbols tree)
  25. (if (leaf? tree)
  26. (list (symbol-leaf tree))
  27. (caddr tree)))
  28. (define (weight tree)
  29. (if (leaf? tree)
  30. (weight-leaf tree)
  31. (cadddr tree)))
  32. ;;;
  33. ;;; Dekoding:
  34. ;;;
  35. (define (decode bits tree)
  36. (define (decode-1 bits current-branch)
  37. (if (null? bits)
  38. '()
  39. (let ((next-branch
  40. (choose-branch (car bits) current-branch)))
  41. (if (leaf? next-branch)
  42. (cons (symbol-leaf next-branch)
  43. (decode-1 (cdr bits) tree))
  44. (decode-1 (cdr bits) next-branch)))))
  45. (decode-1 bits tree))
  46. (define (choose-branch bit branch)
  47. (if (= bit 0)
  48. (left-branch branch)
  49. (right-branch branch)))
  50. ;;;
  51. ;;; Sortering av node-lister:
  52. ;;;
  53. (define (adjoin-set x set)
  54. (cond ((null? set) (list x))
  55. ((< (weight x) (weight (car set))) (cons x set))
  56. (else (cons (car set)
  57. (adjoin-set x (cdr set))))))
  58. (define (make-leaf-set pairs)
  59. (if (null? pairs)
  60. '()
  61. (let ((pair (car pairs)))
  62. (adjoin-set (make-leaf (car pair)
  63. (cadr pair))
  64. (make-leaf-set (cdr pairs))))))
  65. ;;;
  66. ;;; Diverse test-data:
  67. ;;;
  68. (define sample-tree
  69. (make-code-tree
  70. (make-leaf 'ninjas 8)
  71. (make-code-tree
  72. (make-leaf 'fight 5)
  73. (make-code-tree
  74. (make-leaf 'night 1)
  75. (make-leaf 'by 1)))))
  76. (define sample-code '(0 1 0 0 1 1 1 1 1 0))