【问题标题】:What possible schema can I use to store words combinations?我可以使用哪些可能的模式来存储单词组合?
【发布时间】:2011-01-14 02:37:25
【问题描述】:

我正在用 Java 编写一个简单的程序。给定一组字母,它将列出与字母组合匹配的所有单词(超过 2 个字母)。
例如:
是给定的词是病房。
结果应该是:ward原始daw战争rad
我在一个 sqlite 数据库中有一个巨大的原始形式的英文单词列表,并按字母排序,这使得选择更快。


数据库架构如下所示:
字典:{id, word, length}
字谜:{id,字谜,长度}
anagram_dictionary: {id, word_id, anagram_id}


同样的例子:
当插入单词 raw
它搜索arw,结果返回rawwar

我的问题在于,每次我进行搜索时,它都会计算我给出的字母的combinations

例如,它使这个数学:
4!/(4!*1!) + 4!/(3!*1!) = 5

我的问题是给定的字母长度是 16。所以我必须在 16 中组合 16 + 在 15 中组合 16 + ... + 在 1 中组合 16

我需要改进方法,因为它需要很长时间才能给出一个简单的结果,但我现在不知道如何?所以我尝试存储在数据库中,但不知道如何?

提前致谢

【问题讨论】:

    标签: java sql math combinations


    【解决方案1】:

    似乎最有效的方法是使用 alpha 有序键(您已经拥有)存储单词:

    adn -> 和,dna celrstu -> 集群 等等……

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

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

    【讨论】:

    • 但是你需要一个多重映射(或类似Map<String, List<String>>),因为不同的单词可以有相同的字母顺序(例如“read”和“dear”)。
    • 不错的方法 +1 - 不需要其他地图,您只需要一个程序来订购当前字符串
    【解决方案2】:

    我不完全确定您的限制和资源,这将帮助我调整我的答案,但它就在这里......

    在输入字典时,请执行一些预处理。按照 CurtainDog 的建议计算频率。

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

    因此

    获取字典
    从这里,你给定的单词有一个 A,所以跳过这个字母
    由此,您给定的单词没有 B,因此返回所有没有 B 的单词。
    由此,您给定的单词没有 C,因此返回所有没有 C 的单词。
    从这里,你给定的单词有一个 D,改进了格式,所以跳过这个字母
    等等...

    似乎您担心的是运行时间随着您给定的单词有更多字母而增长。 使用此解决方案,运行时间会随着更大的单词和更糟糕的情况而变得更好 是 (26-2)*(字典中的单词数)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我已经以某种方式保存了频率,但我仍然需要获取所有可能的字母组合以匹配频率。我该如何改进?
      • 为什么需要获取所有组合来匹配频率?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多