function Solve(f, z)
A←Φ
for x ∈ {0,1,2,...,z} do
for y ∈ {0,1,2,...,z} do
if f(x,y) = z then
A ← A ∪ {(x, y)}
return A
function Solve(f, z)
p ← 0, q ← z
S←Φ
while p ≤ z ∧ q ≥ 0 do
z′ ←f(p,q)
if z′ < z then
p←p+1
else if z′ > z then
q←q−1
else
S ← S ∪ {(p, q)}
p ← p + 1, q ← q − 1
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。
用个bool做返回值好些,如果找到了就不需要再找了。
复杂度,最糟糕的情况应该是log2(M*M*N) 假设 M<=N
用个bool做返回值好些,如果找到了就不需要再找了。
复杂度,最糟糕的情况应该是log2(M*M*N) 假设 M<=N
On Friday, May 3, 2013 12:34:38 PM UTC-4, qiaojie wrote:
def saddleback(f, z):(p, q) = (0, z)res = []while p <= z and q >= 0:z1 = f(p, q)if z1 < z:p = p + 1elif z1 > z:q = q - 1else:res.append((p, q))(p, q) = (p + 1, q - 1)return res
Hi, 各位,找到了不能立即返回,这样找的的解不全。这是2D与1D的一个不同之处。虽然f是strict increasing的,但是某个z会有多个对应值,请参考我前面给出的那个表格。例如4,还有5,都出现了多次。
另外,先在中心(z/2, z/2)检查,比较f(z/2, z/2)和z的大小后,关键点在于4个矩形中,可以丢弃的只有一个,搜索区域变成了一个L型。(要么丢弃top-left矩形,要么丢弃bottom-right矩形)。对于这剩下的L型,如何高效的进行divide and conquer的search是关键。这需要仔细的设计解法,我后继会给出。
我是说一条线,没有说是直线。如果你把矩阵看成一个高度场,那么因为其单调性,任意高度的等高线都是唯一的。所以你后面的复杂度分析是错的,最好情况是O(1),比如找左上角或右下角元素。每次递归时最坏情况只能扔掉一个子矩阵,但是继续往下递归就会发现不可能每次都是最坏情况,最后子矩阵范围会收敛到等于z值的等高线附近。所以定性分析的话这个算法是和z相关的线性复杂度算法。定量计算的话还没思路怎么算
--
---
您收到此邮件是因为您订阅了 Google 网上论坛的“TopLanguage”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 pongba+un...@googlegroups.com。
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。