Análisis de Complejidad
Análisis de Complejidad
Análisis de Complejidad
Contenido
El Problema del Aserradero....................................2
Descripcin del problema.....................................2
Propuesta de Resolucin por medio de
Ramificacin y Poda..............................................2
Anlisis de complejidad temporal.......................4
Anlisis de Complejidad espacial........................5
0
1
0
0
0
00
01
2
3
4
5
6
7
8
9
10
11
12
13
14
15 5
16
17
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Nivel
1
2
0
0
2
0
1 Nivel
1
1
0
01
1
2
00
0
0
3
2
2
2
2
2
1
1
1
1
1
0
0
0
0
0
0
2
1
1
0
0
2
1
1
0
0
2
1
1
0
0
Tota
lM
0
2
3
Tota
2
lM
2
3
0
0
0
0
3
0
4
1
7
0
4
1
5
0
2
0
5
1
6
0
3
1
4
0
1
0
4
1
5
0
2
1
3
0
0
i (ni)+n
i=1
n1
n1
i=1
i=1
n i i 2+ n
n(n1) n n(n1)(2n1)
+n
2
6
n(n1)(n+ 1)
+n
6
****************************
*/
//total de cortes
//numero de cortes realizados
de cortes realizados en orden
de zonas de corte
}
void liberar(){
delete[] cortes;
delete[] trozos;
delete[] corteslistos;
}
bool cortar(int idx, tronco& _tronco){
if(hechos == n || idx+1 > n - hechos)return false;
int i,j,k;
j=0;k=0;
while(k+trozos[j].lims-trozos[j].limi-1 < idx+1){
k+=trozos[j].lims-trozos[j].limi-1;
j++;
}
k = trozos[j].limi+idx+1-k;
////////////////////////////////////////////////////7
_tronco.n = n;
_tronco.hechos = hechos+1;
_tronco.costo = costo+cortes[trozos[j].lims]-cortes[trozos[j].limi];
//cout<<"c: "<<hechos<<"costo: "<<_tronco.costo<<endl;
_tronco.cortes = new int[n+2];
for(i=0;i<n+2;i++) _tronco.cortes[i] = cortes[i];
_tronco.corteslistos = new int[hechos+1];
for(i=0;i<hechos;i++) _tronco.corteslistos[i] = corteslistos[i];
//falta 1
_tronco.corteslistos[hechos] = k;
_tronco.trozos = new trozo[hechos+2];
_tronco.trozos[j].limi = trozos[j].limi;
_tronco.trozos[j].lims
= k;
_tronco.trozos[j+1].limi = k;
_tronco.trozos[j+1].lims = trozos[j].lims;
for(i=0;i<j;i++) _tronco.trozos[i] = trozos[i];
for(i=j+2;i<hechos+2;i++) _tronco.trozos[i] = trozos[i-1];
return true;
}
};
int main(int argc, char *argv[]) {
int numCortes;
int largo;
int *cortes;
//
/**
ENTRADA
*/
base.n = numCortes;
base.trozos = new trozo;
base.trozos->limi=0;
base.trozos->lims=numCortes+1;
base.cortes=new int[numCortes+2];
int coptimo = largo;
base.cortes[0]=0;
base.cortes[numCortes+1]=largo;
for(int i=0;i<numCortes;i++) {
base.cortes[i+1] = cortes[i];
coptimo += cortes[i];
}
delete[] cortes;
tronco boptimo;
boptimo.costo = coptimo;
int i=0;
tronco temp, nuevo;
/*****************************************************************************/
/** Metodo: ramificacion y poda */
stack<tronco> arbol;
/** Se utiliza una pila, el arbol sera recorrido
primero en profundidad */
arbol.push(base);
while(!arbol.empty()){
temp = arbol.top();
arbol.pop();
if(temp.hechos == numCortes){
recorrido llega a una hoja */
if (temp.costo < boptimo.costo){
para seleccionar el optimo */
boptimo.liberar();
boptimo = temp;
}
}
else {
if(temp.costo < boptimo.costo){
no se sigue recorriendo si el costo de */
/** si el
/** compara costos
i=0;
}
temp.liberar();
}
}
/*****************************************************************************/
for(i=0;i<numCortes;i++){
cout<<boptimo.cortes[boptimo.corteslistos[i]]<<endl;
}
cout<<"costo: "<<boptimo.costo;
boptimo.liberar();
//
return 0;
trozo t;
10
Ejemplo 2
Como segundo ejemplo, consideraremos una pedazo de madera de 500
cm de longitud, y realizaremos 10 cortes, a 15, 20, 35, 45, 70, 80, 100,
115, 150, 190 y 195.
11
12