当前位置 : 主页 > 网络安全 > 测试自动化 >

哪种泛洪填充算法更适合性能?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在尝试实现类似泛洪的算法.问题是我不知道我应该以什么方式实现它,例如递归 – 非递归. 我知道每个都有缺陷,但其中一个必须比另一个快.当非递归每次分配4个新点时,递归在堆栈
我正在尝试实现类似泛洪的算法.问题是我不知道我应该以什么方式实现它,例如递归 – 非递归.
我知道每个都有缺陷,但其中一个必须比另一个快.当非递归每次分配4个新点时,递归在堆栈上打开新函数.
非迭代的示例:

Stack<Point> stack = new Stack<Point>();
    stack.Push(q);
    while (stack.Count > 0)
    {
        Point p = stack.Pop();
        int x = p.X;
        int y = p.Y;
        if (y < 0 || y > h - 1 || x < 0 || x > w - 1)
                continue;
        byte val = vals[y, x];
        if (val == SEED_COLOR)
        {
                vals[y, x] = COLOR;
                stack.Push(new Point(x + 1, y));
                stack.Push(new Point(x - 1, y));
                stack.Push(new Point(x, y + 1));
                stack.Push(new Point(x, y - 1));
        }
    }

编辑:我将在600X600像素的地图上应用以下算法.尽管洪水填充不会应用于整个地图,但每次迭代它应覆盖约30%-80%的地图.我的观点是发现高度图中的边缘并标记这些边缘以供进一步使用.

制作一个掩码 – 一个平行的2-dim字节数组.未经检查的区域字节为0,对于洪水区域的新边界,它将具有值1.对于洪水区域的内部 – 值2.并且还保留当前边界点的列表.

在外循环的任何一端,您都有具有标记的当前边界,内部和外部区域以及边界点阵列的蒙版.因此,您将仅在边框上检查新点.在检查边界点的第一个arraylist时,您正在创建第二个边框arraylist和第二个mask.在下一步中,您将重新创建第一个边框数组和蒙版.通过这种方式,我们可以使用简单的while循环而不是递归,因为您在任何步骤检查的数据结构都非常简单.

顺便说一句,你忘记检查新点的坐标是否在绘制的边界上或整个矩形的边界上.

至于在所有相邻点骑行,请查看我的算法here

网友评论