[英]Collect Suffixes for all Complete Words below a Trie Node (using recursion in Python)
我需要添加列出后綴的功能來實現我們的自動完成功能。 為此,我在 TrieNode object 上實現了 function,它將返回 trie 中存在的所有完整單詞后綴。 例如,如果我們的 Trie 包含單詞 ["fun", "function", "factory"] 並且我們從f
節點請求后綴,我們希望收到["un", "unction", "actory"]
從node.get_suffixes()
返回。 這是我開始的方式:
class TrieNode:
def __init__(self):
## Initialize this node in the Trie
self.word_end = False
self.children = dict()
def insert(self, char):
## Add a child node in this Trie
if not char in self.children:
self.children[char] = TrieNode()
def get_suffixes(self):
pass
我已經單獨測試了get_suffixes
function ,它似乎工作正常。
result = []
def get_suffixes(node, suffix=""):
if not node.children == dict():
for key in node.children:
suffix += key
if node.children[key].word_end:
result.append(suffix)
get_suffixes(node.children[key], suffix)
suffix = suffix[:-1]
return result
我如何測試 function:
# Create a mock trie for the test
node = TrieNode()
node.insert("A")
node.children["A"].word_end = True
node.children["A"].insert("t")
node.children["A"].children["t"].word_end = True
node.children["A"].insert("b")
node.children["A"].children["b"].insert("a")
node.children["A"].children["b"].children["a"].insert("c")
node.children["A"].children["b"].children["a"].children["c"].insert("a")
node.children["A"].children["b"].children["a"].children["c"].children["a"].word_end = True
node.children["A"].insert("d")
node.children["A"].children["d"].insert("d")
node.children["A"].children["d"].children["d"].word_end = True
node.children["A"].children["d"].insert("m")
node.children["A"].children["d"].children["m"].insert("i")
node.children["A"].children["d"].children["m"].children["i"].insert("n")
node.children["A"].children["d"].children["m"].children["i"].children["n"].word_end = True
result = []
def get_suffixes(node, suffix=""):
if not node.children == dict():
for key in node.children:
suffix += key
if node.children[key].word_end:
result.append(suffix)
get_suffixes(node.children[key], suffix)
suffix = suffix[:-1]
return result
get_suffixes(node.children["A"]) # Returns ['t', 'baca', 'dd', 'dmin'], as expected
當我嘗試將get_suffixes
function 移動到TrieNode
class 時出現問題。 在這里,我不知道應該如何處理全局變量result
。 它不再應該是全局變量。 我試過兩個版本:
版本 I:使result
成為 class 屬性
class TrieNode:
def __init__(self):
## Initialize this node in the Trie
self.word_end = False
self.children = dict()
self.result = []
def insert(self, char):
## Add a child node in this Trie
if not char in self.children:
self.children[char] = TrieNode()
def get_suffixes(self, suffix=""):
if not self.children == dict():
for key in self.children:
suffix += key
if self.children[key].word_end:
self.result.append(suffix)
self.children[key].get_suffixes(suffix)
suffix = suffix[:-1]
return self.result
node.children["A"].get_suffixes() # Returns ['t'], which is wrong
版本 II:將result
設為默認 function 參數
class TrieNode:
def __init__(self):
## Initialize this node in the Trie
self.word_end = False
self.children = dict()
def insert(self, char):
## Add a child node in this Trie
if not char in self.children:
self.children[char] = TrieNode()
def suffixes(self, suffix="", result=[]):
if not self.children == dict():
for key in self.children:
suffix += key
if self.children[key].word_end:
result.append(suffix)
self.children[key].suffixes(suffix)
suffix = suffix[:-1]
return result
node.children["A"].suffixes() # Returns ['t', 'baca', 'dd', 'dmin']
node.children["A"].suffixes() # Returns ['t', 'baca', 'dd', 'dmin', 't', 'baca', 'dd', 'dmin']
版本 II 的結果並不令人驚訝,因為:
def append(number, number_list=[]):
number_list.append(number)
print(number_list)
return number_list
append(5) # expecting: [5], actual: [5]
append(7) # expecting: [7], actual: [5, 7]
append(2) # expecting: [2], actual: [5, 7, 2]
我正在學習 Python 中的算法和數據結構。 我被要求使用遞歸 function 來完成。 其他方法,例如實現 Trie 以支持 Python中的自動完成功能並不是我期望的答案,盡管它們本身可能能夠解決問題。 我非常好奇為什么self.result
在版本 I 中沒有正確修改,但如果它不駐留在 class 中,則可以正常工作。
result
屬於 class TrieNode
。
當您從get_suffixes
方法返回self.result
時,您只包括在當前TrieNode
實例中找到的答案。
您還需要包括其子項找到的答案。 多虧了遞歸,代碼只需要一個小的改動,添加self.result+=self.children[key].get_suffixes(suffix)
就可以了。
class TrieNode:
def __init__(self):
## Initialize this node in the Trie
self.word_end = False
self.children = dict()
self.result = []
def insert(self, char):
## Add a child node in this Trie
if not char in self.children:
self.children[char] = TrieNode()
def get_suffixes(self, suffix=""):
if not self.children == dict():
for key in self.children:
suffix += key
if self.children[key].word_end:
self.result.append(suffix)
else:
self.result+=self.children[key].get_suffixes(suffix)
suffix = suffix[:-1]
return self.result
# Create a mock trie for the test
node = TrieNode()
node.insert("A")
node.children["A"].word_end = True
node.children["A"].insert("t")
node.children["A"].children["t"].word_end = True
node.children["A"].insert("b")
node.children["A"].children["b"].insert("a")
node.children["A"].children["b"].children["a"].insert("c")
node.children["A"].children["b"].children["a"].children["c"].insert("a")
node.children["A"].children["b"].children["a"].children["c"].children["a"].word_end = True
node.children["A"].insert("d")
node.children["A"].children["d"].insert("d")
node.children["A"].children["d"].children["d"].word_end = True
node.children["A"].children["d"].insert("m")
node.children["A"].children["d"].children["m"].insert("i")
node.children["A"].children["d"].children["m"].children["i"].insert("n")
node.children["A"].children["d"].children["m"].children["i"].children["n"].word_end = True
print(node.children["A"].get_suffixes())
Output:-
['t', 'baca', 'dd', 'dmin']
要記住的是,每個子節點都是TrieNode
class 的新實例,因此有自己獨立的result
數組。
修改插入 + 無結果數組:-
class TrieNode:
def __init__(self):
## Initialize this node in the Trie
self.word_end = False
self.children = dict()
def insert(self, string):
if len(string) == 0:
self.word_end = True
return
## Add a child node in this Trie
if not string[0] in self.children:
self.children[string[0]] = TrieNode()
self.children[string[0]].insert(string[1:])
def get_suffixes(self, suffix=""):
query_result=[]
if self.word_end:
query_result.append(suffix)
for i in self.children:
query_result+=self.children[i].get_suffixes(suffix+i)
return query_result
# Create a mock trie for the test
node = TrieNode()
node.insert("Add")
node.insert("At")
node.insert("Abaca")
node.insert("Admin")
print(node.children["A"].get_suffixes())
print(node.children["A"].get_suffixes())
print(node.children["A"].children["t"].get_suffixes())
Output:-
['dd', 'dmin', 't', 'baca']
['dd', 'dmin', 't', 'baca']
['']
[Finished in 0.0s]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.