Tree 方案2哈夫曼BST的最小值

Tree 方案2哈夫曼BST的最小值,tree,scheme,racket,binary-search-tree,huffman-code,Tree,Scheme,Racket,Binary Search Tree,Huffman Code,好的,假设我得到了一个包含字母的配对列表,以及它在文本中出现的频率或次数。ex'(#\a.4)(#\b.2)(#\c.9))如何找到两个最低频率,以便将它们组合成一棵树?有什么函数可以帮助我找到这些吗?看看这本书中的一节,你会发现关于如何从头开始实现哈夫曼编码树的完整解释 关于这个问题,有一种可能的方法可以在指定格式的列表中找到两个最低频率: (define frequencies '((#\a . 4) (#\b . 2) (#\c . 9))) (take (sort frequenci

好的,假设我得到了一个包含字母的配对列表,以及它在文本中出现的频率或次数。ex'(#\a.4)(#\b.2)(#\c.9))如何找到两个最低频率,以便将它们组合成一棵树?有什么函数可以帮助我找到这些吗?

看看这本书中的一节,你会发现关于如何从头开始实现哈夫曼编码树的完整解释

关于这个问题,有一种可能的方法可以在指定格式的列表中找到两个最低频率:

(define frequencies '((#\a . 4) (#\b . 2) (#\c . 9)))

(take
 (sort frequencies
       (lambda (x y)
         (< (cdr x) (cdr y))))
 2)

=> '((#\b . 2) (#\a . 4))
(定义频率’(#\a.4)(#\b.2)(#\c.9)))
(拿
(分类频率)
(λ(x y)
(<(cdr x)(cdr y)))
2)
=>'((#\b.2)(#\a.4))
看看这本书的一节,你会发现关于如何从头开始实现哈夫曼编码树的完整解释

关于这个问题,有一种可能的方法可以在指定格式的列表中找到两个最低频率:

(define frequencies '((#\a . 4) (#\b . 2) (#\c . 9)))

(take
 (sort frequencies
       (lambda (x y)
         (< (cdr x) (cdr y))))
 2)

=> '((#\b . 2) (#\a . 4))
(定义频率’(#\a.4)(#\b.2)(#\c.9)))
(拿
(分类频率)
(λ(x y)
(<(cdr x)(cdr y)))
2)
=>'((#\b.2)(#\a.4))

仅使用未排序的频率列表表示可能不是解决此问题的正确方法。原因如下:反复寻找最小值是计算哈夫曼编码树的主要操作。在重复此“最小查找”操作时,您不希望继续搜索整个列表

作为问题的第一个攻击:将排序看作是寻找最小值的一种快速操作方法。

但是,对于这个特定的问题,您可能应该考虑使用二进制,它是表示集合的数据结构。它有一个非常酷的特性,即从堆中提取最小元素非常便宜。在哈夫曼树的构建过程中,您将在集合中加入新元素。你不想一次又一次地使用这个列表

Racket在其标准库中的集合中有一个二进制堆的实现。它在哈夫曼树构造中的应用相当简单。下面使用堆实现基本算法:

(require data/heap)

;; ...

;; make-huffman-tree: (listof leaf) -> node
(define (make-huffman-tree leaves)
  (define a-heap (make-heap node<=?))
  (heap-add-all! a-heap leaves)
  (for ([i (in-range (sub1 (length leaves)))])
    (define min-1 (heap-min a-heap))
    (heap-remove-min! a-heap)
    (define min-2 (heap-min a-heap))
    (heap-remove-min! a-heap)
    (heap-add! a-heap (merge (+ (frequency min-1) (frequency min-2))
                             min-1 min-2)))
  (heap-min a-heap))
(需要数据/堆)
;; ...
;; 制作哈夫曼树:(叶列表)->节点
(定义(制作哈夫曼树叶)

(定义a-heap)(使堆节点仅使用频率的未排序列表表示可能不是解决此问题的正确方法。原因如下:重复查找最小值是计算哈夫曼编码树的主要操作。重复此最小值查找操作时,您不希望继续搜索整个列表

作为问题的第一个攻击:将排序看作是寻找最小值的一种快速操作方法。

但是,对于这个特殊的问题,你应该考虑使用二进制,它是表示集合的数据结构。它有一个非常酷的属性,从堆中拉出最小元素非常便宜。在赫夫曼树构建过程中,你将结束向集合中添加新元素。你不想一次又一次地使用这个列表

Racket在其标准库中的集合中有一个二进制堆的实现。它在Huffman树构造中的应用相当简单。下面用堆实现基本算法:

(require data/heap)

;; ...

;; make-huffman-tree: (listof leaf) -> node
(define (make-huffman-tree leaves)
  (define a-heap (make-heap node<=?))
  (heap-add-all! a-heap leaves)
  (for ([i (in-range (sub1 (length leaves)))])
    (define min-1 (heap-min a-heap))
    (heap-remove-min! a-heap)
    (define min-2 (heap-min a-heap))
    (heap-remove-min! a-heap)
    (heap-add! a-heap (merge (+ (frequency min-1) (frequency min-2))
                             min-1 min-2)))
  (heap-min a-heap))
(需要数据/堆)
;; ...
制作哈夫曼树:(叶子列表)->节点
(定义(制作哈夫曼树叶)

(定义a-heap)(做堆点头你之前的所有问题都没有接受一个答案,请点击所有问题中最佳答案左边的复选标记。闻起来像是家庭作业。试着至少草拟一个基本程序,遇到问题时带着问题回来。你之前的所有问题都没有接受一个答案问题,请点击所有问题最佳答案左侧的复选标记。闻起来像是家庭作业。尝试至少草拟一个基本程序,遇到问题时带着问题回来。