【发布时间】:2021-08-19 21:04:47
【问题描述】:
我目前正在阅读 Richard Bird 和 Jeremy Gibbons 的 Haskell 算法设计,Saddleback search算法在第 4 章中给出了二分查找后,给出的动机问题是:
给定 f:N x N -> N 在两个参数中严格递增,并且值 t 找到所有对 (x,y) 使得 f(x,y)=t。
第一个定义由search f t =[(x,y) | x ← [0..t],y ← [0..t],t == f(x,y)]给出,从左下角的原点开始搜索到右上角,(索引从下到上,从左到右递增),然后预订收益以进行改进。
第二个定义由search f t =[(x,y) | x ← [0..t], y ← [t,t −1..0],t == f(x, y)]给出,
这本书引用了这个定义
“第一个改进是从左上角而不是左下角开始”,然后这本书继续直到它变成Theta(m+n) 用于尺寸为n x m 的矩阵。
最终的算法是这样的
search f t = searchIn (0,t)
where searchIn (x, y) | x>t ∨ y<0 =[]
| z<t = searchIn (x+1, y)
| z == t = (x, y):searchIn (x+1, y−1)
| z>t = searchIn (x,y−1)
where z = f(x,y)
为什么会这样?从原点(0,0)开始有什么问题? 为什么要把x坐标增加而y坐标减少,反之亦然(我在leetCode上看到过x减少y增加),为什么不是两个坐标都沿递增方向?
【问题讨论】:
-
两者的区别在于搜索模式。我可以猜到搜索模式是什么,但你应该edit这个问题明确说明搜索模式是什么。
-
我已经包含了对搜索模式进行编码的最终算法,谢谢。