【问题标题】:4 pictures 1 word "bot" - bad performance4 张图片 1 个单词“机器人” - 性能不佳
【发布时间】:2014-09-24 14:15:17
【问题描述】:

我想你们每个人都听说过移动应用程序4 pics 1 word。我正在尝试用java为这个游戏编写一个“机器人”。好吧,实际上不是机器人,而是帮助解决它的程序。

它基本上应该是这样的:

String[] dictionary = generateArrayWithAllEnglishWordsFromTextfile();
getLengthOfWordFromUserInput();
deleteAllEntriesFromArrayWithOtherLength(); // for performance reason
getAllPossibleLettersFromUserInput();
String[] combination = getAllPossibleCombinationsOfThoseLettersWithEnteredLength();
loopThroughBothArraysAndPrintMatches();

我做到了,一切正常,但如果我输入 12 个可能的字母(这是必要的),它会花费非常长的时间以致于它毫无用处。

我知道 java 不是最快的语言,但是有没有可能在 java 中让它比这种方式更快?

【问题讨论】:

  • 英语中有超过 100 万个单词。数组可能不是保存这些数据的最有效的数据结构。
  • 您尝试的是蛮力,而不是有助于解决问题的智能机器人

标签: java performance algorithm math logic


【解决方案1】:
String[] combination = getAllPossibleCombinationsOfThoseLettersWithEnteredLength();

太慢了。

loopThroughBothArraysAndPrintMatches();

甚至更慢。

只是不要这样做。保持你问题的风格,我只能说

result = removeAllNonMatching(dictionary, userGivenLetters)

在过滤器中,删除所有缺少所需字母的单词或所有包含非法字母的单词,然后根据字母计数等进行更好的过滤。

【讨论】:

  • 嗯,不同字母的额外过滤器非常明显。我现在感觉很笨......但是我应该如何替换两个慢循环?
  • @Froxx 以更合理的方式组织您的数据。例如,按长度对所有单词进行排序;然后您可以立即查看与用户输入的长度相同的那些。
  • @Froxx 放下它们。不生成任何单词,直接翻字典。
【解决方案2】:

你可以制作一个Set 持有英文单词,然后对于每个字母组合,检查该组合是否是Set的成员。检查 HashSet 中的成员关系很快,而且短组合比英文单词少,因此比遍历所有英文单词要快。

如果您有 12 个不同的字母,并试图找到一个包含 8 个字母的单词,则有 12*11*...*5 ~ 2000 万种可能性。那可能太多了。 Maaartinus 指出当组合多于英语单词时的一项改进:根据您从一组字母中计算出的统计数据过滤英语单词的集合。另一种方法是使用anagram dictionary。当您加载英文单词时,制作一个 Map,其键是单词中无序(多)字母集的函数,例如通过对单词中的字母进行排序。 (让值是具有该组字母的英语单词列表。)您不必遍历所有字母组合,而只需遍历子集(如果字母不不同,则为子集)。一组大小为 12 的集合中只有 495 个大小为 8 的子集,因此这将为来自 12 个不同字母的 8 个字母单词节省 40,000 倍。您将从 Map 中请求 495 个值,这应该比遍历所有英文单词要快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 2020-09-16
    • 2022-01-01
    • 2014-04-02
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多