【问题标题】:Returning the most similar bit signature from a prefix tree in python从python中的前缀树返回最相似的位签名
【发布时间】:2013-07-29 18:50:04
【问题描述】:

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

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

如果代码没有达到我的预期,有人可以根据我提供的示例解释它的作用吗?

【问题讨论】:

    标签: python algorithm tree trie


    【解决方案1】:
    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
    

    【讨论】:

    • 你能举个例子吗?因为我不明白翻转背后的想法。我希望你能提供一个像“10010”这样的签名和前缀树的例子。
    • 我不明白您的输入与预期输出。我只能告诉你代码的作用。
    【解决方案2】:

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

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

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

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

    关于该数据类型的文档很少;我们最好的是this autogenerated module page

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

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 2021-12-15
      • 1970-01-01
      • 2013-04-09
      • 2021-08-29
      相关资源
      最近更新 更多