Python Flood Fill - 如何优化

时间:2017-11-17 04:50:34

标签: python

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的区域需要几秒钟。有什么东西我做得非常错误,或者它对于大片区域应该是慢的吗?

编辑:为了清晰而编辑。

1 个答案:

答案 0 :(得分:1)

在:if (x+i,y+j) not in frontier and (x+i,y+j) not in region:,您正在测试cellfrontier还是region,两者都是列表,因此搜索它们需要O(n )。

1)您不需要检查细胞是否在边境。只要忽略区域中已有的单元格,就可以根据需要多次向区域添加单元格。

2)为region使用更高效的数据结构,即一组。