【发布时间】:2014-05-04 10:58:18
【问题描述】:
对于我正在开发的单词构建游戏,我有一个可以存储字典中所有可能单词的 trie。目前大约有 179,000 个。
根据游戏的运作方式,有一个 5x5(或未来可能更大,取决于该问题的解决方案的效率如何)字母网格。玩家和 PC 轮流从这些字母中生成单词,根据字母和单词的长度获得分数(字母估值类似于 Scrabble,但这并不重要)。每当玩家说出一个单词时,这些字母就会从板上移除,并一直持续到无法说出单词为止,此时网格会重置(并且该回合的获胜者将获得奖金)。
问题是这样的:给定一个 5x5 的字母网格和字典树,我如何才能有效地确定最长的单词或所有可能单词的列表?请注意,字母不需要相互接触即可使用;任何网格的字母都可以。
我能想到的唯一方法本质上是在树上做一个 BFS,当下一个字母不在网格中时修剪它,但这对我来说似乎不是很有效,因为它必须尝试对于网格中的每个字母。有没有更好的方法来做到这一点?
【问题讨论】:
-
您是否尝试过暴力破解方法并且性能无法接受?
-
考虑到您要执行的操作,您确定使用 trie 是合适的数据结构吗?
-
@Pete:我还没有尝试过,但这将是阶乘时间。最初的完整 5x5 网格大约有 25 个!检查的可能性——效率太低了。
-
@ct_:我不能 100% 确定,但这是我能想到的最好的……还有其他建议吗?
-
@DanielBurnett 我认为在现实中蛮力方法不会接近 25! - 你不会期望有很多 25 个字母的单词。当然,编写该算法来测试它并不难——至少它提供了一个最坏情况的基准来测试其他方案,并且还为测试它们的正确性提供了参考。
标签: c++ search dictionary trie