计算矩形的数量

时间:2016-02-07 14:42:18

标签: algorithm combinatorics discrete-mathematics

存在 NxM 网格,编号为1,2,...NM(编号以行方式完成。第一行将包含从 1 M <的数字/ strong>,第二行将包含 M + 1 2M ,依此类推。)

还列出了 X 数字,范围从 1 NM

问题:*计算网格线上带边的矩形总数,它包含 X 列中的 K K 范围从 0 X的长度

示例值超过1000字:

Let N=2, M=2 and X=[1,2].
Rectangle containing 0 points: 3
Rectangle containing 1 points: 4
Rectangle containing 2 points: 2

我的方法

我知道此网格中可能存在的矩形总数为n(n+1)m(m+1)/4,但无法想到其他任何内容。

修改
1≤N,M≤10^ 7
1≤长度X≤10^ 5
1≤列表X中的元素≤N* M

1 个答案:

答案 0 :(得分:3)

他是O(n^2 * m^2)方法。

将行网格线编号为row[0], ..., row[n],将列网格线编号为column[0], ..., column[n]。让f[x][y]表示矩形中包含X的点数,其中包含顶边 - row[0],底边 - row[x],左边 - column[0],右边方 - column[y]。请注意,您只能在f时间内以自下而上的方式计算O(n*m)(这是动态编程)。

现在,每个矩形都有顶边 - row[x1],底边 - row[x2],左边 - column[y1],左边column[y2]x1<x2y1<y2)您可以将X点的总数计算为f[x2][y2]-f[x1][y2]-f[x2][y1]+f[x1][y1]。计算出放在计数图中的数字后,该图将当前矩形中包含的X中的点数与您遇到此数字的次数相关联。您可以使用hashmap

总共有O(n^2*m^2)

在您的示例中,对于f,您有:

f[0][0] = f[0][1] = f[0][2] = f[1][0] = f[2][0] = 0
f[1][1] = 1
f[1][2] = 2
f[2][1] = 1
f[2][2] = 2

现在,对于矩形row[0], row[1], column[1], column[2],您有X中包含在此矩形中的点数:

number = f[1][2]-f[0][2]-f[1][1]+f[0][0] = 2-0-1+0 = 1

这是正确的。

请注意,暴力方法的复杂性为O(n^4 * m^4)