我对此代码的复杂性分析存在很大疑问。我需要研究" encontrarCaminos()"的复杂性。方法和我之间的撕裂是O(n * m),因为它会迭代n次(通过array.aslist(Caminos)找到所有同时通过迷宫的方式-in你永远不会进入方向到你已经通过的一个点 - 并且由于你经过的所有方向,每个n再次迭代6次。
n是i及其增量的迭代次数。
m是它检查的方向数,只是为了更清楚。
或者,它是O(n),因为6 m次(方向)是常数,因此我可以忽略它?
另外,如果我必须计算所有周期/指令,我应该在哪里放置"周期++;"特别针对这种方法的反击?它与我之前的问题有点相关,因为确定其复杂性将有助于此。
以下是有问题的代码:
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);
}
非常感谢您对此的任何见解或帮助。
答案 0 :(得分:0)
我们将this.xMap*this.yMap*this.zMap
称为矩阵大小。
它看起来像O((矩阵大小)^ 2)。由于每次运行外循环时,direcciones被附加到某些常数次,因此对copiar的调用在时间上是O(矩阵大小)。然后每个循环迭代最多将Dir3D
项(也是常量)的大小添加到caminos。这一直持续到添加了总共矩阵大小的项目为止。
我没有检查的一件事是,是否可以添加超过矩阵大小 - 在这种情况下你永远不会终止。