Java 如何从二维阵列中的一个点增加相邻单元
我试图使Lee算法的实现更加高效,到目前为止,我正在使用一个立方循环来增加2D整数数组中的相邻单元格:Java 如何从二维阵列中的一个点增加相邻单元,java,arrays,algorithm,path,increment,Java,Arrays,Algorithm,Path,Increment,我试图使Lee算法的实现更加高效,到目前为止,我正在使用一个立方循环来增加2D整数数组中的相邻单元格: for(int k = 1; k < g.length*2; ++k){ for(int i = x0-k; i < x1+k; ++i) for(int j = y0-k; j < x1+k; ++j) { if(i > 0
for(int k = 1; k < g.length*2; ++k){
for(int i = x0-k; i < x1+k; ++i)
for(int j = y0-k; j < x1+k; ++j)
{
if(i > 0 && j > 0 && i < g.length-1 && j < g.length-1)
{
if(g[x1][y1] != 0)
return true;
if(g[i][j] == k && g[i+1][j] == 0){
g[i+1][j] = k + 1;
}
if(g[i][j] == k && g[i][j+1] == 0){
g[i][j+1] = k + 1;
}
if(g[i][j] == k && g[i-1][j] == 0){
g[i-1][j] = k + 1;
}
if(g[i][j] == k && g[i][j-1] == 0){
g[i][j-1] = k + 1;
}
}
}
}
是否有一种更快的方法来填充网格,同时检查值?我对该算法知之甚少,但一些资料建议您选择起点作为距离图形中心最远的点 我运行了您的示例,并在开头添加了以下代码:
if (d2 > d1) {
startRow = startRow ^ endRow;
endRow = startRow ^ endRow;
startRow = startRow ^ endRow;
startCol = startCol ^ endCol;
endCol = startCol ^ endCol;
startCol = startCol ^ endCol;
}
其中,d2
和d1
分别是从终点和起点到中心的距离
我计时了100多万次,速度提高了约20%
他们建议的另一种选择是同时从起点和终点扇出-但我不确定其停止条件是什么(因为目标将从代码中的1开始)。无论何时访问
g
数组,例如g[I][j]
,发动机罩下有两个。如果边界检查失败,将抛出java.lang.IndexOutOfBoundsException
您可以将边界检查的数量减少一半
您可以使用简单的1D数组g[W*H]
,而不是使用2D数组g[W*H]
。
然后,不用写
g[i][j]
,你可以写g[i*W+j]
x0
和y0
是起始单元格?是的,x0,y0是起始单元格x1,y1是目标单元格如果我停止递增,这肯定是我可以做的,以改善当前循环,然而,我正在寻找一些东西来完全取代立方环。我得到了一些提示,可以使用数组列表来完成,但是我不知道怎么做。@user2266341我不确定这是否有意义-数组列表基本上只是一个动态数组。阵列是否会有任何边界(不可交叉点)?我不确定他所说的“存储波前”到底是什么意思。在我看来,波阵面是一个递增整数的前值,但我不知道他存储它是什么意思。@user2266341我想你可能想澄清一下,他说的是时间效率还是空间效率。
if (d2 > d1) {
startRow = startRow ^ endRow;
endRow = startRow ^ endRow;
startRow = startRow ^ endRow;
startCol = startCol ^ endCol;
endCol = startCol ^ endCol;
startCol = startCol ^ endCol;
}