从python中的前缀树返回最相似的位签名

时间:2013-07-29 18:50:04

标签: python algorithm tree trie

我之前从未使用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

enter image description here

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

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

如果代码没有按照我期望的那样做,有人可以解释它给我提供的示例做了什么吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

对于您的示例数据,如果您要查找签名1101,则没有完全匹配。但trie前缀搜索会返回搜索111110的搜索结果。搜索1101失败,因此digitReplacement用于将1替换为匹配的0,因此1100getNearestSignatureKey()的结果{1}}功能..

要查找匹配项,请将前缀匹配委派给trie对象。此数据类型取自Biopython project,编码为entirely in C;如果您愿意,请研究Trie_has_prefix function以查看该类型如何搜索匹配的前缀。

该数据类型的文档很少;我们所拥有的最好成绩是this autogenerated module page

  

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