大O复杂性的决定

时间:2015-05-11 23:26:15

标签: java algorithm big-o

我对此代码的复杂性分析存在很大疑问。我需要研究" encontrarCaminos()"的复杂性。方法和我之间的撕裂是O(n * m),因为它会迭代n次(通过array.aslist(Caminos)找到所有同时通过迷宫的方式-in你永远不会进入方向到你已经通过的一个点 - 并且由于你经过的所有方向,每个n再次迭代6次。

n是i及其增量的迭代次数。

m是它检查的方向数,只是为了更清楚。

或者,它是O(n),因为6 m次(方向)是常数,因此我可以忽略它?

另外,如果我必须计算所有周期/指令,我应该在哪里放置"周期++;"特别针对这种方法的反击?它与我之前的问题有点相关,因为确定其复杂性将有助于此。

以下是有问题的代码:

http://pastebin.com/1mMGmigM

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);
}

非常感谢您对此的任何见解或帮助。

1 个答案:

答案 0 :(得分:0)

我们将this.xMap*this.yMap*this.zMap称为矩阵大小。

它看起来像O((矩阵大小)^ 2)。由于每次运行外循环时,direcciones被附加到某些常数次,因此对copiar的调用在时间上是O(矩阵大小)。然后每个循环迭代最多将Dir3D项(也是常量)的大小添加到caminos。这一直持续到添加了总共矩阵大小的项目为止。

我没有检查的一件事是,是否可以添加超过矩阵大小 - 在这种情况下你永远不会终止。