我正在研究一个拥有成千上万个标志的系统。标志都是连续的数字,0到X,无论X最终是什么。 X预计会随着时间的推移而增长。而且我们期望拥有大量的用户。
我们主要关注的是:
使用10k标记,如果我们使用位向量,我们会在内存中查看每个用户大约1k的数据。哪个可能太多了。更糟糕的是,这是在Javascript中,存储在序列化为JSON的文档数据库中,这意味着我们有几个存储选项,其中没有一个我特别喜欢。
"{"0":10,"1":4294967295}"
。不幸的是,当标志接近其填充状态(占存储器的4倍以上)时,每4字节平均需要存储17个字节,并且在序列化时导致大约5k的存储器。这不太理想。所以...暂时搁置一下bitvector的想法。我想知道是否有更好的方法。我考虑过使用“数组范围”,例如:
[{"m":0,"x":100},{"m":102},{"m":108,"x":204}]
我们可以对这个系统中的数据做一些假设,这就是我采用这种方法的原因:
因此,由于这些条件,我认为存储范围对象数组可能是最佳解决方案。这样,随着时间的推移,用户的标志最终会缩小为一个大范围的条目。最佳情况当然是:
[{"m":0,"x":10000}]
最糟糕的情况当然是,如果他们以某种方式设法发现自己处于他们设置其他所有旗帜的状态。
[{"m":0},{"m":2},{"m":4},{"m":6},{"m":8},{"m":10}...{"m":10000}]
那会很糟糕。我认为,比bitvector解决方案要糟糕得多。但我们非常有信心不会发生这种情况。
因此,关于快速决定是否设置标志的能力;这只是一个O(logn)二进制搜索(因为数组将被排序);只需找到最接近您的号码的范围对象,检查您的号码是否在该范围内,然后返回。
插入更棘手。它仍然是二进制搜索,但现在我们正在修改数组。
所以案例2 + 3让我想知道我是否应该尝试使用某种平衡的二叉搜索树。例如,一棵红黑树。
值得这么麻烦吗?我是否想过这个?