实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 key

最近写了一个算法,可用于 (key,value) 存储,key 当然是 string 类型。

用一个 2.3G 的 url 集合做测试,如果不计 value 占用的空间,key 集合的存储空间可以被压缩70倍!压缩后整个数据结构仅占31M内存!压缩率比 bzip2 还要高。

本质性的不同于: gzip, bzip2 等压缩算法仅仅是压缩而已,无法快速地从压缩数据中查找。

我实现的这个算法能高效地支持对 key 的查找,并且查找的时间复杂度仅与 key 的长度有关,不管数据集合有多大,时间复杂度总是 O(strlen(key))。实际数据:当 key 长度均值为 76 字节时(该 url 集合中所有 url 的平均长度),平均查找时间大约 900 纳秒(笔记本 i7-720M)。

可能有人以为是 bloom filter, MD5 之类投机取巧的实现方式,我付责任的地说:不是,该算法是确定性的。bloom filter/MD5 … 是概率的,并且它们的内存占用还要更多。

如果要让 key 再对应一个 value,并且仍然要以 O(strlen(key)) 的时间复杂度访问 value,需要再多用一点点空间用于索引结构,仍以前面 url 压缩为例,需要在 31M 的基础上多大约 4M 的空间。当然,value 本身占的空间是另外一回事。

有需要该算法的公司或个人,请联系本人

作者:
该日志由 csdn-whinah 于2012年05月06日发表在自动机分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
转载请注明: 实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 key
标签:
【上一篇】
【下一篇】

您可能感兴趣的文章:

15 个回复

  1. huangguan说道:

    我目前使用huffman压缩和索引,同时对你的方法很感兴趣,求交往。。。
    xiaoxia AT xiaoxia.org

  2. whinah说道:

    [reply]huangguan[/reply]
    你的方法可以按 key 实时查询? huffman 编码好像没有这个能力

  3. whinah说道:

    又加入了一些优化,对 2.3G url 的压缩率达到了 84 倍!

  4. whinah说道:

    之前编译选项忘了加 -mpopcnt,加上该选项后,平均查找时间从900纳秒降到了460纳秒

  5. whinah说道:

    还是服务器的 CPU 快,平均查找时间只有 280纳秒

  6. lovexyz说道:

    真想不通为嘛要遮遮掩掩,公开一下多好。
    不就一个算法么,算法导论上那么多都公开了。

    按描述特点,我猜是树算法。

  7. whinah说道:

    [reply]lovexyz[/reply]
    是基于自动机的算法,虽然很多编译原理、自动机教材上都讲自动机,但我还没看到任何一本书上有讲过这个算法。有一些教授的paper讲到了这个算法,但教授们给出的参考实现都很差,按他们paper中说的性能,比我的实现要差100倍以上,并且用的内存也更多。当然那些教授都很聪明,不过他们主要关注的是理论,我只是理论结合实践……

  8. whinah说道:

    [reply]lovexyz[/reply]
    有个基本算法是: Hopcroft DFA minimization algorithm, 那些教授们的 paper copy-paste 的成分也很大,在所有我能找到的paper中的描述的算法都有一个曾经令我很崩溃的很隐晦的bug,并且是同一个bug!你如果有兴趣的话,可以自己去实现一下,看看需要多少内存,能达到什么性能。还有其它一些 onfly minimization algorithm, 你也可以试着去实现

  9. whinah说道:

    实际代码请参考:http://code.google.com/p/febird
    [reply]babam[/reply]

  10. sulmassoft说道:

    可否方便提供一下联系方式啊。

  11. whinah说道:

    [reply]sulmassoft[/reply]
    csdn 站内联系

  12. sulmassoft说道:

    站内发不了信息啊,你没有关注我,所以我发不了站内信息啊。

  13. icymym说道:

    可以分享一下代码吗??想学习一下

发表评论

您必须 登录 后才能发表评论。