Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 筛选集合上的范围查询_Algorithm_Search_Data Structures_Dictionary_Bloom Filter - Fatal编程技术网

Algorithm 筛选集合上的范围查询

Algorithm 筛选集合上的范围查询,algorithm,search,data-structures,dictionary,bloom-filter,Algorithm,Search,Data Structures,Dictionary,Bloom Filter,我们有一套钥匙 对于成员资格查询(k在S中吗?),bloom过滤器通常帮助我们快速确定密钥不在集合中 我们如何过滤范围查询(S中的[k1,k2]范围是否有键?您是否可以控制要测试的范围的长度?如果范围很小(k2-k1

我们有一套钥匙

对于成员资格查询(k在S中吗?),bloom过滤器通常帮助我们快速确定密钥不在集合中


我们如何过滤范围查询(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)。