辞書ベースのトライデータ構造を実装しようとしています。以下のPythonコードを見つけてください。TRIEデータ構造における検索操作の時間複雑度
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のキーの数です)。トライノードのメモリ表現を最小限にするために、トライノード(例えば、圧縮トライ、3進探索木など)の効率的な表現が存在する。 – CodeHunter
あなたのコードがO(M)時間にこれを行うかどうか、または一般的なTrieがO(M)時間にこれを行うかどうかを確認しますか? – CodeHunter
ありがとう!私は一般的なTrieがO(M)時間にこれを行うかどうか確認したかったのですか? – arunk2