You are on page 1of 7

Examen de Algortmica y Complejidad (Plan 2014)

N matrcula:

14 de noviembre de 2016

Nombre:

Apellidos:

Mdulo 1. Complejidad Algortmica.


CUESTIONES (3 PUNTOS) Contesta justificando brevemente la respuesta, a las siguientes
cuestiones:
1.1 (0.5 puntos) Sea un algoritmo A1 que tiene orden de complejidad (N). Diseamos un
algoritmo A2 que tiene orden de complejidad (0,1N). Se puede afirmar que es preferible el
algoritmo A2 al A1 para tamao de problemas suficientemente grandes?
No se puede afirmar que el algoritmo A2 es mejor que A1 para
problemas suficientemente grandes. Basta con considerar el
siguiente contraejemplo:
El tiempo que tarda el algoritmo A1 es T1(N)=N(N)
El tiempo que tarda el algoritmo A2 es T2(N)=2N(0.1N)
Tenemos que T1(N)<T2(N)para N>0.
1.2 (0.5 puntos) Sea un algoritmo A1 que tiene orden de complejidad (N). Diseamos un
algoritmo A2 que tiene orden de complejidad (N2). El algoritmo A1 tarda siempre menos
que A2?
No se puede afirmar que el algoritmo A1 tarde siempre menos que A2.
Basta con considerar el siguiente contraejemplo:
El tiempo que tarda el algoritmo A1 es T1(N)=N(N)
El tiempo que tarda el algoritmo A2 es T2(N)=0.1N2(N2)
Tenemos que T1(N)>T2(N)para N=1.
1.3 (1 punto) Justifica si es verdadero o falso cada una de las siguientes afirmaciones:
a) Si f(N) O(g(N)), entonces g(N) (f(N)) (0.25 puntos)
Falso. Considrese por ejemplo f(N)= N2 y g(N)=N. Tenemos
siguiente:
N2 O(N)
N (N2)
b) Si f(N) O(g(N)), entonces g(N) (f(N)) (0.25 puntos)

lo

f(N)=N y g(N)=N2. Tenemos

lo

Falso. Considrese
siguiente:
N O(N2)
N2 (N)
c) 5N (52n)

por

ejemplo

(0.25 puntos)

Examen de Algortmica y Complejidad (Plan 2014)


Falso ya que lim
d) ln N (log10 N)

lim 5

Verdadero ya que lim

14 de noviembre de 2016

.
(0.25 puntos)
lim

ln 10

1.4 (0.5 puntos) Calcula la complejidad del siguiente algoritmo:


intfunc(intn){
intl=0;
for(inti=0;i<=n;i++)
for(intj=0;j<=n*n;j++)
for(intk=0;k<=n*n*n*n;k++)
l++;
returnl;
}

1.5 (0.5 puntos) Si disponemos de arrays casi ordenados, Qu algoritmo es preferible, el


algoritmo de seleccin o el de insercin?
Es preferible al algoritmo de ordenacin por insercin. El
algoritmo de ordenacin por seleccin siempre tarda lo mismo
independientemente de si el array est ordenado completamente o
totalmente desordenado. La complejidad del algoritmo de
ordenacin por seleccin es siempre (N2). Por el contrario, la
complejidad del algoritmo de ordenacin por insercin para
arrays casi ordenados es (N) (caso mejor).

Examen de Algortmica y Complejidad (Plan 2014)

N matrcula:

14 de noviembre de 2016

Nombre:

Apellidos:

Mdulo 2. Divide y Vencers.


PROBLEMA. (3.5 PUNTOS)
Dado un array de nmeros en los que todos ellos aparecen dos veces salvo uno, se desea buscar el nico
elemento que aparece slo una vez.
Consideremos por ejemplo el siguiente array:
1

El nico elemento que aparece una vez es 4.


a) Disear e implementar en Java un algoritmo basado en Divide y Vencers que solucione este
problema con complejidad (log N) para el caso peor (2.5 puntos).
b) Demuestra que la complejidad del algoritmo es (log N) para el caso peor (1 punto).
intelementoSolitarioAux(int[]vector,inti0,intiN){
if(i0==iN)
returnvector[i0];
else{
intk=(i0+iN)/2;
if(vector[k1]==vector[k])
//Seencuentraen[i0...k2]obienen[k+1...iN]
if((k2i0+1)%2==0)
returnelementoSolitarioAux(vector,k+1,iN);
else
returnelementoSolitarioAux(vector,i0,k2);
elseif(vector[k]==vector[k+1])
//Seencuentraen[i0...k1]obienen[k+2...iN]
if((k1i0+1)%2==0)
returnelementoSolitarioAux(vector,k+2,iN);
else
returnelementoSolitarioAux(vector,i0,k1);
else
returnvector[k];
}
}

intelementoSolitario(int[]vector){
returnelementoSolitarioAux(vector,0,vector.length1);
}

La ecuacin de recurrencia del algoritmo para el caso peor es de la


forma:
T(N)=T(N/2)+(1)
Ecuacin de recurrencia que se ajusta al primer caso del teorema Maestro.
Por lo tanto, la complejidad en el caso peor es: (log N)

Examen de Algortmica y Complejidad (Plan 2014)

14 de noviembre de 2016

Mdulo 3. Bactracking.
PROBLEMA. (3.5 PUNTOS)
Se desea resolver el siguiente juego mediante el esquema de backtracking. Se dispone de un tablero de una
lnea con 2n+1 espacios para poner canicas en l. Tambin se tienen n canicas negras y el mismo nmero
de canicas blancas. Inicialmente las canicas negras estn en un extremo (por ejemplo a la izquierda), las
canicas blancas en el otro extremo, y un espacio libre en el medio.

El objetivo del juego es intercambiar las posiciones de las canicas.

Para ello se deben cumplir las siguientes reglas:


1. Las canicas negras slo pueden moverse a la derecha, y las canicas blancas slo pueden moverse
hacia la izquierda.
2. Las canicas se mueven en turnos alternos de color estrictos.
3. En cada jugada, una canica puede:
a. Moverse a un espacio adyacente si el espacio est libre, o
b. Saltar por encima de una nica canica del color contrario, si el espacio adyacente a esa
canica est vaco.
Ejemplo:
inicio
mueven negras
mueven blancas
mueven negras
mueven blancas
mueven negras, aggg!!!

Examen de Algortmica y Complejidad (Plan 2014)

14 de noviembre de 2016

SE PIDE:
a) Estructura de datos que permita almacenar el estado de resolucin del problema y descripcin de
la funcin que identifica la solucin del problema (0.75 puntos)
b) Estructura de datos que permita almacenar los pasos que llevan a la solucin del problema (0.75
puntos)
c) Identificar el conjunto de candidatos posibles y descripcin del criterio de seleccin de candidatos
(0.75 puntos)
d) Descripcin de la funcin aceptable y operaciones realizadas para los procesos de anotar y
desanotar (0.75 puntos)
e) Esquema general de la solucin (0.50 puntos)
NOTAS:
No es necesario incluir cdigo. Las explicaciones aportadas deben ser lo suficientemente explicativas para
no generar dudas.

Examen de Algortmica y Complejidad (Plan 2014)

14 de noviembre de 2016

Mdulo 3. Bactracking.
a) Estructura de datos que permita almacenar el estado de resolucin del problema y descripcin de
la funcin que identifica la solucin del problema (0.75 puntos)
La estructura de datos para almacenar el estado de resolucin del
problema sera un vector de 2n+1 posiciones en las que se indica
de forma diferenciada qu posicin est ocupada por una ficha
blanca, cual por una ficha negra y cual por el espacio. Adems
necesitamos una variable que indique el turno actual.
La funcin que indica la solucin simplemente compara el vector en
el que se almacena el estado de la resolucin del problema con un
vector precargado con los contenidos adecuados (inverso de la
situacin inicial).

b) Estructura de datos que permita almacenar los pasos que llevan a la solucin del problema (0.75
puntos)
Para poder generar la solucin es necesario crear una estructura
de datos dinmica que guarde cada uno de los movimientos realizados,
por ejemplo una lista. Cada movimiento estara representado por una
clase que al menos debera guardar la posicin inicial y la posicin
final y opcionalmente si se ha producido un salto para llegar a la
posicin final.

c) Identificar el conjunto de candidatos posibles y descripcin del criterio de seleccin de candidatos


(0.75 puntos)
Tenemos varias opciones a la hora de generar todos los posibles
candidatos y/o movimientos: considerar candidatas todas las
posiciones del tablero o todas las fichas (posiciones no vacas) o
las fichas correspondientes al turno actual; considerar candidatos
todos los posibles movimientos o los movimientos en funcin del
turno.
[1]
[2]
[3]
[4]

origen
origen
origen
origen

x,
x,
x,
x,

destino
destino
destino
destino

x+1;
x+2;
x-1;
x-2;

El criterio de seleccin estara implcito en el recorrido del


tablero en el caso de las fichas o en la generacin de los
movimientos. Los candidatos pueden almacenarse en una estructura
tipo vector o similar que permita recorrerlos de forma sencilla.
NOTA: Se podran generar slo los movimientos vlidos, con lo que
no sera necesaria la funcin aceptable.

d) Descripcin de la funcin aceptable y operaciones realizadas para los procesos de anotar y


desanotar (0.75 puntos)

Examen de Algortmica y Complejidad (Plan 2014)

14 de noviembre de 2016

En funcin del tipo de candidatos elegido la funcin aceptable


debera comprobar que la posicin inicial se corresponde a una ficha
del turno actual (en caso de no haber diferenciado los candidatos
por turno), que el destino del movimiento est en el tablero, que
el destino del movimiento es la posicin vaca y en caso de que el
movimiento sea un salto que ste sea vlido.
El proceso anotar se encargara de actualizar el movimiento en el
vector que almacena el estado de resolucin del problema (se libera
la posicin origen del movimiento y se actualiza la posicin
destino) y aadira el movimiento en la lista que lleva la solucin.
El proceso desanotar sera el contrario, se encargara de deshacer
el movimiento en el vector que almacena el estado de resolucin del
problema (se libera la posicin destino del movimiento y se restaura
la posicin origen) y eliminar el movimiento en la lista que lleva
la solucin.
e) Esquema general de la solucin (0.50 puntos)
buscarSolucion(Vector tablero,
Lista solucion, TipoTurno turno, Booleano exito){
ObtenerMovimientos;
hacer {
ElegirMovimiento;
si(MovimientoValido){
AnotarMovimiento
si(EsSolucion){
HayExito a cierto;
} sino {
buscarSolucion(tablero,solucion,
SiguienteTurno(turno), exito);
si(no HayExito){
DesanotarMovimiento;
}
}
}
EliminarAvanzarMovimiento;
} mientras (HayCandidatos && no HayExito);
}