我正致力于设计用于查找类似哈希的索引策略。为图像生成哈希值。即
CREATE FUNCTION [dbo].[udf-Create-Range-Number] (@R1 money,@R2 money,@Incr money)
-- Syntax Select * from [dbo].[udf-Create-Range-Number](0,100,2)
Returns
@ReturnVal Table (RetVal money)
As
Begin
With NumbTable as (
Select NumbFrom = @R1
union all
Select nf.NumbFrom + @Incr
From NumbTable nf
Where nf.NumbFrom < @R2
)
Insert into @ReturnVal(RetVal)
Select NumbFrom from NumbTable Option (maxrecursion 0)
Return
End
这两个哈希值相似(基于汉明距离和Levenshtein距离),因此类似的图像。我有超过1.9亿个这样的哈希。我必须选择一个合适的索引数据结构,其中找到类似哈希的最坏情况复杂度不是O(n)。哈希数据结构不起作用,因为它将搜索&lt;,=和&gt; (或者会吗?)我可以找到汉明距离或其他距离来计算相似度,但在最坏的情况下,我最终会计算出1.9亿次。
这是我现在的策略:
目前我正在研究BTree,我将基于no对节点中的所有密钥进行排名。连续相同的字符并遍历排名最高的密钥,如果孩子的密钥等级小于父节点中其他密钥的等级,我将开始在父节点中遍历该密钥。如果父级的所有级别相同,我将执行正常的BTree遍历(givenkey&lt; nodeKey - &gt;转到nodeKey的子节点...使用ASCII比较),这就是我的问题所在。
因为它会在搜索中导致大量漏报。在最坏的情况下,我将仅遍历树的一部分,其中可能在其他遍历中找到可能相似的密钥。否则我必须搜索整个树,这也是O(n),我可能也没有树。
我觉得必须有一个更好的方法,现在我被困住了,听到有关打破问题的任何意见会很棒。请分享您的想法。
P.S:我不能使用任何外部数据库。
答案 0 :(得分:3)
首先,这是一个非常棘手的问题。不要期待整洁,整洁的答案。
我见过的一个近似数据结构是Spatial Approximation Sample Hierarchy (SASH)。
SASH(空间近似样本层次结构)是用于有效地计算相似性查询的近似答案的通用数据结构。相似性查询自然会出现在许多重要的计算环境中,特别是基于内容的多媒体数据库检索,以及用于聚类和分类的最近邻方法。
SASH仅使用距离函数来构建数据结构,因此距离函数(以及在您的情况下,图像哈希函数)也需要“好”&#34;。基本的直觉大致是如果A~B(图像A接近图像B)和B~C,那么通常是A~C。数据结构在相对接近的项目之间创建链接,并且您仅通过查看来修剪搜索对于更接近您的查询的事情。此策略是否真正有效取决于数据的性质和距离函数。
自从我看了SASH以来已经有10年左右的时间了,所以也可能有更新的发展。 Michael Houle's page似乎表明他对称为Rank Cover Trees的东西进行了较新的研究,这似乎与SASH的目的相似。这至少应该让你开始在该领域的研究;阅读一些论文并遵循参考线索。