我之前从未使用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。
我需要的是有人向我解释代码是否正在做我期望它做的事情,如果是的话,它是如何获得最相似的签名,即如何遍历树。
如果代码没有按照我期望的那样做,有人可以解释它给我提供的示例做了什么吗?
答案 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
前缀搜索会返回搜索1
,11
和110
的搜索结果。搜索1101
失败,因此digitReplacement
用于将1
替换为匹配的0
,因此1100
是getNearestSignatureKey()
的结果{1}}功能..
要查找匹配项,请将前缀匹配委派给trie
对象。此数据类型取自Biopython project,编码为entirely in C;如果您愿意,请研究Trie_has_prefix
function以查看该类型如何搜索匹配的前缀。
该数据类型的文档很少;我们所拥有的最好成绩是this autogenerated module page:
该模块实现了一个trie数据结构。这允许O(M) 在字典中查找字符串,其中M是字符串的长度 串。它还支持近似匹配。