解决boggle的O(n)解决方案

时间:2012-04-25 23:22:36

标签: algorithm time-complexity boggle

什么是解决boggle的函数的最佳时间复杂度O(n),其中boggle board是n?

我觉得它是n^2,因为对于每个角色,我们必须查看2(n-1)个其他角色。面试官认为n^2字典查询不是O(1)

3 个答案:

答案 0 :(得分:2)

字典的功能还不是很清楚。

有点傻但我认为正确答案如下:

由于在boggle中,单词可以是任意方式(从每个字符到任何相邻的(水平,垂直或对角线)字符),对于长度为L的单词,单词的组合可以最多8^L,除非您消除字符多次出现的组合。无论如何,考虑到L是常量(因为使用的字典是常量),这个值也是常量。总而言之,从给定位置开始查找单词的时间复杂度为O(1)

剩下的是单词的起始位置,它位于空格n^2中,因此您的蓝宝星求解器的时间复杂度为O(n^2)正确

如前所述,我认为这种论证有点傻。

问题可能是人们不想将字典视为常量,因为它非常大。假设它无限大但它实现了对{strong>现有单词的O(1)查找(这是我们可以用于字典的唯一查询,尤其是没有单词查找前缀),并且进一步假设n不是与字长相比的限制因素,时间复杂度是指数的。但是我认为在这个练习中,查找仅对现有单词成功的假设是错误的。

另一个可能的假设是,字典 查找单词前缀(返回是否存在以给定字符串开头但不一定等于字符串的单词)。在这种情况下,我们可以实现更好且更复杂的算法,该算法搜索有限的搜索空间(最多使用一个字符一次)。字长的限制因素是n^2,因为没有字(包含在当前的保护板中)可以比那更长(因为我们只能使用每个字符一次)。同样,起始位置在空间n^2中,因此基于路径的愚蠢算法的时间复杂度为 O(n^4),因此您错了。目前,我无法想到在这种假设下具有更好时间复杂度的算法。

答案 1 :(得分:2)

看看http://exceptional-code.blogspot.com/2012/02/solving-boggle-game-recursion-prefix.html。动态编程解决方案是O(D),其中D是字典的大小。

答案 2 :(得分:1)

我终于明白了。答案结果是指数级的。

想象一下4X4 boggle网格

ABCD
EFGH
IJKL
MNOP

然后,例如,ABCDHGFEIJKLPONM中以A开头的任何有序子序列都是潜在的单词;在AEIMNOPLHDCBFJKG或AEIMNOPLHGFIK或ABCDHLPONMIEFGKJ中以A开头的任何有序子序列也是如此。然后我们需要看看从B开始的潜在词汇,然后是C等等。

让我们看看另一种方式。假设我们只需要考虑_ABCD,其中_代表一些起始字符,比如X;那么潜在的词属于权力集是:

XD; XC; XCD; XB; XBD; etc.

因此,仅考虑从每个角色开始的顺时针螺旋,我们已经在考虑n^2*2^(n-1)n^2因为网格为n by n,因此对于4 by 4网格,有16个可能的起始字符。而且2^(n-1)因为每个首发角色所带领的powerset。当然顺时针螺旋不是唯一可能的模式。但我们已经可以看到第一种模式的时间复杂性:Big-Omega(2 ^ n)是指数型的。