def getRegionSize(cell, world):
region = []
frontier = [cell]
val = world[cell[0]][cell[1]]
while(len(frontier) > 0):
item = frontier.pop()
region.append(item)
x = item[0]
y = item[1]
for i in [-1,1]:
for j in [-1,1]:
if (x+i,y+j) not in frontier and (x+i,y+j) not in region:
if not (x + i > width - 1 or x + i < 0 or y + j > height - 1 or y + i < 0) and world[x+i][y+j] == val:
frontier.append((x+i,y+j))
return len(region)
我希望我的函数确定连接到给定单元格的区域的大小。该函数将世界(2D二进制矩阵)和单元格((x,y)坐标)作为参数,并返回连接到单元格的区域的大小。
这个功能就像洪水填充一样,但不是重新着色区域,我只对重新着色区域的大小感兴趣。该功能工作正常,但速度很慢。返回大小超过~4000的区域需要几秒钟。有什么东西我做得非常错误,或者它对于大片区域应该是慢的吗?
编辑:为了清晰而编辑。
答案 0 :(得分:1)
在:if (x+i,y+j) not in frontier and (x+i,y+j) not in region:
,您正在测试cell
是frontier
还是region
,两者都是列表,因此搜索它们需要O(n )。
1)您不需要检查细胞是否在边境。只要忽略区域中已有的单元格,就可以根据需要多次向区域添加单元格。
2)为region
使用更高效的数据结构,即一组。