我正在尝试用Java创建一个空间和时间有效的公共字符字典实现。
字典,而不是从A-Z订购,将以某种方式将包含字母“A”,“B”等的所有单词组合在一起。应用程序需要能够删除包含用户输入的任何字母的所有单词。因此,如果用户输入“L”,则删除包含“L”的所有单词。
我创建了:
组<串GT;字典 - 存储所有单词。
地图<字符,设置<串GT; > - 映射字符A到Z,每个字符都有一个包含字典中包含该字母的所有单词的集合。
示例:
dictionary {"AAB", "ABB", "BBC", "BBA", "CBB"}
地图:
A - "AAB", "ABB", "BBA"
B - "AAB", "ABB", "BBC", "BBA", "CBB"
C - "BBC", "CBB"
如果用户选择“A”,则从字典中删除A的集合并重建地图,等待用户删除另一个字母。
我的问题是,这将导致巨大的数据重复和效率低下。我想不出有效实现这个的另一种方法。我一直暗示树木可能是解决这个问题的一种方法,但我无法看到它们的实施在时间和方式上都会更有效率。空间。
非常感谢你的帮助。
答案 0 :(得分:1)
听起来你应该使用 trie 。这是一个非常简单的树结构,详细信息和实现示例可以在维基百科上找到:
根据您的需要,您可以使用后缀压缩或打包来进一步提高空间效率(注意,完成后,您的trie将不再可修改)。
另外,我会考虑你是否真的要删除字典结构中与给定前缀不匹配的所有项目。通过尝试,您可以通过简单地“查看”相关子树并仅考虑这些条目来消除无效单词。
希望它有所帮助