链接页面中的策略似乎是“按字母频率排序猜测顺序”和“先猜元音字母,然后按字母频率排序猜测顺序”。
关于Hangman的一些观察:
1)由于猜测不在单词中的字母会对我们造成损失,因此我们应该根据单词频率(包含字母X的单词的百分比)而非字母频率(所有单词中X出现的次数)来猜测字母。这应该可以最大化我们猜测错误的概率。
2)一旦我们正确地猜出了一些字母,我们就更了解正在尝试猜测的单词。
以下是两种应该打败字母频率策略的策略。我要假设我们有一个可能出现的单词的字典。
如果我们期望目标单词在字典中:
1)我们知道目标单词的长度n。删除在字典中不是长度为n的所有单词。
2)计算字典中所有字母的单词频率。
3)猜测我们还没有猜过的最常见字母。
4)如果我们猜对了,删除不与已揭示字母匹配的所有单词。
5)如果我们猜错了,删除包含错误猜测字母的所有单词。
6)回到步骤2
为了达到最大效果,不要计算步骤2中所有字母的单词频率,而是计算目标单词中仍为空白的位置上所有字母的单词频率。
如果我们不期望目标单词在字典中:
1)从字典中构建一个n-gram表(例如n=2)。如果您以前没有接触过n-gram,它们是单词内连续字母的组。例如,如果单词是"word",则2-gram为“{^w, wo, or, rd, d$}”,其中"^"和"$"标记单词的开头和结尾。统计这些2-grams的单词频率。
2)首先按照与上述相同的单词频率来猜测单个字母。
3)一旦我们有了一些击中,我们就可以使用n-gram的单词频率表来确定要从我们的猜测中消除的字母,或者我们可能能够猜测的字母。有很多方法可以实现这一点:
例如,您可以使用2-gram来确定在"w_rd"中的空格不可能是"z"。或者,您可以确定“___e_”中的字符可能(例如)是“d”或“s”。
或者您可以使用n-gram生成可能字符的列表(尽管对于长单词来说这可能会很昂贵)。请记住,您始终可以划掉所有包含您已经猜测但不在目标单词中的字母的n-gram。
请记住,在每个步骤中,您都在尝试避免犯错,因为这能让我们保持生命。如果n-gram告诉您一个位置只有(比如)a、b或c是可能的,而您的单词频率表告诉您a出现在30%的单词中,但b和c只出现在10%的单词中,则猜测a
。
为了最大化效益,您可以结合两种策略。