• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

求压缩算法

FBI_NET 2004-11-02 12:56:31
将0-9、A-Z组成的40位字符串压成20位的字符串。
按我个人的思路就是将36进制转成更高的进制,不知道有没有更好的办法??
...全文
166 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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进制吧!
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-11-02 12:56
社区公告

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