大 O 复杂性决策
Big O complexity decision
我对这段代码的复杂性分析产生了很大的疑问。我需要研究 "encontrarCaminos()" 方法的复杂性,我在 O(n*m) 之间左右为难,因为它要迭代 n 次(通过 array.aslist (Caminos) 找到所有同时穿过迷宫的方法 - 在这个迷宫中,你永远无法朝着你已经通过的点的方向前进 -) 并且由于你经过的所有方向,每个 n 再次重复它 6 次。
n 是 i 的迭代次数及其增量。
m是它检查的方向数,只是为了更清楚。
或者,它是 O(n),因为 6 m 次(方向)是一个常数,因此我可以忽略 em?。
此外,如果我必须计算所有 cycles/instructions,我应该将此方法的 "cycles++;" 计数器放在哪里?这与我之前的问题有点相关,因为确定它的复杂性将对此有所帮助。
这是有问题的代码段:
public void encontrarCaminos()
{
boolean complete=false;
int i=0;
while(!complete)
{
for (Dir3D d: Dir3D.values())
{
Camino cAux = this.camino(i).copiar();
cAux.agregarDireccion(d);
Posicion pAux = cAux.posicionFinal();
if(chequearLimite(pAux) && this.get(pAux))
{
this.agregarCamino(cAux);
this.set(pAux, false);
}
}
i++;
if( this.cantCaminos()==(this.xMap*this.yMap*this.zMap))
complete=true;
}
System.out.println(caminos);
}
//auxiliary things below, some of those are pretty straigthforward, but still.
###############################################################################
public boolean chequearLimite(Posicion p)
{
return 0<=p.getX() && p.getX()<this.xMap
&& 0<=p.getY() && p.getY()<this.yMap
&& 0<=p.getZ() && p.getZ()<this.zMap;
}
##############################################################################
public int cantCaminos()
{
return caminos.size();
}
###############################################################################
public void agregarDireccion(Dir3D dir)
{
direcciones.add(dir);
if (dir == Dir3D.ATRAS) posicionFinal.setY(posicionFinal.getY()-1);
if (dir == Dir3D.DERECHA) posicionFinal.setX(posicionFinal.getX()+1);
if (dir == Dir3D.ARRIBA) posicionFinal.setZ(posicionFinal.getZ()+1);
if (dir == Dir3D.ADELANTE) posicionFinal.setY(posicionFinal.getY()+1);
if (dir == Dir3D.IZQUIERDA) posicionFinal.setX(posicionFinal.getX()-1);
if (dir == Dir3D.ABAJO) posicionFinal.setZ(posicionFinal.getZ()-1);
}
########################################################################################
public Camino copiar()
{
Camino aux = new Camino(Posicion.copiar(posicionInicial));
for (int i= 0;i<direcciones.size();i++)
{
aux.agregarDireccion(direcciones.get(i));
}
return aux;
}
########################################################################################
public Camino camino(Integer indice)
{
return caminos.get(indice);
}
任何对此的见解或帮助将不胜感激。
让我们将 this.xMap*this.yMap*this.zMap
称为矩阵大小。
对我来说它看起来是 O((矩阵大小)^2)。由于 direcciones 被附加到每个 运行 外循环的某个常数次数,因此对 copiar 的调用在时间上为 O(matrix-size)。然后每次循环迭代最多将 Dir3D
项目的大小(也是一个常数)添加到caminos。这一直持续到总共添加了矩阵大小的项目。
我没有检查的一件事是是否可以添加超过矩阵大小的内容——在这种情况下您永远不会终止。
我对这段代码的复杂性分析产生了很大的疑问。我需要研究 "encontrarCaminos()" 方法的复杂性,我在 O(n*m) 之间左右为难,因为它要迭代 n 次(通过 array.aslist (Caminos) 找到所有同时穿过迷宫的方法 - 在这个迷宫中,你永远无法朝着你已经通过的点的方向前进 -) 并且由于你经过的所有方向,每个 n 再次重复它 6 次。
n 是 i 的迭代次数及其增量。
m是它检查的方向数,只是为了更清楚。
或者,它是 O(n),因为 6 m 次(方向)是一个常数,因此我可以忽略 em?。
此外,如果我必须计算所有 cycles/instructions,我应该将此方法的 "cycles++;" 计数器放在哪里?这与我之前的问题有点相关,因为确定它的复杂性将对此有所帮助。
这是有问题的代码段:
public void encontrarCaminos()
{
boolean complete=false;
int i=0;
while(!complete)
{
for (Dir3D d: Dir3D.values())
{
Camino cAux = this.camino(i).copiar();
cAux.agregarDireccion(d);
Posicion pAux = cAux.posicionFinal();
if(chequearLimite(pAux) && this.get(pAux))
{
this.agregarCamino(cAux);
this.set(pAux, false);
}
}
i++;
if( this.cantCaminos()==(this.xMap*this.yMap*this.zMap))
complete=true;
}
System.out.println(caminos);
}
//auxiliary things below, some of those are pretty straigthforward, but still.
###############################################################################
public boolean chequearLimite(Posicion p)
{
return 0<=p.getX() && p.getX()<this.xMap
&& 0<=p.getY() && p.getY()<this.yMap
&& 0<=p.getZ() && p.getZ()<this.zMap;
}
##############################################################################
public int cantCaminos()
{
return caminos.size();
}
###############################################################################
public void agregarDireccion(Dir3D dir)
{
direcciones.add(dir);
if (dir == Dir3D.ATRAS) posicionFinal.setY(posicionFinal.getY()-1);
if (dir == Dir3D.DERECHA) posicionFinal.setX(posicionFinal.getX()+1);
if (dir == Dir3D.ARRIBA) posicionFinal.setZ(posicionFinal.getZ()+1);
if (dir == Dir3D.ADELANTE) posicionFinal.setY(posicionFinal.getY()+1);
if (dir == Dir3D.IZQUIERDA) posicionFinal.setX(posicionFinal.getX()-1);
if (dir == Dir3D.ABAJO) posicionFinal.setZ(posicionFinal.getZ()-1);
}
########################################################################################
public Camino copiar()
{
Camino aux = new Camino(Posicion.copiar(posicionInicial));
for (int i= 0;i<direcciones.size();i++)
{
aux.agregarDireccion(direcciones.get(i));
}
return aux;
}
########################################################################################
public Camino camino(Integer indice)
{
return caminos.get(indice);
}
任何对此的见解或帮助将不胜感激。
让我们将 this.xMap*this.yMap*this.zMap
称为矩阵大小。
对我来说它看起来是 O((矩阵大小)^2)。由于 direcciones 被附加到每个 运行 外循环的某个常数次数,因此对 copiar 的调用在时间上为 O(matrix-size)。然后每次循环迭代最多将 Dir3D
项目的大小(也是一个常数)添加到caminos。这一直持续到总共添加了矩阵大小的项目。
我没有检查的一件事是是否可以添加超过矩阵大小的内容——在这种情况下您永远不会终止。