最近写了一个算法,可用于 (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 本身占的空间是另外一回事。
有需要该算法的公司或个人,请联系本人