【发布时间】:2019-02-21 14:05:57
【问题描述】:
我有一个名为 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))
pairs 在使用时完美运行(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 出现错误...
【问题讨论】:
-
我认为您没有正确吸收来自:stackoverflow.com/questions/15350954/… 的建议;从
make-code-tree返回的数据类的数据定义在哪里? (就此而言,您的leaf?程序在哪里定义?
标签: merge scheme huffman-code