|
|
1
11
这里有一些C++代码,可以实现你想要的。它使用一个队列,并且在插入队列时效率更高。
|
|
|
2
24
只需使用一个固定大小的数组(例如,图像的像素大小或平方根大小)实现一个int对堆栈,并使用int跟踪顶部。 下面是一些实现非递归洪水填充的C代码:
|
|
3
9
快速的谷歌搜索会显示 Wikipedia article on Flood Fill 其中包括非递归的伪代码实现。下面是一些可以帮助您开始的代码,这是C语言中的基本队列实现:
|
|
|
4
7
难道没有证据证明所有递归函数都可以通过使用本地数据模拟堆栈实现为迭代函数吗?您可能可以使用std::vector创建算法的类似堆栈的行为,而不必刷新堆栈,因为它将使用堆栈。 编辑:我注意到您使用的是C,所以您可以通过realloc来实现类似的行为,而不是std::vector,因为您需要向您将要使用的任何数据结构的本地“堆栈”中添加更多元素。 |
|
|
5
3
您可以通过创建一个显式的堆栈或队列并将工作加载到它上面/将其拉出,将任何递归算法转换为迭代算法。
你所需要的是选择一个好的,紧凑的工作表示要完成。最坏情况:创建
|
|
|
6
2
我们注意到,我们在3D卷上的泛光填充实现占用了大量内存;因此,我们以以下方式修改了代码(有了很大的改进):
所以有一段时间,我们的洪泛填充是在一个同心球体上工作的,它填充了整个卷的一部分,正如我所说,这大大减少了内存消耗,但是我仍然在寻找一个更好的实现/想法。 |
|
|
7
1
我有一个非递归的洪泛填充,但我不会发布它,因为它是家庭作业的解决方案。但这里有一个提示:深度优先搜索,这是自然算法,使用 远的 比广度优先搜索更多的辅助空间。以下是我当时写的(适当删去):
对于我的数据结构,我使用
|
|
|
8
1
我不知道我的答案是否与你提出的问题完全相关,但在后面我提出了我的C版本的洪泛填充算法,它不使用递归调用。 1-11-2017:新版本;成功测试了两个位图。 它只使用新点的偏移队列,它在窗口上工作:双缓冲区的winnoffs(windimx,windimy):*vBuffer(屏幕或图像的副本),还可以编写一个洪水填充结果的掩码(*extravBuff)。 ExtravBuff必须在调用前用0填充(如果不需要遮罩,可以将ExtravBuff设置为空);调用后使用它可以进行渐变泛光填充或其他绘制效果。新的泛光填充每像素32位,它是一个C函数。我在1991年重新发明了这个算法(我在Pascal中写了他的),但现在它在C语言中工作,每像素32位;也不使用任何函数调用,只在队列中的每个“pop”之后执行一个除法,并且从不溢出队列,如果它的大小是正确的(大约是图像像素的1/4),它允许始终正确地填充任何区域;我在C函数(ffill.c)之前显示,在测试程序(test.c)之后显示:
这里有测试程序:
对于所示测试程序的输入,我使用了以下Windows Uncompressed.bmp图像(ffill1.bmp):
由所示测试程序填充,如下所示(ffill2.bmp):
使用“mask”而不是空,输出位图为(ffill3.bmp):
|
|
|
9
0
下面是我的BFS基于迭代C++的洪水填充问题的方法:
|
|
|
10
0
您可以快速地将递归洪泛填充转换为超性能的伪递归…不编辑行,只添加新行: 将递归函数放入xy循环中以添加结构。 将找到的邻居记录到“找到的邻居阵列” 而不是内存,因此您将开始将4-16-64样式的递归树打包到xy数组中。内存使用从1 Gygabyte变为2兆字节。 还可以使用一个称为“填充邻居数组”的二维数组…中止“填充邻居数组”中标记为填充的任何像素的函数,这对每个副本使用2条指令,对每个填充操作使用20条指令,并且它像多米诺骨牌一样反复向上和向左填充,速度极快。 1024x1024使用大约100万*20条指令,单核0.1秒。 我以这种方式在i7上每秒获得900万个填充像素,我有一个视频作为证明,还有一个包含代码和理论解释的博客页面: www.youtube.com/watch?v=4hQ1wA4Sl4c 这里有一页我试图解释它是如何工作的。 http://unity3dmc.blogspot.com/2017/02/ultimate-3d-floodfill-scanline.html?m=1 还有代码。 如果递归能够保持有序,那么它将是最快的。 如果通过数据网格(图像)进行递归,也可以以网格格式存储递归的处理,因为处理的步骤代表来自网格的像素,而不是将结果分解为树格式。 |
|
|
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 1 年前 |
|
|
Alisa Petrova · 在有向图中更改一对顶点以创建循环 1 年前 |
|
|
b39b332d · 使用C++标准库实现高效间隔存储 1 年前 |
|
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 1 年前 |
|
|
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 1 年前 |