【问题标题】:Storing and indexing binary strings in a database在数据库中存储和索引二进制字符串
【发布时间】:2011-09-29 16:12:24
【问题描述】:

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

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

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

【问题讨论】:

  • “我称它们为字符串,因为它们没有顺序” - 字符串有顺序 - 特别是字典顺序。
  • 当然,但通常位序列被称为“数字”,或者确切地说是整数,它们确实具有自然顺序。

标签: database algorithm indexing binary hamming-distance


【解决方案1】:

您可以使用类似于levenshtein automata 的方法,应用于位串:

  1. 计算满足您的汉明距离标准的第一个(按字典顺序最小的)位串。
  2. 从数据库中获取大于或等于该值的第一个结果
  3. 如果值匹配,则输出它并获取下一个结果。否则,计算下一个大于它的值 匹配,然后转到 2。

这相当于对您的数据库和可能的匹配列表进行合并连接,而不必生成每个可能的匹配。它会减少搜索空间,但仍可能需要大量查询。

【讨论】:

    【解决方案2】:

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

    那么说

    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)
    

    因此对于每个B,您将存储它对应的distB

    hamming(B,S) 的下限将是abs(distB-distS)。上限为distB+distS

    您可以丢弃所有B,使得下限高于最低上限。

    我不能 100% 确定选择哪个C 的最佳方式。我想你会希望它是一个接近位串度量空间“中心”的位串。

    【讨论】:

    • 这相当于存储一个只有根节点的Bk-tree。它会有所帮助,但它仍然会留下很多搜索空间来检查。您可以将距离存储到多个字符串(又是 FHFQ bk-tree),但这需要一个具有多个不等式的查询,而这无法在一维索引上有效地评估。
    • @tskuzzy:谢谢,正是我想要的。只是为了澄清答复:让 minDistB 是数据库中 B 的最小 distB,然后丢弃所有 B 使得: abs(distB-distS) > distS + minDistB。
    • @Nick Johnson:你是对的(感谢 BK-Tree 帖子链接)。实际上,明显的扩展是针对几个这样的 C 进行索引,分布在整个空间中,并让数据库索引几个 B,每个 C 一个。
    • @Adi 对。但是,没有办法有效地满足针对一维索引的多个不等式查询,因此节省的空间不会像使用实际的树结构来存储数据那么大。
    猜你喜欢
    • 2012-08-02
    • 2019-12-30
    • 1970-01-01
    • 2014-02-25
    • 2011-08-13
    • 2011-11-18
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多