我可以使用哪种架构来存储单词组合?

时间:2011-01-14 02:37:26

标签: java sql math combinations

我正在用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组合

我需要改进方法,因为给出一个简单的结果需要很长时间,但我现在不怎么样?所以我尝试存储在数据库中,但无法弄清楚如何?

提前致谢

3 个答案:

答案 0 :(得分:3)

似乎最有效的方法是使用alpha排序密钥存储单词(您已经使用过):

adn - >而且,dna celrstu - >簇 等...

接受输入,按字母顺序排列字母,查找,匹配。完成。

如果这不是您问题的答案,您可能需要稍微调整一下问题的措辞......

答案 1 :(得分:2)

我不完全确定您的约束和资源,这将有助于我调整我的答案,但在这里它... ...

在输入词典时,请执行一些预处理。像CurtainDog推荐的那样计算频率。

现在,根据您的示例,您似乎想要查找给定单词的子集。您可以搜索其组合,或者您可以消除那些不适合该子集的组合。

从而

获取字典
由此,你的给定单词有一个A,所以跳过这封信 由此,你的给定单词没有B,所以返回所有没有B的单词 由此,你的给定单词没有C,所以返回所有没有C的单词 从这一点来说,你的给定单词有一个D,改进了格式,所以跳过这封信 等...

似乎你的关注点是运行时间的增长,因为你的给定单词有更多的字母。 使用此解决方案,运行时间越大,单词越大,情况越糟糕 是(26-2)*(字典中的单词数)

答案 2 :(得分:0)

在词典中,存储每个字母的频率。然后,只需将您的选择构建为仅返回字母频率匹配的单词(如果您希望能够返回部分字谜,则返回较小的单词)