【问题标题】:O(n) of solution to solve boggleO(n) 的解决方案来解决 boggle
【发布时间】:2012-04-25 23:22:36
【问题描述】:

解决 boggle 的函数的最佳时间复杂度 O(n) 是多少,其中 boggle 板是 n × n?

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

【问题讨论】:

  • 你是如何访问你的字典的?
  • i 表示什么以及为什么2(n-1)??
  • @Karoly Horvath,我删掉了i2(n-1)是因为我们必须沿着垂直线和水平线看。
  • @svick 让字典成为 O(1) 查找。

标签: algorithm time-complexity boggle


【解决方案1】:

字典的功能不是很清楚。

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

由于在 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),所以你错了。目前,在这种假设下,我想不出具有更好时间复杂度的算法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      想象一个 4X4 的网格

      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),因为每个起始角色都领导着权力集。当然,顺时针螺旋并不是唯一可能的模式。但是我们已经可以看到第一个模式的时间复杂度:Big-Omega(2^n),它是指数的。

      【讨论】:

        猜你喜欢
        • 2016-03-14
        • 1970-01-01
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-28
        • 2011-07-22
        • 2020-03-02
        相关资源
        最近更新 更多