求压缩算法

FBI_NET 2004-11-02 12:56:31
将0-9、A-Z组成的40位字符串压成20位的字符串。
按我个人的思路就是将36进制转成更高的进制,不知道有没有更好的办法??
...全文
201 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
FBI_NET 2004-11-04
  • 打赏
  • 举报
回复
谢谢大家!
AhBian 2004-11-03
  • 打赏
  • 举报
回复
ZIP 压缩算法中,霍夫曼算法是很重要的。
利用霍夫曼算法编码时,就是用最短的编码表示最频繁的字符,较少出现的可以使用较长的编码,这就是不等宽编码的原理。

数据结构的教科书中,对霍夫曼算法有详细的介绍。
这是典型的计算数学,但不是广义上的数学,数学太博大了。
长江 2004-11-03
  • 打赏
  • 举报
回复
佩服!!
哈哈007哈 2004-11-03
  • 打赏
  • 举报
回复
up
FBI_NET 2004-11-03
  • 打赏
  • 举报
回复
TO:triout(笨牛)
老大,太佩服你了,今天我终于明白,原来数学是这么的博大精深,又一次后悔当初没学好数学~~
太感谢 triout(笨牛) 前辈了,看来我要补补数学才行:)
思路是有点想通了,我试试看能不能写出代码,多谢前辈指点:)
triout 2004-11-03
  • 打赏
  • 举报
回复
回复人: FBI_NET(FBI) ( ) 信誉:100 2004-11-02 14:11:00 得分: 0


我想了半天,也想不明白同样几个数字怎么可能用来表示出更简洁的数据,
比如0-9表示了10进制,所有的组合已经存在了,那怎么还能用这些字符表示出相等关系的位数更少的数据呢?想不明白~



你说想不明白,其实很简单,这就是一个编码的问题。

我前面说的3种编码、64进制等说法是:

你40个字符(0-9,A-Z)中,每个字符需要一个字节(8个二进制位)表示,总共需要320个二进制位,这是使用了标准的ASCII编码方式,如果我们不用这个编码方式,而使用自己的编码方式,比如对这36个字符分别用0-35来标识他们,这样,每个字符最多只要6个二进制位就可以识别了,然后把这40个字符的6个二进制位进行排列是240个二进制位,转换为标准的字节数据是30个字节,相比原来的40个字节就减少了,不过在解码的时候就需要自己写代码来识别这些字符了,同时还需要一张映射表,来说明某个编号对应的究竟是哪个字符。

而使用我后面讲的非等宽编码,原理基本一样
triout 2004-11-03
  • 打赏
  • 举报
回复
我说的冲突是指在实际操作中,由用户识别数字0和字母O的时候以及识别数字2和字母Z的时候,甚至数字1和小写字母l的时候都会出现难以区分究竟是数字还是字母的问题,并不是说他们在计算机中会有冲突,这是我在工作中经常遇到用户咨询的问题。

所以,我建议如果必要把这些字符都剔除,就只有32个字符了,用32进制刚好50%的压缩率
FBI_NET 2004-11-02
  • 打赏
  • 举报
回复
我想了半天,也想不明白同样几个数字怎么可能用来表示出更简洁的数据,
比如0-9表示了10进制,所有的组合已经存在了,那怎么还能用这些字符表示出相等关系的位数更少的数据呢?想不明白~
FBI_NET 2004-11-02
  • 打赏
  • 举报
回复
TO: triout(笨牛)
老大,你说的逐位取数好复杂,我看不明白,还有,数字0和字母O有冲突,数字2和字母Z有冲突,我不明白他们为什么有冲突,能说明白点吗?
谢谢 triout(笨牛)
谢谢大家:)
jimh 2004-11-02
  • 打赏
  • 举报
回复
如果你的数字跟字符是有一定规律的,那使用一套有效的编码可以压缩到一半一下,如果只是简单使用64位编码,那只有75%的效率
Alden 2004-11-02
  • 打赏
  • 举报
回复
UP
triout 2004-11-02
  • 打赏
  • 举报
回复
最好的办法就是使用32进制简单实现,达到50%的压缩率,但要求你把其中的部分字符剔除掉,比如:数字0和字母O有冲突,数字2和字母Z有冲突,这样把这4个字符都剔除就OK了。
triout 2004-11-02
  • 打赏
  • 举报
回复
所以,你可以针对你产生的40个字符进行分析,看哪些字符出现的频率高,然后进行适当的分配其的编码长度,才能得到最优解。
triout 2004-11-02
  • 打赏
  • 举报
回复
上面提到的3个压缩算法中,每个的最坏压缩率都是75%,最好的压缩率分别是:

62.5%

50%

37.5%

triout 2004-11-02
  • 打赏
  • 举报
回复
同意1楼的,用64进制来处理最简单,但只有75%的压缩率,达不到你要求的50%

一个比较复杂的算法是:

逐位取数,如果是1,则后面5位是数据(A-Z),如果是0,则后面4位为数据(0-9),这样,压缩率会稍有提高,理论为:71.53%。

另外的一个变通是:

逐位取数,如果是1,则后面5位是数字(A-Z、8、9),如果是0,则后面3位是数字(0-7),压缩率又有所提高,理论为:69.44%。

或者:

逐位取数,如果是1,则后面5位是数字(A-Z、4-9),如果是0,则后面2位是数字(0-3),理论压缩率为:70.83%。

如果要达到50%的压缩率,除非使用其他的压缩算法了,比如在上面压缩的基础上进一步压缩或直接对40个字符进行压缩。

trnbo 2004-11-02
  • 打赏
  • 举报
回复
同意64位,^_^
zhouyong2052 2004-11-02
  • 打赏
  • 举报
回复
36进制效率低,64进制吧!

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧