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

2013-07-12 18:54:15 +08:00
 andybest
字串例如:"0001100101101110011010110010000001111010"

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

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

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


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

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

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

如果没有特征(比如随机),那只能用2进制老老实实来编码
deanguqiang
2013-07-12 20:34:16 +08:00
如果码流足够长并且足够随机,最简单的方法当然就是存成unsigned char 或者unsigned int之类的,没有进一步压缩的必要,并且解码也容易。如果一定要进一步压缩的话可以先8个或16 bit分组,再对组编码(比如霍夫曼),这样的话也许可以压缩的更多,不过相对的解压缩的成本也更大。
clowwindy
2013-07-12 20:49:59 +08:00
如果是你在生产环境下遇到这样的场景,用一楼说的方法。如果你是在做作业,去研究霍夫曼吧 = =
dennisyang
2013-07-12 21:55:27 +08:00
@clowwindy 试问这个怎么Huffman?分成N个k位的串?
sNullp
2013-07-12 23:12:32 +08:00
@andybest 爱怎么存怎么存啊。。你一定要存到char[]里?那就按8bit分呗。
hewwcn
2013-07-13 16:53:46 +08:00
哈夫曼压缩会比直接存bit位省的吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/75589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX