Advertisement
Guest User

Untitled

a guest
Nov 30th, 2015
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. ;#lang planet neil/sicp
  2. #lang racket
  3. (require (planet soegaard/sicp:2:1/sicp))
  4. (define wave einstein)
  5.  
  6.  
  7. (define (make-leaf symbol weight)
  8. (list 'leaf symbol weight))
  9.  
  10. (define (leaf? obj)
  11. (eq? (car obj) 'leaf))
  12.  
  13. (define (symbol-leaf leaf)
  14. (cadr leaf))
  15. (define (weight-leaf leaf)
  16. (caddr leaf))
  17.  
  18.  
  19. (define (make-code-tree left right)
  20. (list left
  21. right
  22. (append (symbols left) (symbols right))
  23. (+ (weight left) (weight right))))
  24.  
  25. (define (left-branch tree) (car tree))
  26.  
  27. (define (right-branch tree) (cadr tree))
  28. (define (symbols tree)
  29. (if (leaf? tree)
  30. (list (symbol-leaf tree))
  31. (caddr tree)))
  32. (define (weight tree)
  33. (if (leaf? tree)
  34. (weight-leaf tree)
  35. (cadddr tree)))
  36.  
  37. (define (decode bits tree)
  38. (define (decode-1 bits current-branch)
  39. (if (null? bits)
  40. '()
  41. (let ((next-branch (choose-branch (car bits) current-branch)))
  42. (if (leaf? next-branch)
  43. (cons (symbol-leaf next-branch)
  44. (decode-1 (cdr bits) tree))
  45. (decode-1 (cdr bits) next-branch)))))
  46. (decode-1 bits tree))
  47.  
  48. (define (choose-branch bit branch)
  49. (cond ((= bit 0) (left-branch branch))
  50. ((= bit 1) (right-branch branch))
  51. (else (error "bad bit -- CHOOSE-BRANCH" bit))))
  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.  
  59. (define (make-leaf-set pairs)
  60. (if (null? pairs)
  61. '()
  62. (let ((pair (car pairs)))
  63. (adjoin-set (make-leaf (car pair)
  64. (cadr pair))
  65. (make-leaf-set (cdr pairs))))))
  66.  
  67. (define sample-tree
  68. (make-code-tree (make-leaf 'A 4)
  69. (make-code-tree
  70. (make-leaf 'B 2)
  71. (make-code-tree (make-leaf 'D 1)
  72. (make-leaf 'C 1)))))
  73.  
  74. (define sample-message '(0 1 1 0 0 1 0 1 0 1 1 1 0))
  75.  
  76. (define sample-symbol (decode sample-message sample-tree))
  77.  
  78. (define (encode message tree)
  79. (if (null? message)
  80. '()
  81. (append (encode-symbol (car message) tree)
  82. (encode (cdr message) tree))))
  83.  
  84. (define (encode-symbol symbol tree)
  85. (define (encode-symbol-1 symbol tree)
  86. (cond ((leaf? tree) '())
  87. ((container? symbol (symbols (left-branch tree)))
  88. (cons '0 (encode-symbol symbol (left-branch tree))))
  89. (else (cons '1 (encode-symbol symbol (right-branch tree))))))
  90. (if (container? symbol (symbols tree))
  91. (encode-symbol-1 symbol tree)
  92. (error "bad tree -- CONTAINER? symbol" symbol)))
  93.  
  94. (define (container? symbol list-of-symbol)
  95. (cond ((null? list-of-symbol) false)
  96. ((eq? symbol (car list-of-symbol)) true)
  97. (else (container? symbol (cdr list-of-symbol)))))
  98.  
  99.  
  100. (encode sample-symbol sample-tree)
  101.  
  102. (define (generate-huffman-tree pairs)
  103. (successive-merge (make-leaf-set pairs)))
  104.  
  105. (define (successive-merge order-set)
  106. (define (successive-merge-1 x order-set)
  107. (if (null? order-set)
  108. x
  109. (successive-merge (adjoin-set (make-code-tree x (car order-set))
  110. (cdr order-set)))))
  111. (successive-merge-1 (car order-set) (cdr order-set)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement