【问题标题】:Time complexity of Boggle solverBoggle 求解器的时间复杂度
【发布时间】:2015-05-03 03:50:48
【问题描述】:

这是一个在 Boggle 中查找所有单词的(丑陋的)算法:

d = {'cat', 'dog', 'bird'}

grid = [
    ['a', 'd', 'c', 'd'],
    ['o', 'c', 'a', 't'],
    ['a', 'g', 'c', 'd'],
    ['a', 'b', 'c', 'd']
]

found = {}

N = 4

def solve(row, col, prefix):
    if prefix in d and prefix not in found:
        found[prefix] = True
        print prefix

    for i in xrange(max(0, row - 1), min(N, row + 2)):
        for j in xrange(max(0, col - 1), min(N, col + 2)):
            c = grid[i][j]
            if c != '#' and not (row == i and col == j):
                grid[i][j] = '#'
                solve(i, j, prefix + c)
                grid[i][j] = c


for row in xrange(N):
    for col in xrange(N):
        c = grid[row][col]
        grid[row][col] = '#'
        solve(row, col, c)
        grid[row][col] = c

这个算法的 Big-O 运行时间是多少?我相信是O((N²)!),但我不确定。

【问题讨论】:

  • 注意d的长度。它是一个常数,但是当您搜索 d 时,它会乘以求解的调用次数。所以我认为这有可能使大字典变得更糟(你可能会在实践中使用它)。

标签: python algorithm time-complexity big-o boggle


【解决方案1】:

求解函数将一个又一个元素变成#,在最坏的情况下直到整个网格只包含#。但是由于您从网格中的特定点开始并且只允许下一个# 成为直接邻居,因此您不会获得所有(N²)! 可能的排列。你只会得到类似O(8<sup>N<sup>2</sup></sup>) 的东西,因为网格中的每个节点最多有 8 个直接邻居。边界处的元素的邻居较少,因此您可以稍微改进一下。

最后的for-loop,遍历网格中的所有元素并调用solve函数,所以总共是O(N<sup>2</sup>⋅8<sup>N<sup>2</sup></sup>)

注意:8<sup>N<sup>2</sup></sup>(N²)! 好很多,只要N² ≥ 20,即N ≥ 5

注意:我假设d 只有一个恒定的长度。如果不是这样,则必须将d 的长度添加到复杂度计算中。

【讨论】:

  • 注意:8N2 比 (N²) 好很多!只要 N² ≥ 20,即 N ≥ 5。 你确定吗? 8^25 比 25 大很多...
  • @1.618 8^20 ~ 1.15*10^1820! ~ 2.43*10^18 还是我的计算器坏了?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多