algorithm - 4个字符的压缩算法
问题描述
我有一个包含 4 个值的地图。让我们为它们取键 0-3 并想象只使用这 4 个键(例如 0120123102312313 ..) 有没有一种有效的方法来无损压缩这个字符串?
解决方案
假设没有关于元素分布的信息(我们不知道任何元素比其他元素更常见),我们可以使用以下技术。
存储 4 个值之一所需的最小信息量仅为 2 位:00、01、10 或 11 可以表示映射中的 4 个不同元素。然后,如果您n
的字符串中有字符,您可以将其转换为长度为的位串2n
,例如,字符串12313
变为位串01 10 11 01 11
(为清楚起见添加了空格)。
如果您使用字符串的 base 36 编码(使用 10 位数字加 26 个字符),您可以一次将 5 位转换为单个字符(因为 2^5 = 32 <= 36)。这会产生一个字符串2/5 * n
,或者2.5x
与原始字符串相比进行压缩。
您可以通过使用具有更多不同字符的不同编码来充分利用该技术。例如,10 个数字 + 26 个大写字母 + 26 个小写字母 + 2 个标点符号 = 64 个字符,因此您可以使用这种编码将 6 位转换为一个可打印的 ASCII 字符。
如果元素的分布非常偏斜(例如,0 很常见,而 1、2 和 3 非常罕见),那么您可以看看Huffman encoding。但是我建议首先使用我上面描述的方法,因为它更简单,更容易理解。
推荐阅读
- reactjs - 从 React 中 GET 请求生成的路径加载图像
- python - Python pandas 错误:UnicodeDecodeError:'utf-8'编解码器无法解码位置 2 的字节 0xbd:无效的起始字节
- python - 为什么第 55 行不能在这个程序中编译?
- android - 如何让媒体播放器在 android minSdkVersion <24 上暂停和停止
- docker - 如何配置 Nginx 以侦听 vNIC IP?
- python - Youtube-api 验证应用程序 oauth 以从磁盘上传 yt 视频
- spring - Spring Security 总是在除 get 之外的所有请求上得到 401
- asp.net - 将文件从 cshtml 发送到控制器的操作方法导致“无法访问此站点”
- web - 如何在手机中获得良好的网站速度
- bash - 无法从 bash 的范围中获取最新项目