搜索字典中的单词 - 数据结构和方法

时间:2015-02-10 23:15:35

标签: java search data-structures

我正在编写一个应用程序,我面临的任务是根据输入字符串描述在字典中查找可能的单词要搜索什么。 字典是一个文本文件(每行一个单词),包含大约220,000个单词。

输入字符串可以包含四件事:

  • 普通字符 A-Z
  • 小丑 *。这可以是任何字符A-Z
  • 元音 @。角色必须是元音
  • 辅音#。角色必须是辅音

例如,输入字符串* AT @#应该返回像" rating"," satin","以后"等等但不是"比率"因为它不以辅音结束。

description 用于说明输入字符串应如何出现在单词中。它可以是:

  • 开头的字词。 * AT @#作为输入返回像"材料"。
  • 之类的单词
  • 结尾的字词。 * AT @#作为输入返回像"冰箱"。
  • 之类的单词
  • 包含的字词。 * AT @#作为输入返回像" catered"
  • 这样的单词
  • 适合的字词。 * AT @#作为输入返回像" hater"。
  • 之类的单词

要弄清楚的第一件事是字典的最佳数据结构。由于我有想法的描述,我不确定树结构是最好的方法。它似乎对前缀搜索有好处,我可以为反向词创建另一个树来处理后缀搜索。我不确定包含一系列字符的单词。一棵树感觉不对劲。另一方面,我无法想到其他任何事情。 我应该为每个描述使用哪些数据结构?

我还考虑根据输入字符串和描述创建正则表达式,然后将其与字典中的每个字符串进行匹配。但是,之前我还没有使用正则表达式,所以我不知道这有多贵。

提前致谢!

1 个答案:

答案 0 :(得分:0)

在我的一个类中,我们使用trie数据结构来存储字典。 trie的每个节点都有一个字符串,它只是它的字母,它有子代表任何可以根据字典中的单词跟随它的字母。 例如,如果第一个节点的字母是' a'并且苹果,亚伯拉罕和橡子都在字典中,节点将具有“p'”' b'并且' c'。每个节点还有一个布尔值,表示它是否是字典包含的任何单词的最后一个字母。然后,通过将输入单词中的第一个和后续字母与可用子节点进行比较,检查字典中的单词。优点是,您可以获得的最差性能是您搜索的单词中字母数的26倍。