Algorithm 筛选集合上的范围查询
我们有一套钥匙 对于成员资格查询(k在S中吗?),bloom过滤器通常帮助我们快速确定密钥不在集合中Algorithm 筛选集合上的范围查询,algorithm,search,data-structures,dictionary,bloom-filter,Algorithm,Search,Data Structures,Dictionary,Bloom Filter,我们有一套钥匙 对于成员资格查询(k在S中吗?),bloom过滤器通常帮助我们快速确定密钥不在集合中 我们如何过滤范围查询(S中的[k1,k2]范围是否有键?您是否可以控制要测试的范围的长度?如果范围很小(k2-k1
我们如何过滤范围查询(S中的[k1,k2]范围是否有键?您是否可以控制要测试的范围的长度?如果范围很小(k2-k1<某个较小的数字),那么您可以使用之前的bloom过滤器检查范围内的每个k。通过确保其中一个哈希的低阶字节/位完整地通过哈希函数,您可以更快地测试多个值 例如,您有散列函数f(x)和散列函数g(x)。定义f(x)时,f(x)=散列函数(x div 16)+x mod 16 搜索时,可以在f(x)结果周围的2个字节(16位)中搜索1位。如果找到一个,测试相应的命中值 这意味着您可以通过快速的双字节检索一次搜索16个匹配值
请注意,以这种方式使用哈希函数可能会以其他方式影响结果。您可以使用段树或Fenwick树在时间O(logn)内解决此问题 对于段树,您可以问这样一个问题:在[a..b]范围内是否设置了位?这个问题可以在时间O(logn)内得到回答。此外,您还可以在时间O(log n)中设置(或取消设置)单个位 与芬威克树类似
假设:键k1、k2等。。。是整数-我们必须做这个假设,这样我们才能理解范围[k1..k2]。是真的,但我对范围没有一个很小的界限。如果你知道值的分布(线性、对数等),那么你可以压缩你的范围,并使用Fenwick树进行近似集成员测试。这将稍微减少您的搜索空间。B-trees或任何其他搜索树也可以让您在O(log n)中回答范围查询。@IritKatriel True,但它们主要用于磁盘上。当用户提到“过滤器”时,我认为它主要用于内存中的过滤,其中误报是可以接受的(比如bloom过滤器)。另外,对于“筛选器”数据结构,内存使用非常重要-Fenwick树的内存占用率较低,而B树的内存占用率则要大得多-这是因为节点中浪费了空间。@IritKatriel再次强调,如果您知道范围在静态范围内,您也可以使用vEB树-每个字典操作的成本为O(lg n)。