我正在用Java制作一个简单的程序。给定一组字母,它将列出与字母组合相匹配的所有单词(超过2个字母)
例如:
给定的单词是否为病房
结果应该是:病房。 原始, daw ,战争, rad
我在sqlite数据库中有一个巨大的列表o原始形式的英文单词并按字母排序,这使得选择更快。
数据库架构如下:
字典:{id,word,length}
anagram:{id,anagram,length}
anagram_dictionary:{id,word_id,anagram_id}
用同样的例子:
当插入单词raw时
它搜索 arw ,结果返回原始,战争
我的问题在于,每次我进行搜索时都会对我给出的combinations字母进行数学计算。
这个例子就是这个数学:
4!/(4!* 1!)+ 4!/(3!* 1!)= 5
我的问题是给定的字母长度是16.所以我必须组合16个16 +组合16个15 + + + 16合1组合
我需要改进方法,因为给出一个简单的结果需要很长时间,但我现在不怎么样?所以我尝试存储在数据库中,但无法弄清楚如何?
提前致谢
答案 0 :(得分:3)
似乎最有效的方法是使用alpha排序密钥存储单词(您已经使用过):
adn - >而且,dna celrstu - >簇 等...
接受输入,按字母顺序排列字母,查找,匹配。完成。
如果这不是您问题的答案,您可能需要稍微调整一下问题的措辞......
答案 1 :(得分:2)
我不完全确定您的约束和资源,这将有助于我调整我的答案,但在这里它... ...
在输入词典时,请执行一些预处理。像CurtainDog推荐的那样计算频率。
现在,根据您的示例,您似乎想要查找给定单词的子集。您可以搜索其组合,或者您可以消除那些不适合该子集的组合。
从而
获取字典
由此,你的给定单词有一个A,所以跳过这封信
由此,你的给定单词没有B,所以返回所有没有B的单词
由此,你的给定单词没有C,所以返回所有没有C的单词
从这一点来说,你的给定单词有一个D,改进了格式,所以跳过这封信
等...
答案 2 :(得分:0)
在词典中,存储每个字母的频率。然后,只需将您的选择构建为仅返回字母频率匹配的单词(如果您希望能够返回部分字谜,则返回较小的单词)