如何优化代码结构避免重复构建耗时的Trie数据结构?
解决字谜求解器中Trie重复构建的问题
下面提供几种实用方案,帮你实现Trie仅构建一次、支持多次图像处理的需求:
方案1:将Trie封装为模块级全局变量
把Trie相关的类和构建逻辑放到单独的模块中,利用Python模块仅加载一次的特性,让Trie在模块导入时就完成构建,后续所有调用都复用这个已构建好的实例。
示例代码结构:
# word_dict_module.py class TrieNode: def __init__(self): self.children = {} self.is_end_of_word = False class WordDictionary: def __init__(self): self.root = TrieNode() def add_word(self, word): current = self.root for char in word.lower(): if char not in current.children: current.children[char] = TrieNode() current = current.children[char] current.is_end_of_word = True # 模块加载时自动完成Trie构建 def build_global_trie(): dict_instance = WordDictionary() with open('your_word_list.txt', 'r', encoding='utf-8') as f: for line in f: word = line.strip() if word: dict_instance.add_word(word) return dict_instance # 全局变量,仅初始化一次 global_word_trie = build_global_trie()
主脚本中直接导入使用:
# main.py from word_dict_module import global_word_trie def solve_puzzle(image): # 这里直接使用global_word_trie进行DFS求解逻辑 pass # 可任意多次调用求解函数,无需重复构建Trie solve_puzzle(image_1) solve_puzzle(image_2)
方案2:用单例模式实现WordDictionary
改写WordDictionary类,确保程序运行期间只有一个实例,Trie仅在第一次实例化时构建。
示例代码:
class TrieNode: def __init__(self): self.children = {} self.is_end_of_word = False class WordDictionary: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) cls._instance.root = TrieNode() # 首次实例化时构建Trie cls._instance._build_trie() return cls._instance def _build_trie(self): with open('your_word_list.txt', 'r', encoding='utf-8') as f: for line in f: word = line.strip() if word: self.add_word(word) def add_word(self, word): current = self.root for char in word.lower(): if char not in current.children: current.children[char] = TrieNode() current = current.children[char] current.is_end_of_word = True
使用方式:
# 第一次调用会构建Trie trie_instance = WordDictionary() solve_puzzle(image_1, trie_instance) # 后续实例化直接复用已构建好的Trie trie_instance_2 = WordDictionary() solve_puzzle(image_2, trie_instance_2)
方案3:主程序初始化时提前构建Trie并传递
在主程序的入口处一次性构建好Trie,之后每次调用图像处理函数时,将这个Trie实例作为参数传入。
示例代码:
def main(): # 提前构建一次Trie word_dict = WordDictionary() with open('your_word_list.txt', 'r', encoding='utf-8') as f: for line in f: word = line.strip() if word: word_dict.add_word(word) # 循环处理图像,每次复用同一个Trie while True: image = load_new_puzzle_image() if not image: break solve_puzzle(image, word_dict) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者dg0802
相关产品推荐
相关产品推荐

