我有一本大字典(大约1000万字和表达)。我想构建一个非常快速的系统,允许使用*和?搜索整个字典。口罩。 E.g:
* EST * :
有关的 EST
EST imate
名词 EST
ķ??克* :
ķ的在克
ķ的 AG 克的文件
ķ的在克的 DOM
我知道如果我手动编程,可以使用 trie 数据结构轻松解决。在Java中是否有生产就绪(或几乎准备好)用于此类任务?
答案 0 :(得分:0)
一种方法是创建一个包含1000万个单词和短语的单个字符串。构建字符串,以便每行有一个条目。也就是说,如果" foo"," bar"," bas"都是单词,字符串是:
"foo\nbar\nbas\n"
然后,您可以使用标准正则表达式库来查找所有匹配项。只需确保您的正则表达式已锚定,以便它不会延伸到换行符之外。因此,如果您查找正则表达式"ba*"
,它会找到" bar"并且" bas"而不是找到" bar \ nbas \ n"。
我认为 Java正则表达式中的默认值是停在换行符处,因此您可能不需要做任何特殊操作。否则,有正则表达式选项可让您指定如何处理字符串中的嵌入换行符。
有一点需要指出:当正则表达式引擎报告找到匹配时,它会报告起始位置。您需要备份到单词的开头(上一个\n
),然后复制到结尾(下一个\n
)。
显然,您只想在启动时或每当字典更改时构建一个巨大的字典字符串。无论如何,你真的不想为每一次搜索构建它。
这不是最快的解决方案,但它很可能足够快到达您的目的。它易于实施且易于证明是正确的。这是一个很好的入门方式。