0

我有一个名为 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))

pair 在使用时完美工作(make-leaf-set pairs)。一切都已排序。我还使用另一个称为 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 出现错误...

4

1 回答 1

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)))
于 2013-03-13T02:34:36.407 回答