【发布时间】:2015-06-26 08:58:54
【问题描述】:
我正在 python 中实现一个 Trie。到目前为止,我遇到了两种不同的方法来实现它:
1) 使用具有数据成员的类 Node(类似于 C++ 中的 struct Node):
char - 存储字符is_end - 存储词尾(真或假)prefix_count - 存储当前前缀的词数
child - 节点类型字典(用于存储其他节点,即 26 个字母)
class Node(object):
def __init__(self):
self.char = ''
self.word = ''
self.is_end = False
self.prefix_count = 0
self.child = {}
2) 使用字典存储所有数据:
例如对于输入words = {'foo', 'bar', 'baz', 'barz'}
我们推导出这个字典:
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}},
'z': {'_end_': '_end_'}}},
'f': {'o': {'o': {'_end_': '_end_'}}}}
对于大数据集的遍历和其他 trie 操作,哪种是高效且标准的数据结构,既节省内存又快速?
【问题讨论】:
-
考虑到这是一本字典,你打算如何在
self.child中引用Node的对象?如果您确实将其保留为dict,并以某种方式引用Node对象,我认为这两种方法具有相同的时间复杂度,但第一种具有更高的空间复杂度。如果您将self.child作为列表引用,那么第一个可能会慢一些 -
感谢您的回复。 Node 中的每个子节点都会有另一个 Node 类型的对象,这将使它成为一个 n 叉树。 @hyades
-
@divyum,如果没有关于你到底想要做什么的具体细节,你只能根据人们的个人喜好来期待意见。该问题的答案讨论了利弊并提供了示例。
-
@divyum 是的,第一个允许您使用更结构化的形式解决繁琐的部分,但同时占用更多空间。如果您谈论的是庞大的数据集,那么您担心的是时间复杂度。无论特里树如何,您都需要遍历 O(len(search_str)) 。上述两种方法都会产生完全相同的结果。
标签: python data-structures tree nlp trie