【问题标题】:Time complexity of Search operation in TRIE data structureTRIE数据结构中Search操作的时间复杂度
【发布时间】:2017-12-21 07:06:08
【问题描述】:

我正在尝试实现基于字典的 trie 数据结构。请在下面找到python代码。

class Trie:
  def __init__(self):
     self.word_end = '_end_'
     self.root = {}

  def add_word(self, word):
     self.add_words([word])

  def add_words(self, words):
     for word in words:
         current_dict = self.root
         for letter in word:
             current_dict = current_dict.setdefault(letter, {})
         current_dict[self.word_end] = self.word_end


  def check_word(self, word):
     current_dict = self.root
     for letter in word:
         if letter in current_dict:
             current_dict = current_dict[letter]
         else:
             return False
     else:
         if self.word_end in current_dict:
             return True
         else:
             return False



tree = Trie()
tree.add_words(['foo', 'bar', 'baz', 'barz'])
print tree
"""
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}}, 
             'z': {'_end_': '_end_'}}}, 
 'f': {'o': {'o': {'_end_': '_end_'}}}}
 """

print check_word('baz')
# True
print check_word('barz')
# True
print check_worf('barzz')
# False

我发现搜索一个词的复杂度是 O(m),其中 m 是被搜索词的长度。此外,添加一个单词的复杂度非常相似 - O(m),其中 m 是要添加的单词的长度。

问题: 这些复杂性太好了。有人可以确认这些复杂性吗?我的 Trie 实现有问题吗?

【问题讨论】:

  • 在 TRIE 中搜索的时间复杂度确实是 O(k),其中 k 是要搜索的字符串的长度。这是正确且经过验证的事实。但是,存储要求是可以看到惩罚的地方。通常,插入和搜索的成本为 O(length_of_string),但是 Trie 的内存需求为 O(ALPHABET_SIZE * length_of_string* N),其中 N 是 Trie 中的键数。有高效的 trie 节点表示(例如压缩的 trie、三元搜索树等),以最大限度地减少 trie 的内存需求。
  • 您想验证您的代码是在 O(M) 时间内完成此操作,还是一般 Trie 在 O(M) 时间内完成此操作?
  • 谢谢!我想检查一个普通的 Trie 是否在 O(M) 时间内做到这一点?
  • 酷。我会提到这个作为答案。

标签: python algorithm data-structures trie


【解决方案1】:

在 TRIE 中搜索的时间复杂度确实是 O(k),其中 k 是要搜索的字符串的长度。这是正确且经过验证的事实。但是,存储要求是造成损失的地方。 Trie 的每个节点都由多个分支组成。每个分支代表一个可能的键字符。我们需要将每个键的最后一个节点标记为词节点的结尾。 Trie节点字段isEndOfWord用于区分节点为词尾节点。

一般来说,插入和搜索的成本为 O(length_of_string),但是 Trie 的内存需求为 O(ALPHABET_SIZE * length_of_string* N),其中 N 是 Trie 中的键数。有高效的 trie 节点表示(例如压缩的 trie、三元搜索树等),以最大限度地减少 trie 的内存需求。

【讨论】:

  • 参考 geeksforgeeks。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多