首页 > 其他分享 >sicp每日一题[2.69]

sicp每日一题[2.69]

时间:2024-11-04 19:47:38浏览次数:1  
标签:set leaf 2.69 每日 tree sicp merge make procedure

Exercise 2.69

The following procedure takes as its argument a list of symbol-frequency pairs (where no symbol appears in more than one pair) and generates a Huffman encoding tree according to the Huffman algorithm.

(define (generate-huffman-tree pairs)
  (successive-merge (make-leaf-set pairs)))

make-leaf-set is the procedure given above that transforms the list of pairs into an ordered set of leaves. successive merge is the procedure you must write, using make-code-tree to successively merge the smallest-weight elements of the set until there is only one element left, which is the desired Huffman tree. (This procedure is slightly tricky, but not really complicated. If you find yourself designing a complex procedure, then you are almost certainly doing something wrong. You can take significant advantage of the fact that we are using an ordered set representation.)


这道题虽然题目说不会很复杂,但是我觉得还是挺难的。首先是要理解 successive-merge 的作用,它是要把一个个叶子按照权重由小到大依次合并成一个树,由于参数已经用 make-leaf-set 进行了排序,所以我们只要从前往后依次把这些“叶子”合并起来就行,每次合并好的树作为一个新的“叶子”与其他叶子一起进行新的合并;这里要注意合并后的树的权重可能会超过排在它之后的叶子,所以要重新对这些“叶子”按权重排序,这里我们可以直接用前面的 adjoin-set 来实现,完整代码如下:

(define (successive-merge leaf-set)
  (if (null? leaf-set)
      '()
      (let ((first (car leaf-set))
            (last (cdr leaf-set)))
        (if (null? last)
            first
            (successive-merge (adjoin-set (make-code-tree first (car last))
                                          (cdr last)))))))

(define pairs1 '((A 4) (B 2) (C 1) (D 1)))
(define pairs2 '((A 8) (B 3) (C 1) (D 1) (E 1) (F 1) (G 1) (H 1)))

(generate-huffman-tree pairs1)
(generate-huffman-tree pairs2)

; 结果如下
'((leaf A 4) ((leaf B 2) ((leaf D 1) (leaf C 1) (D C) 2) (B D C) 4) (A B D C) 8)
'((leaf A 8)
  ((((leaf H 1) (leaf G 1) (H G) 2) ((leaf F 1) (leaf E 1) (F E) 2) (H G F E) 4)
   (((leaf D 1) (leaf C 1) (D C) 2) (leaf B 3) (D C B) 5)
   (H G F E D C B)
   9)
  (A H G F E D C B)
  17)

标签:set,leaf,2.69,每日,tree,sicp,merge,make,procedure
From: https://www.cnblogs.com/think2times/p/18526094

相关文章

  • LeetCode 每日一题,用 Go 实现两数之和的非暴力解法
    题目给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],target......
  • 10.25 每日总结(敏捷开发知识点)
    今天主要还是学习软考,主要学习了敏捷开发的相关内容,之前也搞过敏捷开发所以理解起来还算可以。学习时长2小时。下面贴出敏捷开发的知识点:敏捷开发响应变化胜过遵循计划结对编程:一个程序员开发,另一个程序在一旁观察审查代码,能够有效的提高代码质量,在开发同时对代码进行初步审查......
  • 10.23 每日总结(备案信息添加)
    之前几个月向公安和ICP分别备案。但是自己的网站一直没来得及跳转备案信息。现在补上。 另外,今天学习时长两小时。学习SpringCloud的OpenFeign整合Sentinel。修改cart-service模块的application.yml文件,开启Feign的sentinel功能:feign:sentinel:enabled:true#开启fe......
  • 10.24 每日总结(今天继续学习软考)
    终于又开始学习软考了。学习时长2小时。学习的的软件工程模块(下面懒得敲,就直接粘贴了):结构化方法:流程固定,针对需求明确的项目,自顶向下,逐层分解,面向数据流。将数据流映射为软件系统的模块结构,数据流类型包括变换流型和事务流型,不同类型的数据流有不同的映射方法。以瀑布模型为代......
  • 10.18 每日总结(今日SpringCloud)
    今天暂软考进度,继续学习之前说过的SpringCloud。代码时长2小时,学习时长2小时。之前了解了服务雪崩,现在给出解决方案 熔断机制(服务熔断)(CircuitBreaker)熔断机制是通过监控系统的调用情况来进行的保护措施。服务一旦检测到请求异常率达到某个阈值,会主动熔断,停止对下游的请求......
  • 10.19 每日总结(今日Sentinel)
    今天学习服务保护框架Sentinel。学习时长2小时  运行代码java-Dserver.port=8090-Dcsp.sentinel.dashboard.server=localhost:8090-Dproject.name=sentinel-dashboard-jarsentinel-dashboard.jar微服务整合我们在`cart-service`模块中整合sentinel,连接`sentinel-......
  • Leetcode每日一题 3226. 使两个整数相等的位更改次数
    Leetcode每日一题##3226.使两个整数相等的位更改次数###C++给你两个正整数n和k。你可以选择n的二进制表示中任意一个值为1的位,并将其改为0。返回使得n等于k所需要的更改次数。如果无法实现,返回-1。解题思路:通过除2取余依次获得两个数对应的二进制位......
  • sicp每日一题[2.67-2.68]
    Exercise2.67Defineanencodingtreeandasamplemessage:(define(make-leaf-setpairs)(if(null?pairs)'()(let((pair(carpairs)))(adjoin-set(make-leaf(carpair);symbol(cadrpai......
  • 20241030每日一题洛谷P1147
    普及-每日一题洛谷P1147题目描述对一个给定的正整数\(M\),求出所有的连续的正整数段(每一段至少有两个数),这些连续的自然数段中的全部数之和为\(M\)。例子:\(1998+1999+2000+2001+2002=10000\),所以从\(1998\)到\(2002\)的一个自然数段为\(M=10000\)的一个解。输入格式......
  • 20241029每日一题洛谷P1024
    普及-每日一题洛谷P1024有形如:\(ax^3+bx^2+cx+d=0\)这样的一个一元三次方程。给出该方程中各项的系数(\(a,b,c,d\)均为实数),并约定该方程存在三个不同实根(根的范围在\(-100\)至\(100\)之间),且根与根之差的绝对值\(\ge1\)。要求由小到大依次在同一行输出这三个实......