Web 应用程序比较成对的正整数集。每个集合只有唯一的值,不大于 210 000 000(适合 28 位)。每组最多 5 000 000 个值。
比较集合 A 和 B,需要三个结果集:“A 唯一”、“B 唯一”、“A 和 B 通用”。具体任务是回答一个问题“数字 N 是否存在于集合 S 中?”
到目前为止,该项目在 LAMP 堆栈下的共享主机的有限资源中运行。我想出的 Quick'n'dirty 解决方案是将工作外包给托管的 MySQL,它拥有更多的资源。每个集合的临时表,唯一带有数字的列是主索引。很少有集合足够小以适合引擎=内存,这很快。它可以工作,但是太慢了。
寻找一种将这样的集合保存在内存中的方法,对于在其中搜索特定数字的任务有效。尽可能降低内存占用。
我想到了将每个集合编码为 2^28 位 (32 Mb) 的位掩码的想法。集合中存在的数字 = 1 位集合。500 万个数字 = 2.1 亿个中的 500 万个比特。许多零==可以有效压缩?
好像我在发明一辆自行车。请指导我找到针对这种二进制压缩特殊情况的“众所周知”的解决方案。我读到了霍夫曼编码,这似乎不是正确的解决方案,因为它的重点是减小大小,而我的任务需要对压缩集进行多次搜索。
更新。刚刚找到一篇关于Golomb 编码的文章及其在运行长度编码中的应用示例。