如果您可以忽略大小写,我假设是这样的话,在任何其他操作之前,请将字典中的所有单词和所有搜索术语的大小写设置为相同。 大小写不重要。 如果您有一些区分大小写的单词和其他不区分大小写的单词,则将单词分成两组并分别搜索。
您只匹配单词,因此可以将字典拆分为字符串数组。 由于您仅对已知长度进行精确匹配,因此将单词数组拆分为每个单词长度的单独数组。 因此,byLength [3]是所有长度为3的单词的数组。 每个单词数组都应该排序。
现在,您有一个单词数组和一个具有潜在通配符的单词要查找。 根据通配符的位置和是否存在,有几种方法可供选择。
如果搜索术语没有通配符,则在已排序的数组中执行二进制搜索。 在此时可以进行哈希,这将更快,但不会快很多。 如果绝大多数搜索术语没有通配符,则考虑使用哈希表或由哈希键控的关联数组。
如果搜索词在某些文字字符后有通配符,则在排序数组中进行二分查找以找到上限和下限,然后在该范围内进行线性搜索。如果通配符都是尾随的,则找到非空范围就足够了。
如果搜索词以通配符开头,则排序数组无法帮助您,除非您保留按反向字符串排序的数组的副本,否则需要进行线性搜索。如果制作这样的数组,则在尾随文字比前导文字多时选择它。如果不允许前导通配符,则没有必要。
如果搜索词既以通配符开头又以通配符结尾,则您将被困在等长单词内的线性搜索中。
因此,一个字符串数组的数组。每个字符串数组都是排序的,并包含相同长度的字符串。可选地,对于前导通配符的情况,基于反向字符串的排序可以复制整个结构。
总体空间为每个单词一个或两个指针,加上单词。如果您的语言允许,您应该能够将所有单词存储在单个缓冲区中。当然,如果您的语言不允许,grep可能更快。对于一百万个单词,数组的大小为4-16MB,实际单词的大小类似。
对于没有通配符的搜索词,性能会非常好。有了通配符,偶尔会对大量单词进行线性搜索。通过长度分解和单个前导字符,即使在最坏情况下,您也不应该需要搜索超过总字典的几个百分点。仅比较已知长度的整个单词将始终比通用字符串匹配更快。