为什么DFS在尝试查找Boggle板中的所有有效单词时都能正常工作

时间:2015-12-18 02:41:56

标签: algorithm graph boggle

我正在以编程方式解决Boggle游戏并注意到Depth First Search可用于查找棋盘中所有有效的字母组合。描述了一个Boggle板here

假设我们有4x4板。对于电路板上的每个字符,使用DFS查找电路板中的所有路径(唯一的规则是您不能多次使用单个字符)。当Boggle板不是真正的图形时,为什么DFS适用于此?此外,DFS应用于哪些其他类型的问题与此用法类似?

2 个答案:

答案 0 :(得分:0)

您可以应用DFS或其他图形算法,因为您基本上也可以在grid graph上使用对角线。

enter image description here

把你的字母而不是点放在你的图表上。现在为什么DFS会在这里工作?

在此游戏中创建单词时 - 连接相邻顶点,从而在图形上创建路径。所以这是一种方法,你可以从(并改进)开始。

  1. 创建一组英语字母表中的所有单词以及单词的合理长度(假设单词不长于N个字符)
  2. 从顶点开始迭代,并从每个顶点调用DFS,直到长度为N。对于每个单词(规则中大于3),检查它是否在字典中,如果是 - 将它们保存在某处。
  3. 您可以看到,在我的图表中,您可以轻松找到单词TORUS

    为什么使用DFS而不是BFS是有意义的?有几个原因:

    • 更容易实施
    • 方式更小的空间复杂性

    我的算法的复杂性是什么 假设您有一个网格n * m,最长的单词的长度为d。因为在我的算法中你从所有顶点实现DFS,并且DFS的复杂度是O(b ^ d),其中平均分支略小于8(可能甚至小于7,因为你不能在这里有循环)。在集合id(1)中搜索。因此复杂性为m * n * 8^d

    如何改进?尝试搜索单词TLRSOU没有多大意义,因为英语字母表中没有以TLR开头的单词。因此,更好的想法是将单词存储在trie中并快速终止那些没有意义的分支。

答案 1 :(得分:0)

那是因为它是(或可以)由图表表示。 Boggle单词由水平,垂直或对角线相邻的字母组成。因此,您可以按照此规则制作字母之间的连接图。此外,DFS不会访问节点两次,因为它会保留已访问过的节点列表。所以它满足了另一个规则,即一个字母只能使用一次。

DFS(以及BFS)最终会发现图中的每条路径,因此您可以将生成的路径列表与有效字词的字典进行比较,以确定单个Boggle板上的有效字总数。

最着名的DFS用途当然是寻路 - 几乎任何空间都可以映射到图形中,然后找到最短或最长的路径。 DFS可以很好地找到图的半径,从而找到最中心的节点。这对于洪水填充算法非常有用,在这种算法中,您希望快速填充不规则形状的内部,因为从图形中心开始边缘扩展将发生得最快。