同意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个字符进行压缩。

解决方案 »

  1.   

    最好的办法就是使用32进制简单实现,达到50%的压缩率,但要求你把其中的部分字符剔除掉,比如:数字0和字母O有冲突,数字2和字母Z有冲突,这样把这4个字符都剔除就OK了。
      

  2.   

    TO: triout(笨牛)
    老大,你说的逐位取数好复杂,我看不明白,还有,数字0和字母O有冲突,数字2和字母Z有冲突,我不明白他们为什么有冲突,能说明白点吗?
    谢谢 triout(笨牛)
    谢谢大家:)
      

  3.   

    我说的冲突是指在实际操作中,由用户识别数字0和字母O的时候以及识别数字2和字母Z的时候,甚至数字1和小写字母l的时候都会出现难以区分究竟是数字还是字母的问题,并不是说他们在计算机中会有冲突,这是我在工作中经常遇到用户咨询的问题。所以,我建议如果必要把这些字符都剔除,就只有32个字符了,用32进制刚好50%的压缩率
      

  4.   

    回复人: 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个字节就减少了,不过在解码的时候就需要自己写代码来识别这些字符了,同时还需要一张映射表,来说明某个编号对应的究竟是哪个字符。而使用我后面讲的非等宽编码,原理基本一样
      

  5.   

    TO:triout(笨牛) 
    老大,太佩服你了,今天我终于明白,原来数学是这么的博大精深,又一次后悔当初没学好数学~~
    太感谢 triout(笨牛) 前辈了,看来我要补补数学才行:)
    思路是有点想通了,我试试看能不能写出代码,多谢前辈指点:)
      

  6.   

    ZIP 压缩算法中,霍夫曼算法是很重要的。
    利用霍夫曼算法编码时,就是用最短的编码表示最频繁的字符,较少出现的可以使用较长的编码,这就是不等宽编码的原理。数据结构的教科书中,对霍夫曼算法有详细的介绍。
    这是典型的计算数学,但不是广义上的数学,数学太博大了。