【问题标题】:How do I store data with a query that's a approximated?如何使用近似查询存储数据?
【发布时间】:2011-05-10 09:21:34
【问题描述】:

我正在尝试找到一种方法来存储我的数据,并且可以快速访问(优于 O(n))。

我的数据库由数据(4096 字节字符串)组成,这些数据表示有关某些项目的一些信息。
问题是,查询永远不会准确。我得到一个项目,然后需要使用函数F(a,b) 找到最接近的匹配项。

只是一个例子:

1234
3456
6466
F(a,b) = return % of similar digits  

GetClosest(1233,F) = 1234

问题在于 F(a,b) 是一个复杂的算法,(不是一个合适的度量)。

我现在所拥有的只是遍历整个数据库以搜索最佳匹配。
有没有一种树或其他集群数据库类型可以让我更快地找到复杂性?

更多信息:

F 以百分比返回相似度值。其中 100% 是完美匹配。

【问题讨论】:

  • 是否可以在实际检索过程之前重新排列/存储数据 wrt 索引?

标签: database algorithm search approximation


【解决方案1】:

抱歉,答案是“可能不是”,除非您的问题还有一些您没有描述的结构。使用 4096 字节的字符串,您正遭受the curse of dimensionality 的困扰。

如果您有较短的字符串和足够的数据,那么在大部分字符串中最近的匹配很可能是相同的,那么您可以使用多个树状结构来存储您的数据,这些结构在不同的字符串块上建立索引.最近的很可能足够接近,您可以仅根据这些树中的接近元素证明它是最近的。但是,由于字符串的大小和可以存储在计算机中的有限数据,这不可能奏效。

也就是说,您需要最接近的,还是只需要稍微接近的?如果只是可能接近的一个,那么您可以通过几个随机稀疏位样本对其进行索引。在您的搜索中,您只能检查与其中一个元素完全匹配的元素。这将大大减少搜索空间,同时拒绝更少的近邻,并可能产生合理的(即使经常是错误的)答案。

【讨论】:

    【解决方案2】:

    有什么方法可以为每个数据分配一个“分数”。

    您可以按分数对数据进行索引/排序。

    搜索时,您会为搜索条件分配一个分数,然后查找分数最接近的项目。

    这在很大程度上取决于您的数据和您对“差异”的定义是否可行。

    【讨论】:

    • 我无法为他们评分。它不是传递的,它是一个相似度分数。如果我根据与 A 的相似性对整个数据库进行评分,则无法找到与 B 的相似性。
    • 嗯,我确实说过这取决于您的数据。也许有人可以提出一个涉及树或贝叶斯算法的一些变体的解决方案。
    猜你喜欢
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多