P10 (*) 列表的游程编码
来源:互联网 发布:淘宝官方营销中心 编辑:程序博客网 时间:2024/06/02 08:24
问题描述
使用P09的结论来实现所谓的游程编码,这是一种数据压缩的方法。连续重复的元素会编码成(N E)
形式的列表,其中N
为元素E
重复的次数。如
sash> (encode '(a a a a b c c a a d e e e e))sash> ((4 a) (1 b) (2 c) (2 a) (1 d) (4 e))
解法
P09已经提供了将相同元素打包成子列表的函数,我们只需提供将子列表转换成(N E)
形式的函数即可,剩下的就是简单的列表递归。
递归实现
(define encode(lambda (ls) (let ([p (pack ls)] [enc (lambda (sub) (list (length sub) (car sub)))]) (let f ([p p]) (cond [(null? p) '()] [else (cons (enc (car p)) (f (cdr p)))])))))
这里用
let
绑定了一个局部的函数,因为该函数只在一个地方被使用。reduce实现
(define encode(lambda (ls) (let ([p (pack ls)] [enc (lambda (sub) (list (length sub) (car sub)))]) (fold-right (lambda (e a) (cons (enc e) a)) '() p))))
map实现
相比
reduce
,实际上这个更适合用map
实现,因为原列表和结果链表的元素的关系是一一对应的。
(define encode (lambda (ls) (let ([p (pack ls)] [enc (lambda (sub) (list (length sub) (car sub)))]) (map (lambda (e) (enc e)) p))))
0 0
- P10 (*) 列表的游程编码
- P13 (**) 列表的游程编码(直接编码)
- P12 (**) 解码游程编码过的列表
- 游程编码
- 游程编码
- 游程编码
- 游程编码
- 游程编码!
- 游程编码
- 游程编码
- 游程长度编码
- 游程长度编码
- 游程编码之加密
- 游程长度编码
- 游程编码算法
- 1138 -- 游程编码
- P11 (*) 游程编码改
- 1315: 游程编码
- jsp成绩单综合设计
- Objective-C
- 给新手一个python正则表达式的入门例子
- oracle中rownum和rowid的区别
- BMP图的格式以及C语言读取8位灰度图
- P10 (*) 列表的游程编码
- SimpleDateFormat使用详解
- Substrings
- 购物结算系统
- 私网IP如何访问Internet
- 判断两个字符串是否互为变形词
- HVR实战----Oracle数据库之间的简单同步
- 中国护照上两行88个字符的含义
- 7.8 一阶常系数线性方程