V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
andybest
V2EX  ›  问与答

用什么方法的储存一串010101最节约空间?

  •  
  •   andybest · 2013-07-12 18:54:15 +08:00 · 3318 次点击
    这是一个创建于 4152 天前的主题,其中的信息可能已经有所发展或是发生改变。
    字串例如:"0001100101101110011010110010000001111010"

    由0与1组成,首位可能为0,长度不定,大于64位

    需要一种针对这种字串的压缩方式,可以以最节约空间的方式储存这堆字串

    想听听各位的想法和意见,必定感谢! :)


    ----------------------------------------
    我的想法是例如30位一切,前面补个1(防止转为整数时首位0被忽略),作为二进制字串转为十六进制整数,然后用逗号分隔累加出一个新字串
    但感觉这个方式挺笨,而且压缩/解压缩的时候并不会很高效
    21 条回复    1970-01-01 08:00:00 +08:00
    sNullp
        1
    sNullp  
       2013-07-12 18:58:10 +08:00   ❤️ 1
    就是32位切存unsigned int就是咯。。
    首位0有任何问题么,每个unsigned还原的时候都还原成32个字符就是了。
    andybest
        2
    andybest  
    OP
       2013-07-12 19:01:26 +08:00
    @sNullp 十分感谢!

    如果最后一切只有比如6位而且是:000101
    这样怎么处理比较妥善?
    sNullp
        3
    sNullp  
       2013-07-12 19:04:21 +08:00   ❤️ 1
    一个简单的办法是再加一个unsigned int记录字符串总长,然后把原字符串尾部补0到32的整数。
    ETiV
        4
    ETiV  
       2013-07-12 19:06:29 +08:00   ❤️ 1
    char * zero_one = "0001100101101110011010110010000001111010";
    timonwong
        5
    timonwong  
       2013-07-12 19:07:41 +08:00   ❤️ 1
    简单的话使用Run length encoding吧,无论是速度还是压缩率都可以。更高效算法也有,要运算量或实现难度来换。
    andybest
        6
    andybest  
    OP
       2013-07-12 19:08:47 +08:00
    @sNullp 谢谢! 转出来得到的多个unsigned int怎么存合适呢?像我想的那样用逗号分隔组合成一个字串?有没有更好的办法呢?
    andybest
        7
    andybest  
    OP
       2013-07-12 19:10:28 +08:00
    @ETiV 谢谢,请问这个*号是什么意思?在java语法里是什么?
    ETiV
        8
    ETiV  
       2013-07-12 19:17:18 +08:00   ❤️ 1
    ..........
    @andybest QQ里敲代码习惯了, 直接ctrl+回车发了出去...................没敲完啊- -
    andybest
        9
    andybest  
    OP
       2013-07-12 19:17:23 +08:00
    @timonwong 非常感谢!这种编码非常合适! +10086
    ETiV
        10
    ETiV  
       2013-07-12 19:17:37 +08:00   ❤️ 1
    @andybest C指针~
    andybest
        11
    andybest  
    OP
       2013-07-12 19:18:43 +08:00
    @ETiV 这样转换后,zero_one变量结果是啥?
    gracece
        12
    gracece  
       2013-07-12 19:29:30 +08:00   ❤️ 1
    我本来还想说哈夫曼压缩,不过好像用不上。
    ETiV
        13
    ETiV  
       2013-07-12 20:02:27 +08:00
    @andybest 这不是转换啊亲= =

    还没写完呢就发出去了
    daoluan
        14
    daoluan  
       2013-07-12 20:06:03 +08:00   ❤️ 1
    如果 0 居多的话可以用 《数据库系统实现》中讲到的压缩算法。
    Radeon
        15
    Radeon  
       2013-07-12 20:26:41 +08:00   ❤️ 1
    要想取得好的压缩比必先知道目标数据的特征

    如果没有特征(比如随机),那只能用2进制老老实实来编码
    deanguqiang
        16
    deanguqiang  
       2013-07-12 20:34:16 +08:00   ❤️ 2
    如果码流足够长并且足够随机,最简单的方法当然就是存成unsigned char 或者unsigned int之类的,没有进一步压缩的必要,并且解码也容易。如果一定要进一步压缩的话可以先8个或16 bit分组,再对组编码(比如霍夫曼),这样的话也许可以压缩的更多,不过相对的解压缩的成本也更大。
    clowwindy
        17
    clowwindy  
       2013-07-12 20:49:59 +08:00   ❤️ 1
    如果是你在生产环境下遇到这样的场景,用一楼说的方法。如果你是在做作业,去研究霍夫曼吧 = =
    dennisyang
        18
    dennisyang  
       2013-07-12 21:55:27 +08:00   ❤️ 1
    @clowwindy 试问这个怎么Huffman?分成N个k位的串?
    sNullp
        19
    sNullp  
       2013-07-12 23:12:32 +08:00   ❤️ 1
    @andybest 爱怎么存怎么存啊。。你一定要存到char[]里?那就按8bit分呗。
    hewwcn
        20
    hewwcn  
       2013-07-13 16:53:46 +08:00   ❤️ 1
    哈夫曼压缩会比直接存bit位省的吧。
    deanguqiang
        21
    deanguqiang  
       2013-07-13 17:50:18 +08:00 via iPhone   ❤️ 1
    @hewwcn 理论上肯定有增益,但是编码前比特序列足够随机足够长的话,可以压缩的水分应该非常小,再考虑到还要存储码本,解码复杂度也高一些,在生产环境中就要考虑其必要性了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1068 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.