搜索算法:从理论到实践
在解决问题时,有时我们需要对所有可能的情况进行逐一检查,这种方法被称为穷举搜索。虽然穷举搜索在某些情况下可能效率较低,但对于一些没有已知多项式时间算法的问题,它仍然是一种可行的解决方案。本文将介绍几种常见的搜索算法,包括深度优先搜索(DFS)、广度优先搜索(BFS),并通过一些经典的谜题来展示它们的应用。
1. 隐式搜索与 n 皇后问题
1.1 隐式搜索模式
隐式搜索的基本模式可以表示为 solutions = filter good · candidates
,其中 candidates
函数根据给定数据生成可能的候选列表, filter
操作则从这些候选中提取出“好”的候选。如果只需要找到一个解,可以使用 solution = head · solutions
。在惰性求值的情况下,这种方法不会损失效率,因为只需要计算 solutions
的第一个元素。
1.2 n 皇后问题
n 皇后问题是一个经典的谜题,要求在 n×n 的棋盘上放置 n 个皇后,使得任意两个皇后都不能相互攻击。这个问题可以通过隐式搜索来解决。
初始解法
最初的解法是生成 1 到 n 的所有排列,然后过滤掉那些不满足皇后安全条件的排列。代码如下:
safe::[Nat] -> Bool
safe qs = check (zip [1..] qs)
check