【问题标题】:get pairs out of a huffman tree从霍夫曼树中取出对子
【发布时间】:2013-03-12 00:04:48
【问题描述】:

我正在尝试编写一个 Huffman-leaves 程序;该过程从创建的霍夫曼树中返回一个对列表。 运行方式示例

  (huffman-leaves sample-tree) 
   ->((A . 8) (C . 5) (B . 1) (D . 1))

我想出了什么,但被作家阻止了......

(define (huffman-leaves tree)
  (define (huffman-get-pairs current-branch pairs)
     (if (or (null? tree) (null? current-branch))
         pairs
         (let ((next-branch
                (get-branch (car current-branch) current-branch)))
           (not (member? next-branch pairs)
                (if (leaf? next-branch)
                    (cons (append  pairs next-branch)
                          (display pairs)
                          (huffman-get-pairs (cadr current-branch) pairs))
                    (huffman-get-pairs next-branch pairs))))))
  (huffman-get-pairs tree '()))

  (member? item 'list) #if item in list return #t else #false

我知道我做错了什么,但我看不到。 如何停止在方案中的霍夫曼树中搜索?有什么我应该做的不同的提示吗?

【问题讨论】:

  • 在不知道 Huffman Tree 的数据定义的情况下很难回答这样的问题。即,形式的评论:;; HuffmanTree 是以下之一:-(list 'Leaf Char Frequency),或:-(list 'Node HuffmanTree HuffmanTree)。 (我确定这个示例数据定义不是您想要的;它只是为了说明风格。

标签: list tree scheme huffman-code


【解决方案1】:

我推荐:

  1. 为 Huffman 树编写数据定义

  2. 制作示例输入哈夫曼树,根据您在步骤 1 中的数据定义和预期输出(在本例中为叶子列表)进行编码。

  3. 按照design recipehuffman-leaves 函数构建基本模板。

  4. 根据您在步骤 2 中构建的示例,在模板中填写 ...

  5. 将步骤 2 中的示例转换为测试,并测试步骤 4 中的代码。

抱歉,如果上述内容似乎含糊不清,但这是我迄今为止在此问题中提供的详细程度(或缺乏详细程度)所能提供的最佳建议。如果您可以为上述步骤提供答案,并明确说明您被阻止的步骤,那么我们可以帮助您以更系统的方式克服您的作家阻止。


如果您更喜欢真正的代码,您可以按照以下方向为您的问题制定一个非常通用的解决方案:

;; make-visitor : (X -> Y) (X -> [Listof X]) (Y [Listof Z] -> Z) -> Z
;; Very generic descend+map+recombine routine
;; (note X, Y, Z are implicitly universally quantified above).
(define (make-visitor transform children combine)
  (lambda (x)
    (let rec ((x x)) ;; rec : X -> Z
      (combine (transform x)
               (map rec (children x))))))

;; ... the hard bit is coming up with the appropriate lambda
;; expressions for `transform`, `children`, and `combine` above.

(define leaves
  (make-visitor (lambda (x) ...)
                (lambda (x) ...)
                (lambda (y zs) ...)))

我实际上不建议尝试直接跳到这种形式的解决方案;如果您尝试遵循设计配方并直接解决您的问题,您会做得更好。但是一旦你这样做了,它可以成为一个教育练习,看看你是否可以将你自己的解决方案改造成上面的通用例程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多