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