【发布时间】:2016-11-28 01:14:53
【问题描述】:
我正在设计用于查找相似哈希的索引策略。为图像生成哈希。即
String A = "00007c3fff1f3b06738f390079c627c3ffe3fb11f0007c00fff07ff03f003000" //Image 1
String B = "6000fc3efb1f1b06638f1b0071c667c7fff3e738d0007c00fff03ff03f803000" //Image 2
这两个哈希值相似(基于 Hamming 距离和 Levenshtein 距离),因此图像相似。我有超过 1.9 亿个这样的哈希值。我必须选择一个合适的索引数据结构,其中查找相似哈希的最坏情况复杂度不是 O(n)。哈希数据结构不起作用,因为它会搜索 (或者会搜索吗?)。我可以找到汉明距离或其他距离来计算相似度,但在最坏的情况下,我最终会计算 1.9 亿次。
这是我现在的策略:
目前我正在研究 BTree,我将根据 no 对节点中的所有键进行排名。连续相同字符并遍历排名最高的键,如果孩子的键排名小于父节点中其他键的排名,我将开始在父节点中遍历该键。如果父级的所有等级都相同,我将进行正常的 BTree 遍历(givenkey 转到 nodeKey 的子节点..使用 ASCII 比较),这就是我的问题所在。
因为它会在搜索中导致大量的误报。在最坏的情况下,我将只遍历树的一部分,在其他遍历中可以找到潜在的相似键。否则我必须搜索整个树,这又是 O(n),我可能没有树。
我觉得必须有更好的方法,现在我被困住了,很高兴听到任何关于解决问题的意见。请分享您的想法。
P.S : 我不能使用任何外部数据库。
【问题讨论】:
-
所以给定一个字符串,你想在 190M 的数据库中找到最接近它的汉明距离?
-
不仅仅是汉明距离,它可以是任何技术。我想要一种方法来找到相似的字符串,而无需遍历所有字符串来说出非常相似的字符串。
-
我能想到的任何技术都需要检查所有其他字符串的相似性。但我想要一种技术,如果字符串以某种方式结构化,你不想通过你非常清楚类似字符串不会出现的路径。因为所有这些哈希都存储在磁盘中,我无法承受可能的磁盘读取。我知道有一些策略,比如压缩它们并检索它们(使用大部分磁盘读取),以便比较所有 190 M 变得相对更快。但我想优化这个比较。
-
你如何衡量相似度?从最相似到最不相似,您的输出是否有阈值?
-
相似度可以通过两个字符串之间的 Hamming 距离或 Levenstien 距离来衡量(在我的情况下,阈值是 10-20 ..我之前提到的图像有 17 个)所以排序最高排名没有问题类似的图像,但真正的问题是我计算这些距离的次数。在最坏的情况下,对于给定的哈希/字符串,我必须计算距离 190 M 次(对于 190 M 哈希)才能找到前 5 个类似的哈希。
标签: image algorithm indexing similarity b-tree