【问题标题】:Merging dotted pairs into a Huffman tree将点对合并到霍夫曼树中
【发布时间】: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


【解决方案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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多