将虚线对合并到霍夫曼树中

时间:2013-03-12 17:01:18

标签: merge scheme huffman-code

我有一个名为make-leaf-set的过程,它创建叶子节点,另一个过程对最低的第一个高点进行排序。

(define (make-leaf-set pairs)
   (if (null? pairs)
    '()
    (let ((pair (car pairs)))
      (adjoin-set (make-leaf (car pair)
                             (cdr pair))
                (make-leaf-set (cdr pairs))))))


(define (adjoin-set x set)
  (cond ((null? set) (list x))
    ((< (weight x) (weight (car set))) (cons x set))
    (else (cons (car set)
                (adjoin-set x (cdr set))))))


"Predefined dotted paires"
(define pairs '((a . 2) (b . 5) (c . 1) (d . 3) (e . 1) (f . 3)))
=> ((leaf e 1) (leaf c 1) (leaf a 2) (leaf f 3) (leaf d 3) (leaf b 5))
使用时,

对完美地工作(make-leaf-set pair)。一切都有分类。 我还使用另一个名为make-code-tree

的过程
(define (make-code-tree left right)
  (list left
        right
    (append (symbols left) (symbols right))
    (+ (weight left) (weight right))))

(define (symbols tree)
  (if (leaf? tree)
     (list (symbol-leaf tree))
     (caddr tree)))

(define (weight tree)
   (if (leaf? tree)
     (weight-leaf tree)
     (cadddr tree)))
  • 目标是创建一个程序,该程序获取对的列表,然后创建一个霍夫曼树。

作为一个开始,我已经搞砸了这个

(define (grow-huffman-tree list)
  (successive-merge (make-leaf-set list) '()))

 (define (successive-merge par tree)
   (if (null? par)
      tree
   (append (make-code-tree (car par) (cadr par)) tree)))

当它坐在它时,它会合并两个第一个元素并给出((leaf e 1) (leaf c 1) (e c) 2)。 但是我想让它合并所有的叶子,所以它像霍夫曼树一样构建,我无法将其他叶子合并到这个树中。我试图调用(successive-merge (cdr par) tree)会导致元素d 3 ...

出错

1 个答案:

答案 0 :(得分:1)

我建议你从较小的初始示例开始,并根据这里是否真的是一个合适的帮助程序来计算出grow-huffman-tree(或许successive-merge)对每个较小的例子。

,例如,我很难相信successive-merge中的这一行:

(append (make-code-tree (car par) (cadr par)) tree)

可能完全没有任何意义。 (但话说回来,如果没有tree的数据定义,包括如何解释类​​的实例,很难说什么是废话而不是“聪明”。

请记住,“霍夫曼树”中的“树”这个词非常相关。你不想建立一个Listof X;你想要一个 Treeof X.所以,如果你看到打印出的数据如下:

 ((obj 1 2) (obj 3 4) (obj 5 6) ... (obj 100 101))

通常被视为一棵有趣的树;通常被认为是一个列表。 (严格来说,它可以解释为树;只是一棵非常浅的树,具有非常大的分支因子。)

更常见的树结构示例最终会打印出类似这样的内容:

 (node a 1 (node b 2 (leaf 17)
                     (node d (leaf 26)
                             (leaf 17)))
           (node c 6 (leaf 18)
                     (leaf 1)))