Python实现的Patricia Trie

5 投票
1 回答
4726 浏览
提问于 2025-04-16 00:27

我在寻找Python实现的字典树(trie),想搞明白它是什么以及怎么工作的过程中,发现了Justin Peel的patricia trie,觉得这个例子很有帮助:对于像我这样刚入门的人来说,它简单易懂,可以让我动手试试并学习。

不过,有些地方我觉得我没搞明白:

使用Justin的patricia()类,像这样:

>>> p = patricia()
>>> words = ['foo','bar','baz']
>>> for x in words:
...     p.addWord(x)

我得到了一个看起来像字典的字典树:

>>> p._d
{'b': ['a', {'r': ['', {}], 'z': ['', {}]}], 'f': ['oo', {}]}

addWord()和isWord()的功能都正常,但isPrefix()的表现让我有点困惑:

>>> p.isPrefix('b')
True
>>> p.isPrefix('f')
True
>>> p.isPrefix('e')
False

这个结果很好,符合预期;然后

>>> p.isPrefix('ba')
True

这个结果也不错,但接下来:

>>> p.isPrefix('bal')
True

而且:

>>> p.isPrefix('ballance')
True
>>> p.isPrefix('ballancing act')
True

这里面有什么我没理解的吗?

1 个回答

4

我觉得你正在查看的代码片段里有个错误:

       if w.startswith(node[0][:wlen-i],i):
            if wlen - i > len(node[0]):
                i += len(node[0])
                d = node[1]
            return True

其实应该是:

       if w.startswith(node[0][:wlen-i],i):
            if wlen - i > len(node[0]):
                i += len(node[0])
                d = node[1]
            else:
                return True

撰写回答