`
febird
  • 浏览: 256209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现了一个压缩算法,在数据高度压缩的前提下,还可以快速查找 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 本身占的空间是另外一回事。

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


分享到:
评论

相关推荐

    压缩算法lz

    LZSS压缩算法是一种经典的文本压缩方法,其简单有效的机制使得它在很多场景下都能表现出色。通过对上述代码的分析,我们不仅了解了LZSS的基本原理,还掌握了其实现细节,这对于深入学习和应用这类算法非常有帮助。

    WEBKEY_PHPDEMO_脚本语言实现算法.rar

    标题中的"WEBKEY_PHPDEMO_脚本语言实现算法.rar"指示了这是一个关于WEBKEY的PHP演示项目,其中包含了使用脚本语言实现的各种算法。这个压缩包可能包含一系列的PHP源代码文件,用于展示如何在Web开发环境中运用脚本...

    数据结构与算法题解

    - 哈夫曼编码是一种用于数据压缩的有效编码方法,通过构建一个带权路径长度最小的二叉树来实现。 - 实例问题:给定一组字符及其出现频率,构造哈夫曼树并输出编码。 - **队列(Queue)** - 队列是一种先进先出...

    数据结构及算法的设计与实现

    数据结构及算法的设计与实现是计算机科学中一项重要的实践任务,它涵盖了多个关键知识点。首先,我们要关注的是哈夫曼编码器的设计。哈夫曼编码是一种用于无损数据压缩的高效算法,它基于频率构建最优的二叉树,使得...

    数据结构实验

    编写程序构造一个有序表La,从键盘接收一个关键字key,用二分查找法在La 中查找key,若找到则提示查找成功并输出key所在的位置,否则提示没有找到信息。 2.编写程序实现Hash表的建立、删除、插入以及查找操作。 ...

    cpp-FlyDB一个基于C语言实现的kv存储

    - FlyDB可能采用了哈希表或者B树等数据结构来实现键值对的快速查找和存储。这些数据结构允许O(1)或O(log n)的时间复杂度进行查找和插入操作,提升了性能。 4. **API设计** - 作为一个C库,FlyDB通常会提供一套...

    c# 实现位图算法(BitMap)

    位图算法(BitMap)是一种高效的数据结构,主要用于快速查询和存储大规模数据。下面将详细介绍 C# 中如何实现位图算法(BitMap)。 什么是 BitMap BitMap 的基本思想就是用一个 bit 位来标记某个元素对应的 Value...

    java版的数据结构与算法

    - 每个节点包含一个数据域和一个指向下一个节点的指针域。 - **双向链表** - 每个节点包含两个指针域,分别指向其前驱和后继节点。 **3.4 两种实现的对比** - **基于时间的比较** - 顺序存储的线性表在插入和...

    LAW文件解压缩+散列表

    在IT领域,散列表(Hash Table)是一种常用的数据结构,它通过散列函数将键(Key)映射到数组的特定位置,实现快速查找、插入和删除操作。散列表的关键特性是其平均时间复杂度为O(1),极大提高了数据处理效率。在本...

    52丨算法实战(一):剖析Redis常用数据类型对应的数据结构1

    Redis,作为一个高性能的键值(Key-Value)数据库,以其高效的读写能力和丰富的数据类型,广泛应用于缓存、消息队列等多个场景。它的数据类型包括字符串、列表、字典、集合和有序集合,这些数据类型对应着不同的数据...

    【万字长文】使用 LSM Tree 思想实现一个 KV 数据库.doc

    为了节省磁盘空间,SSTable文件在合并时通常会进行数据压缩,比如使用LZ4或Snappy等压缩算法。 测试: 实现过程中,通常会对插入、查找、加载等操作进行单元测试,以验证功能正确性和性能。 总的来说,通过LSM ...

    数据结构C#版课件.rar

    在这个"数据结构C#版课件"中,我们可以期待学习到C#语言实现数据结构的各种方法和技术。 一、线性数据结构 1. 数组:数组是最基础的数据结构,它是一系列相同类型元素的集合,可以通过索引访问。在C#中,有固定...

    数据结构线性表的实现与应用完整版.pdf

    单链表是另一种实现线性表的方式,每个元素(节点)包含数据和指向下一个元素的引用。单链表的插入和删除操作通常比顺序表更高效,因为它们只需要改变相邻节点的引用。下面是基于单链表的一些基本操作: 1. `...

    数据结构(1).docx

    在文件“数据结构(1).docx”中,我们详细探讨了几个重要的数据结构和算法主题:哈希表、哈夫曼编码、排序算法、查找算法以及数据结构的分类和特点。 哈希表是一种通过哈希函数计算关键字并映射到表中的数据结构。...

    ipsec(linux内核实现)

    * bydst、bysrc、byspi:三个 HASH 链表,用于快速查找 SA。 * refcnt:所有使用计数。 * lock:状态锁。 * id:SA 的 ID。 * sel:状态选择子。 * genid:Key manager bits。 * km:状态管理器。 * props:SA 的...

    数据结构-哈希表设计程序

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键(key)映射到一个固定大小的数组中,以此实现快速查找、插入和删除等操作。在数据结构设计中,哈希表是一个重要的组成部分,尤其对于大量数据的处理,它的...

    dic_code.rar_dic_dictionary MATLAB_matlab dic_字典

    在IT领域,字典数据结构是一种非常重要的工具,它用于存储和检索数据,通常关联一个键(key)和一个值(value)。在这个“dic_code.rar_dic_dictionary MATLAB_matlab dic_字典”压缩包中,我们关注的是一个用MATLAB...

    hbase 表设计

    HBase通过时间戳支持数据的版本控制,这意味着可以在不同的时间点存储同一列数据的多个版本。这对于那些需要跟踪数据修改历史的应用程序非常有用,但是也要求设计人员考虑到在检索数据时需要处理多个版本的数据。 ...

    十五个经典算法

    红黑树是一种自平衡二叉查找树,能够保证在最坏情况下树的高度保持在log(n)级别,从而确保操作效率。 - **性质**: - 节点要么是红色要么是黑色。 - 根节点总是黑色。 - 所有叶子节点(NIL节点,空节点)都是...

Global site tag (gtag.js) - Google Analytics