【问题标题】:python trie implementation with substring matchingpython trie实现与子字符串匹配
【发布时间】:2012-11-19 13:59:48
【问题描述】:

我的问题: 假设我有字符串:

ali, aligator, aliance

因为它们有共同的前缀,所以我想将它们存储在 trie 中,例如:

trie['ali'] = None
trie['aligator'] = None
trie['aliance'] = None

到目前为止一切顺利 - 我可以使用 Biopython 库中的 trie 实现。 但我想要实现的是能够在该 trie 中找到包含特定子字符串的所有键。

例如:

trie['ga'] would return 'aligator' and 
trie['li'] would return ('ali','aligator','aliance').

有什么建议吗?

【问题讨论】:

  • 你想找到这个一次(所以这很慢没关系),还是重复(所以很重要)?
  • @PhilH OP 正在询问一个具体的实现(trie),它可以有效地实现这一点。
  • @KonradRudolph:特里树可以有效地存储和检索带有公共存根的字符串。据我所知,它不会整理常见的子序列。因此,除非我们还构造一个索引,否则要在键树的不同部分之间找到公共子序列是没有效率的。但是如果公共子序列搜索很少,那么存储和插入/删除成本就没有意义了。如果是普遍的,那么收益大于成本,我们应该构建指数。我错过了什么吗?
  • 好的。我的情况是我有 120 万个这样的字符串:InChI=1S/C9H12/c1-4-7-8(5-2)9(7)6-3/h4-6H,1-3H3/b7-4 -,8-5-,9-6- 我想让索引能够找到包含某些给定子字符串的所有字符串。实现不一定要用trie,但应该是有效的。

标签: python data-structures tree substring trie


【解决方案1】:

编辑:我认为您可能正在寻找Suffix tree,特别指出“后缀树还为最长公共子字符串问题提供了第一个线性时间解决方案。”。

刚刚注意到另一个似乎非常相关的 SO 问题:Finding longest common substring using Trie

【讨论】:

  • 那不是我 ;) 这里的问题是我事先不知道如何拆分字符串。所以我可能需要所有字符串的所有可能的子字符串。这称为后缀数组,但我没有看到任何好的 python 实现。
  • 到目前为止,最符合我要求的库是:hkn.eecs.berkeley.edu/~dyoo/python/suffix_trees
  • 您是否查看过此处答案中的链接? stackoverflow.com/questions/9347078/…
  • 我已经删除了答案的原始部分,因为后缀树是更好的解决方案。
【解决方案2】:

我会这样做:

class Trie(object):
    def __init__(self,strings=None):
        #set the inicial strings, if passed
        if strings:
            self.strings = strings
        else:
            self.strings =[]

    def __getitem__(self, item):
        #search for the partial string on the string list
        for s in self.strings:
            if item in s:
                yield s

    def __len__(self):
        #just for fun
        return len(self.strings)

    def append(self,*args):
        #append args to existing strings
        for item in args:
            if item not in self.strings:
                self.strings.append(item)

然后:

t1 = Trie()
t1.append("ali","aligator","aliance")
print list(t1['ga'])
print list(t1['li'])
>>['aligator']
>>['ali', 'aligator', 'aliance']

【讨论】:

  • 这似乎只是在每个目标片段上搜索目标片段的所有提供字符串。即要搜索的字符串数 n、片段数 m 和平均字符串长度 k 中的 O(nmk)。问题的重点是找到有效的搜索方法,恐怕不是。
  • 但是,正确的关键字。可以在这里找到漂亮的 trie 实现:github.com/fnl/patricia-trie/blob/master/patricia.py#L77
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2013-06-18
  • 2016-03-08
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多