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

sicp每日一题[2.70]

时间:2024-11-05 20:31:44浏览次数:1  
标签:NA 2.70 symbol tree sicp YIP na encode 每日

Exercise 2.70

The following eight-symbol alphabet with associated relative frequencies was designed to efficiently encode the lyrics of 1950s rock songs. (Note that the “symbols” of an “alphabet” need not be individual letters.)

A    2   GET 2   SHA 3   WAH 1
BOOM 1   JOB 2   NA  16  YIP 9

Use generate-huffman-tree (Exercise 2.69) to generate a corresponding Huffmantree and use encode (Exercise 2.68) to encode the following message:

 Get a job
 Sha na na na na na na na na
 Get a job
 Sha na na na na na na na na
 Wah yip yip yip yip yip yip yip yip yip
 Sha boom

How many bits are required for the encoding? What is the smallest number of bits that would be needed to encode this song if we used a fixed-length code for the eight-symbol alphabet?


这道题本来应该是非常简单的,只需要调用 2.68 和 2.69 的函数就行,但是我却遇到了好几个麻烦,第一个是大小写问题,我在生成霍夫曼树的时候,用的都是题目中默认的大写字母,但是要翻译的歌词却是既有大写又有小写,所以在 encode-symbol 函数的 (eq? symbol (symbol-leaf tree)) 这一步就会跳出,我尝试了好几个方法也没找到怎么解决,最后直接把歌词改成全大写了。解决了大小写问题,我又遇到了相同的提示,一步步调试之后终于发现了问题,我练习 2.68 的 encode-symbol 本身就有问题,改完之后终于成功了。最后就是统计了一下长度,如果使用固定长度的编码,那么每个“符号”至少需要3个字符,程序如下所示:

(define (encode-symbol symbol tree)
  (if (leaf? tree)
      (if (eq? symbol (symbol-leaf tree))
          '()
          (error "bad symbol: The symbol is not in the tree at all!" symbol))
      (let ((left (left-branch tree)))
        (if (element-of-set? symbol (symbols left))
            (cons 0 (encode-symbol symbol left))
            (cons 1 (encode-symbol symbol (right-branch tree)))))))


(define pairs '((A 2) (GET 2) (SHA 3) (WAH 1) (BOOM 1) (JOB 2) (NA 16) (YIP 9)))
(define rock-tree (generate-huffman-tree pairs))
(define rock-song '(GET A JOB SHA NA NA NA NA NA NA NA NA GET A JOB SHA NA NA NA NA NA NA NA NA WAH YIP YIP YIP YIP YIP YIP YIP YIP YIP SHA BOOM))
(define encoded-rock-song (encode rock-song rock-tree))
(length encoded-rock-song)
(* 3 (length rock-song))

; 结果如下,由于编码后的内容是竖着的,太占地方了,就不贴了
84
108

标签:NA,2.70,symbol,tree,sicp,YIP,na,encode,每日
From: https://www.cnblogs.com/think2times/p/18528752

相关文章

  • 蓝桥杯每日一练--搜索旋转排序数组
    目录一、题目二、分析三、代码一、题目整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.length)上进行了 旋转,使数组变为 [nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](......
  • 每日OJ题_牛客_相差不超过k的最多数_滑动窗口_C++_Java
    目录牛客_相差不超过k的最多数_滑动窗口题目解析C++代码Java代码牛客_相差不超过k的最多数_滑动窗口相差不超过k的最多数_牛客题霸_牛客网(nowcoder.com)描述:        给定一个数组,选择一些数,要求选择的数中任意两数差的绝对值不超过 k 。问最多能选择多少......
  • sicp每日一题[2.69]
    Exercise2.69Thefollowingproceduretakesasitsargumentalistofsymbol-frequencypairs(wherenosymbolappearsinmorethanonepair)andgeneratesaHuffmanencodingtreeaccordingtotheHuffmanalgorithm.(define(generate-huffman-treepairs)......
  • 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取余依次获得两个数对应的二进制位......