Merge 将点对合并到哈夫曼树中

Merge 将点对合并到哈夫曼树中,merge,scheme,huffman-code,Merge,Scheme,Huffman Code,我有一个名为makeleaveset的过程,它创建叶节点,还有一个过程,它将最低的先高排序 (define (make-leaf-set pairs) (if (null? pairs) '() (let ((pair (car pairs))) (adjoin-set (make-leaf (car pair) (cdr pair)) (make-leaf-set (cd

我有一个名为makeleaveset的过程,它创建叶节点,还有一个过程,它将最低的先高排序

(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))
  • 目标是创建一个过程,该过程获取一个对列表,然后创建一个哈夫曼树
作为开始,我已经搞定了

(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)))
当它就位时,它合并了前两个元素并给出了
((叶e1)(叶c1)(ec)2)

但是我想让它合并所有的叶子,这样它就可以像哈夫曼树一样生长起来,而我无法将其他的叶子合并到这棵树上。我尝试调用
(连续合并(cdr par)树)
将导致元素D3上的错误…

我建议您从较小的初始示例开始,并计算出什么是
生长霍夫曼树(可能还有
连续合并
,这取决于这是否真的是一个合适的助手例程)对于每一个较小的示例都是这样

例如,我很难相信连续合并中的这一行:

(append (make-code-tree (car par) (cadr par)) tree)
可能有任何意义。(但是,如果没有
的数据定义,其中包括如何解释类实例,那么很难说什么是无意义的,什么是“聪明的”

还请记住,“哈夫曼树”中的“树”一词非常相关。您不想建立一个X的
列表,而是想要一个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)))

我认为您没有正确地接受以下建议:;对于从
make code tree
返回的数据类,您的数据定义在哪里?
 (node a 1 (node b 2 (leaf 17)
                     (node d (leaf 26)
                             (leaf 17)))
           (node c 6 (leaf 18)
                     (leaf 1)))