gpt4 book ai didi

python - 最大矩形算法实现

转载 作者:太空狗 更新时间:2023-10-30 01:17:00 25 4
gpt4 key购买 nike

我正在尝试实现 Maximum Rectangle Algorithm from Dr. Dobbs ( list 四)使用 Python。它主要工作,但一个特定的案例给出了错误的结果,我无法弄清楚为什么。

这是我的源代码:

from collections import namedtuple

Point = namedtuple('Point', ('X', 'Y'))

#Y 0 1 2 X
arr = [[0, 0, 0, ], #0
[1, 0, 0, ], #1
[0, 0, 1, ], #2
]

def area(ll, ur):
if (ll.X < 0) or (ll.Y < 0) or (ur.X < 0) or (ur.Y < 0):
return 0.
return ((ur.X - ll.X) + 1) * ((ur.Y - ll.Y) + 1)

def update_cache(a, c, x):
M = len(a[0])
N = len(a)
for y in range(M):
if a[x][y] == 0:
c[y] = c[y] + 1
else:
c[y] = 0

def mrp(a):
best_ll = Point(-1, -1)
best_ur = Point(-1, -1)
M = len(a[0])
N = len(a)
c = [0 for x in range(M + 1)]
stack = []
for x in range(N-1, -1, -1):

update_cache(a, c, x)
width = 0
for y in range(M + 1):
if c[y] > width:
stack.append((y, width))
width = c[y]
if c[y] < width:
while True:
y0, w0 = stack.pop()
if (width * (y - y0)) > area(best_ll, best_ur):
best_ll = Point(x, y0)
best_ur = Point(x + width - 1, y - 1)
width = w0
if (c[y] >= width):
break
width = c[y]
if width == 0:
stack.append((y0, width))
return best_ll, best_ur

结果如下:

>>> mrp(arr)
(Point(X=0, Y=0), Point(X=1, Y=2))

如您所见,第一点是错误的,但我无法弄清楚它在哪里以及为什么会出错。更改 arr 会得到正确的结果。

编辑:我注意到与文章相比,我已经更改了数组的值。这会更改 update_cache 中的比较。 0=清除,1=保留。我正在寻找结果 (Point(X=0, Y=1), Point(X=1, Y=2))。

最佳答案

最后的 stack.append 应该是:

stack.append((y0, w0))

关于python - 最大矩形算法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8663079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com