2

我以前从未用 python 编写过代码(我是一名 java 程序员),我正在查看表示它返回前缀树中最相似的位签名/向量的代码。例如,签名可以是这样的“1001”。有人可以向我解释一下代码是如何工作的吗?它如何遍历前缀树以在树中找到与查询签名最相似/最接近的签名?相似性基于汉明距离。

这是代码:

class SignatureTrie:
    @staticmethod
    def getNearestSignatureKey(trie, signature):
        digitReplacement = {'0': '1', '1': '0'}
        targetKey, iteratingKey = signature.to01(), ''
        for i in range(len(targetKey)):
            iteratingKey+=targetKey[i]
            if not trie.has_prefix(iteratingKey): iteratingKey=iteratingKey[:-1]+digitReplacement[targetKey[i]]
        return iteratingKey

这是源文件: https ://github.com/kykamath/streaming_lsh/blob/master/streaming_lsh/classes.py

编辑:

我将举例说明“我”期望代码做什么。我不知道代码是否真的这样做或它是如何这样做的。这就是为什么我要求对代码进行解释,尤其是遍历前缀树。

假设我有以下包含三个字符串/签名的前缀树:s1 = 1110 s2 = 1100 s3 = 1001

在此处输入图像描述

假设我有输入签名 s = 1000。现在我想知道前缀/trie 中的哪个向量与输入向量 s 最相似。由于 s3 具有最小的汉明距离 (1),我希望代码返回向量 s3。

我需要有人向我解释代码是否在做我期望它做的事情,如果是这样,它如何获得最相似的签名,即它如何遍历树。

如果代码没有达到我的预期,有人可以解释一下我提供的示例它做了什么吗?

4

2 回答 2

3
class SignatureTrie:

    @staticmethod
    def getNearestSignatureKey(trie, signature):

        digitReplacement = {'0': '1', '1': '0'}
        targetKey = signature.to01() # string with 0 and 1
        iteratingKey = '' # empty string

        for i in range(len(targetKey)): # loop through targetKey string (i being an index)
            iteratingKey += targetKey[i] # append char at position i
            if not trie.has_prefix(iteratingKey): # if iteratingKey is not the trie
                # flip last digit (0 if 1, 1 if 0) of iteratingKey
                iteratingKey = iteratingKey[:-1]+digitReplacement[targetKey[i]]

        return iteratingKey
于 2013-07-29T20:03:37.617 回答
1

您发布的代码片段执行任何 Trie 搜索。完全没有。

您正在查看的函数会置换给定的签名密钥(一串零和一)以找到最接近的匹配项;如果没有找到以签名的第一个字符开头的匹配项,它会查找具有相反值的项目。

对于您的示例数据,如果您要查找签名1101,则没有完全匹配。但trie前缀搜索将返回搜索1、 for11和 for 的结果110。搜索1101失败,所以用 adigitReplacement替换最后1一个0,它确实匹配,函数1100的结果也是如此getNearestSignatureKey()

为了找到匹配,前缀匹配被委托给trie对象。此数据类型取自Biopython 项目完全用 C编码;如果您愿意,请研究该Trie_has_prefix函数以查看该类型如何搜索匹配的前缀。

该数据类型的文档很少;我们最好的是这个自动生成的模块页面

该模块实现了一个 trie 数据结构。这允许 O(M) 在字典中查找字符串,其中 M 是字符串的长度。它还支持近似匹配。

于 2013-08-02T16:57:18.627 回答