【问题标题】:Saddleback search starting point鞍背搜索起点
【发布时间】: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这个问题明确说明搜索模式是什么。
  • 我已经包含了对搜索模式进行编码的最终算法,谢谢。

标签: algorithm sorting haskell


【解决方案1】:

问题的典型输入如下所示:

黑色像素表示大于t 的值,白色较小,灰色相等。我们的目标是找到所有的灰色点。理想情况下,要进行此搜索,我们只想沿着黑白之间的边界走。唯一的问题是我们不知道边界从哪里开始,所以我们需要搜索甚至知道在哪里搜索。如果我们从左下角开始,我们将不得不这样做:

第一步是找到边界,我们可以从左下角向上扫描直到找到它。但是……我们必须转身!搜索的其余部分,我们继续向下和向右。所以我们必须将我们的搜索分为两个阶段,一个是寻找边界,另一个是跟随它。不过,如果你从左上角开始...

这一次,我们不必转身,这意味着我们可以重用我们用于跟踪其余边界的相同代码来首先找到边界!

这回答了“为什么不从原点开始”。另一个问题,“为什么不在一个方向增加而在另一个方向减少”,嗯......你可以。这是一个几乎相同的问题,几乎相同的算法将解决它。

【讨论】:

  • 谢谢,我的另一个问题是为什么不增加两个方向,但我认为这很好地回答了它。
  • @KareemTaha 我不明白“为什么不增加两个方向”是什么意思。 f 不是已经双向增长了吗?
  • 我的意思是迭代索引的方向。
  • @KareemTaha 增加两个方向的索引将向上和向右移动。边界向上和向左移动。所以如果你只向右移动,你只会越过边界一次。
【解决方案2】:

我一直在阅读this,我想我现在明白为什么在链接中,关于两个排序列表的目标总和存在一个更简单的问题,问题陈述:

给定一个值 k 和两个排序的整数列表(都是不同的),找到 i + j == k 的所有整数对 (i, j)。

解决方案必须决定在哪个列表上移动list1list2或两者,以及何时,然后按升序对list1进行排序,然后list2 按降序排列,这有助于为每个案例分配决策

i 表示元素list1j 表示list2 中的元素,

i+j < k
i+j > k
i+j == k

分别映射到move on (list1, list2, both)。


现在同样适用于矩阵情况,假设我们从原点 (0,0) 开始, 因为我们自下而上遍历每一列,让我们在列 a 中,假设我们在行 b 处命中一个元素 z 使得 z=f(a,b) &gt;= t 然后我们可以离开列 a 和行 b,实际上以(a,b) 作为左下角的整个上矩形(因为f 在两个参数中都严格增加,并且从原点开始,两者都在增加)。

下一个起点会是(a+1,0),但是当z=f(a,b) &lt; t我们什么都做不了,就在当前列中补全,直到遇到大于t的元素,否则列结束。

从问题中的搜索算法实现来看,似乎选择一个索引增加另一个减少,在实现中引入了更多的规律性,而且新的起点通常在矩阵内部,所以我们不对会减少搜索空间的点进行线性搜索,这与从(a+1,0) 开始不同。

我无法进行全面分析以了解在最坏情况下时间复杂度如何受到影响,但我认为这是令人信服的。

欢迎任何 cmets,非常感谢完整的分析解决方案。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多