Algorithm 求解boggle的解的O(n)
求解boggle的函数的最佳时间复杂度O(n)是多少,其中boggle板是n乘nAlgorithm 求解boggle的解的O(n),algorithm,time-complexity,boggle,Algorithm,Time Complexity,Boggle,求解boggle的函数的最佳时间复杂度O(n)是多少,其中boggle板是n乘n 我觉得这是n^2,因为对于每个字符,我们必须查看2(n-1)其他字符。采访者争辩说,查字典不是为了查字典。O(1)n^2。不太清楚字典能查到什么 有点傻,但我认为正确的答案如下: 因为在boggle中,单词可以任意移动(从每个字符到该单词中尚未使用的任何相邻(水平、垂直或对角线)字符),对于长度为L的单词,单词的组合可以达到8^L,除非您消除字符多次出现的组合。无论如何,考虑到L是常量(因为使用的字典是常量),这个
我觉得这是
n^2
,因为对于每个字符,我们必须查看2(n-1)
其他字符。采访者争辩说,查字典不是为了查字典。O(1)
n^2。不太清楚字典能查到什么
有点傻,但我认为正确的答案如下:
因为在boggle中,单词可以任意移动(从每个字符到该单词中尚未使用的任何相邻(水平、垂直或对角线)字符),对于长度为L
的单词,单词的组合可以达到8^L
,除非您消除字符多次出现的组合。无论如何,考虑到L
是常量(因为使用的字典是常量),这个值也是常量。总之,从给定位置开始查找单词的时间复杂度为O(1)
因此,剩下的是单词的起始位置,它位于空间n^2
,因此您的boggle解算器的时间复杂度为O(n^2)
,您是对的
如前所述,我认为这个论点有点愚蠢
问题可能是人们不想把字典看作是常数,因为它非常大。假设它无限大,但它实现了对现有单词的O(1)
查找(这是我们可以用于词典的唯一查询,尤其是没有对单词前缀的查找),并进一步假设n
与单词长度相比不是一个限制因素,时间复杂度是指数级的。但我认为,在本练习中,只对现有单词进行成功查找的假设是错误的
另一个可能的假设是,字典有一个单词前缀的查找(返回是否存在以给定字符串开头但不一定等于该字符串的单词)。在这种情况下,我们可以实现一种更好、更复杂的算法,该算法搜索有限的搜索空间(最多使用一次每个字符)。字长的限制因素是
n^2
,因为没有任何单词(包含在当前的boggle board中)可以超过这个长度(因为每个字符只能使用一次)。同样,起始位置在空间n^2
,因此愚蠢的基于路径的算法的时间复杂度为O(n^4)
,因此您错了。目前,在这种假设下,我想不出一种时间复杂度更好的算法。我终于找到了答案。答案在时间上是指数型的
想象一个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乘n
,所以对于4乘4
网格,有16个可能的起始字符。和2^(n-1)
,因为由每个起始字符引导的电源集。当然,顺时针螺旋不是唯一可能的模式。但是我们已经可以看到第一种模式的时间复杂性:大ω(2^n),它是指数型的。看看。动态规划解决方案是O(D),其中D是字典的大小。您如何访问您的字典?i
表示什么以及为什么2(n-1)
?@Karoly Horvath,我编辑了i
。2(n-1)
是因为我们必须沿着垂直线和水平线查找。@svick让字典成为O(1)查找。