Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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
Database 在数据库中存储和索引二进制字符串_Database_Algorithm_Indexing_Binary_Hamming Distance - Fatal编程技术网

Database 在数据库中存储和索引二进制字符串

Database 在数据库中存储和索引二进制字符串,database,algorithm,indexing,binary,hamming-distance,Database,Algorithm,Indexing,Binary,Hamming Distance,这里定义的二进制字符串是固定大小的位“数组”。我称它们为字符串,因为它们并没有顺序(将它们排序/索引为数字并没有意义),每一位都独立于其他位。每一个这样的字符串都有N位长,其中N为数百位 我需要存储这些字符串,并使用汉明距离作为距离度量,为最近的邻居提供一个新的二进制字符串查询。 有专门的数据结构(度量树)用于基于度量的搜索(VP树、覆盖树、M树),但我需要使用常规数据库(在我的例子中是MongoDB) 在执行一对一的汉明距离匹配之前,是否有一些可以应用于二进制字符串的索引功能可以帮助数据库仅访

这里定义的二进制字符串是固定大小的位“数组”。我称它们为字符串,因为它们并没有顺序(将它们排序/索引为数字并没有意义),每一位都独立于其他位。每一个这样的字符串都有N位长,其中N为数百位

我需要存储这些字符串,并使用汉明距离作为距离度量,为最近的邻居提供一个新的二进制字符串查询。
有专门的数据结构(度量树)用于基于度量的搜索(VP树、覆盖树、M树),但我需要使用常规数据库(在我的例子中是MongoDB)

在执行一对一的汉明距离匹配之前,是否有一些可以应用于二进制字符串的索引功能可以帮助数据库仅访问记录的子集?
或者,如何在标准数据库上实现这种基于汉明的搜索?

汉明距离是一个度量,因此它满足三角形不等式。对于数据库中的每个位字符串,可以将其汉明距离存储到某个预定义的常量位字符串。然后可以使用三角形不等式过滤掉数据库中的位字符串

那么让我们说

C <- some constant bitstring
S <- bitstring you're trying to find the best match for
B <- a bitstring in the database
distS <- hamming_dist(S,C)
distB <- hamming_dist(B,C)

C您可以使用类似的方法,应用于位字符串:

  • 计算符合汉明距离标准的第一个(按字典顺序排列的最小)位字符串
  • 从数据库中获取大于或等于该值的第一个结果
  • 如果该值匹配,则输出该值并获取下一个结果。否则,计算下一个大于匹配值的值,并转到2

  • 这相当于对数据库和可能匹配的列表进行合并联接,而不必生成所有可能的匹配。这将减少搜索空间,但仍可能需要大量的查询。

    “我称它们为字符串,因为它们没有顺序”-字符串有顺序-特别是字典。当然,通常位序列被称为“数字”,确切地说是整数,这相当于只存储根节点的Bk树。这会有所帮助,但仍会留下大量的搜索空间供检查。您可以存储到多个字符串的距离(一个FHFQ bk树),但这需要一个带有多个不等式的查询,在一维索引上无法有效计算这些不等式。@tskuzzy:谢谢,这正是我想要的。只是为了澄清答案:让minDistB成为数据库中最小的B,然后丢弃所有B,例如:abs(distB distS)>distS+minDistB。@Nick Johnson:你说得对(感谢BK树帖子链接)。事实上,明显的扩展是针对几个这样的C建立索引,分布在整个空间中,让数据库索引几个B,每个C一个。@Adi Right。但是,对于一维索引,无法有效地满足具有多个不等式的查询,因此节省的开销不会像使用实际的树结构来存储数据那样大。