R5RS方案,霍夫曼树函数

时间:2015-11-07 21:27:00

标签: tree scheme heap huffman-code r5rs

目标是创建一个huffman树(google,如果你不知道它是什么),其输出不包含值的权重,只是位于占位符“internal”所包含的叶子中的值。我创建了一个看起来正确的工作函数,除了每个“内部”都有额外的空列表存在,不应该存在。如果有人可以查看代码并查看我的错误或优化方法,我会很感激。

(define (build-huffman lst)
  (let ((x (insert-list-of-pairs lst '())))
    (define (huffman-help heap)
      (if (null? (remove-min heap))
          heap
          (let ((rx (remove-min heap)))
            (if (list? (h-min heap))
                (huffman-help (insert (cons (make-internal-node (value (h-min heap))
                                                                (value (h-min rx)))
                                            (+ (weight (h-min rx))
                                               (weight (h-min heap))))
                                       (remove-min rx)))
                (huffman-help (insert (cons (make-internal-node (create-heap (value (h-min heap)) '() '())
                                                                (create-heap (value (h-min rx)) '() '()))
                                          (+ (weight (h-min rx))
                                             (weight (h-min heap))))
                                      (remove-min rx)))))))
  (car (car (huffman-help x)))))

有些功能是自我解释的,我知道问题在这段代码中,而不是任何其他功能。

(insert-list-of-pairs) - 列出一对对,例如。 “((编号7)(是的.4)),”并将其插入堆中。

(insert) - 将一对插入堆中。

(remove-min) - 删除堆的最小值。

(make-internal-node 0-tree 1-tree) - > (列出'内部0树1树)

1 个答案:

答案 0 :(得分:0)

你找过一个模式吗?在我看来,在没有更多相同的节点添加到树之后,您的代码会添加空列表。它看起来像是家庭作业,所以我不能给你一个答案,但看看你的代码,看看你是否可以在添加最后一个相同重量的节点后告诉它停止。