Está en la página 1de 15

Tema-2-Ejercicios-de-clase-resue...

ainoapal

Estructuras de Datos y Algoritmos

2º Grado en Ingeniería Informática

Escuela Técnica Superior de Ingeniería Informática


Universidad Politécnica de Valencia

Reservados todos los derechos.


No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
icios de claase
2 – Divide y Venceerá s

io 1
método recurrsivo que perrmita compaarar dos arrays genéricos y analiza su coste:

atic <T> bo
oolean comp
parar(T a[ ], T b[]) { … }

n: dos arrays se considera


an iguales si tienen los mismos
m eleme
entos dispueestos en el mismo
m orden.

CIÓN:

atic <T> bo
oolean comp
parar(T a[ ], T b[]) {
ength != b.
.length) re
eturn falsee;
comparar(a,
, b, 0);

tatic <T> boolean


b mparar(T a [], T b[], int izq) {
com
< a.length
h) {
a[izq].equa
als(b[izq])
)) return ffalse;
n comparar(
(a, b, izq + 1);
return true
e;

coste:

= a.length – izq (a.length en la llam


mada más allta)

ancias signifficativas:
Mejor caso: el primer ele emento de a es distinto del primer elemento de b
Peor caso: loos arrays a y b son igualees (tienen loss mismos ele
ementos en eel mismo ord
den)

nes de recurrencia:
rarM(N) = k1
rarP(N = 0) = k2
rarP(N > 0) = TcompararP(N‐1) + k3

sintótico:
rar(N)  (1
1)
rar(N)  O(N
N) , apliicando el Teoorema 1 con
n a=c=1

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejerciciio 2
Dado el siguiente métod
do:

// v orden
nado ascend
dentemente sin eleme ntos repet
tidos, x < y

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
public sta an buscaPar
atic boolea r(Integer[ ] v, Integ
ger x, Inte
eger y, intt izq, int der) {
if (izq >= der) re
eturn false
e;
ad = (izq + der) / 2;
int mita ;
int comp
p = v[mitad
d].compareT
To(x);
if (comp
p == 0) ret
turn v[mita
ad+1].compaareTo(y) ==
= 0;
if (comp
p < 0) retu
urn buscaPa
ar(v, x, y , mitad+1, der);
return b
buscaPar(v,
, x, y, izq
q, mitad);
}

a) Describir qué problem


ma resuelve buscaPar,
b deetallando el significado
s de
e cada uno dde sus parám
metros.

b) Calcular laa complejidaad temporal del método buscaPar.

SOLUCCIÓN:

a) El métodoo buscaPar reealiza una bú


úsqueda sobbre el vector v para comp
probar si el ppar de Intege
er x e y ocupaa
o no posiciones consecuutivas dentro del vector.

 Los paráámetros izq y der marcann el intervaloo de búsqued


da.
 El métoddo devuelve true si x e y son contiguuos en v[izq..der] y false en caso conttrario: no se
e encuentra x
o están pero no son contiguos.

b) Complejid
dad temporaal:

 Tallaa: N = der – izq


i +1

 Caso e la mitad ddel primer intervalo de búsqueda e y está a continuación


o mejor: x see encuentra en

TbuscarParM(N) = k1  TbuscarPar(N)  (1)

 Caso
o peor: x no se encuentra
a en el vectoor

TbuscarParP(N≤1) = k2

TbuscarParP(N>1) = TbusccarParP(N / 2) + k3  TbuscarrPar(N)  O(lo


og2N)

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver a clase no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Estructuras de Datos y Algor...
Banco de apuntes de la
Ejerciciio 3
Diseña un m
método recurrsivo genérico que determ
mine si un arrray dado es capicúa:

atic <T> bo
public sta oolean esCa
apicua(T[] v) { … }

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Indica qué tiipo de métod
do recursivo es y analiza su coste.

SOLUCCIÓN:

atic <T> bo
public sta oolean esCa
apicua(T[] v) {
return e
esCapicua(v
v, 0, v.len
ngth – 1);
}

tatic <T> boolean


private st b Capicua(T[ ] v, int ini,
esC i int fi
in) {
if (ini < fin) {
if (!v
v[ini].equa
als(v[fin])
) return faalse;
n esCapicua
return a(v, ini + 1, fin – 1);
} else r
return true
e;
}

El método reecursivo es liineal final.

 Talla: N = fin – ini + 1 (v.len


ngth en la llaamada más alta)
a

 Hay instancias signifficativas:


o Mejor caso: el primer ele emento de v y el último son distintoss
o Pero caso: v es capicúa

 nes de recurrencia:
Ecuacion
TesCapiccuaM(N) = k1
TesCapiccuaP(N ≤ 1) = k2
TesCapiccuaP(N > 1) = TesCapicua
aP(N‐2) + k3

 Coste assintótico:
TesCapiccua (N)  ((1)
TesCapiccua (N)  O(N) , apliicando el Teoorema 1 con
n a=1 y c=2

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver de fiesta no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Ejerciciio 4
Diseña una ffunción recursiva que de
evuelva el mááximo de un array genérico y analiza su coste.

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
SOLUCCIÓN:

atic <T ext


public sta tends Compa
arable<T>> T maximo(T v[]) {
return m
maximo(v, 0);
0
}

tatic <T ex
private st parable<T> > T maximo
xtends Comp o(T v[], in
nt inicio) {
if (inic
cio == v.le
ength) retu
urn null;
else {
T max = maximo(v
v, inicio + 1);
if (ma
ax == null || v[inici
io].compareeTo(max) > 0)
max
x = v[inici
io];
n max;
return
}
}

 Talla: N = v.length – inicio (v.len


ngth en la llaamada más alta)
a

 Hay instancias signifficativas: no hay, se trataa de un recorrrido

 Ecuacion
nes de recurrencia:
Tmaximo(N = 0) = k1
Tmaximo(N > 0) = Tm
maximo(N‐1)) + k2

 Coste assintótico:
Tmaximo (N)  (N) , apliicando el Teoorema 1 con
n a=1 y c=2

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver a clase no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Ejerciciio 5
Dado un array v de componentes Integer, ordennado de form ma creciente y sin elemenntos repetidos, se quieree
determinar si existe alguna compon nente de v qque represen
nte el mismoo valor que eel de su possición en v (yy
obtener dich
ha posición). En el caso de
d que no haaya ninguna, se devolverá
á ‐1.

Indica qué tiipo de métod


do recursivo es y analiza su coste.

SOLUCCIÓN:

atic int ig
public sta gualAPos(In
nteger v[] ) {
return i
igualAPos(v
v, 0, v.len
ngth – 1);
}

tatic int igualAPos(I


private st i Integer v[ ], int ini
i, int fin)
) {
if (ini <= fin) {
int mi
itad = (inii + fin) / 2;
if (v[
[mitad].inttValue() ==
= mitad) reeturn mita
ad;
if (v[
[mitad].inttValue() < mitad) retturn igual
lAPos(v, mi
itad+1, finn);
n igualAPos
return s(v, ini, mitad‐1);
m
return ‐1;
} else r
}

do recursivo lineal final.


Es un métod

 Talla: N = fin – ini + 1 (v.length en la llamadda más alta)

 Instanciaas significativvas:
o Mejor caso: v[(ini+fin)/2] = (ini+fin)/22
o Peor caso: ningún
n ento de v tie ne el mismo valor que la posición quue ocupa
eleme

 Ecuacion nes de recurrencia:


TigualAPosM(N) = k1

TigualAPosP(N<1) = k2
TigualAPosP(N1) = TiguaalAPosP(N / 2) + k3

 Coste assintótico del método:


TigualAPos((N)  (1)
TigualAPos((N)  O(log2N)
N , Teorem
ma 3 con a = 1 y c = 2

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejerciciio 6
Analiza el co
oste de los siguientes mé
étodos:

tatic int sumar1(int


private st s v[], int ini, int fin)
f {

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
int sum
ma = 0;
if ( in
ni == fin ) suma = v[ini];
if ( in
ni < fin ) {
a = v[ini] + v[fin];
suma
suma
a += sumar1
1(v, ini+1,
, fin‐1);
}
return suma;
}

tatic int sumar2(int


private st s v[], int ini, int fin)
f {
int sum
ma = 0;
if ( in
ni == fin ) suma = v[ini];
if ( in
ni < fin ) {
int m
mitad = (fi
in + ini) / 2;
suma = sumar2(v
v,ini,mitad
d) + sumar 2(v,mitad+
+1,fin);
}
return suma;
}

SOLUCCIÓN:

a) Talla del problema: x = fin – ini + 1

 No h
hay instanciaas significativvas pues hayy que recorre
er todo el vecctor en cualqquier caso
 Ecuaaciones de reecurrencia:
Tsumar1(x  1)) = k
Tsumar1(x > 1)) = 1* Tsumar1(x
( – 2) + k

 Paraa la última eccuación apliccamos el teo rema 1, con a=1 y c=2:


Costte asintótico del método:
Tsumar1(x)  (x)

b) Talla del problema: x = fin – ini + 1

 No h
hay instanciaas significativvas pues hayy que recorre
er todo el vecctor en cualqquier caso
 Ecuaaciones de reecurrencia:
Tsumar2(x  1)) = k
Tsumar2(x > 1)) = 2* Tsumar2(x
( / 2) + k

 Paraa la última eccuación apliccamos el teo rema 3, con a=2 y c=2:


Costte asintótico del método:
Tsumar2(x)  (x)

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver a clase no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Ejerciciio 7
Sea v un vecctor de compponentes Integer positivaas que se aju
ustan al perfiil de una curv
rva cóncava, es decir, quee
existe una única posición
n k en el vecttor tal que:

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Los elementos a la izquierda
a de k están oordenados descendentem
mente
• Los elementos a la derecha de
d k están orrdenados asccendentemeente

Ejemplo:

Diseñar el m método recursivo que más eficienttemente de


etermine dicha posición k. Indica la
as instancias
significativass y analiza ell coste del método.

SOLUCCIÓN:
atic int bu
public sta uscarPosK(I
Integer v[ ]) {
return b
buscarPosK( ength ‐ 1) ;
(v, 0, v.le
}

tatic int buscarPosK(


private st b (Integer v [], int in
nicio, int fin) {
cio > fin) return ‐1;
if (inic ;
else {
int resAnt = 1, resSig = 1, mitad o + fin) / 2;
d = (inicio
if (
(mitad > inicio) resAnt = v[miitad‐1].com
mpareTo(v[m
mitad]);
(mitad < fin) resSig
if ( g = v[mitadd+1].compar
reTo(v[mita
ad]);
if (
(resAnt < 0 && resSig > 0) retturn buscar
rPosK(v, in
nicio, mit ad – 1);
e if (resAnt > 0 && resSig < 0
else 0) return buscarPosK
b (v, mitad + 1, fin);
e return mitad;
else
}

Talla del pro


oblema:
 N = ffin – inicio + 1 (En la llamada m
más alta: N = v.length)
v

Instancias significativas:
 Mejo or caso: la poosición k se encuentra
e enn la posición
n (inicio + fin)) / 2.
 Peorr caso: el vecctor v está to otalmente orrdenado. Porr lo tanto, k coincide
c conn uno de los extremos
e deel
vecttor

Ecuaciones d
de recurrenccia:
 Mejo or caso: TbuscarPosKM(N) = k
 Peorr caso: TbuscarPosKP(N=
=0) = k
TbuscarPosKP(N>
>0) = 1 * TbusscarPosKP(N/2) + k

Coste:
 TbusccarPosK(N)  (1)

 TbusccarPosK(N)  O(log2N), apliccando el teo rema 3 con a=1
a y c=2.

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver a clase no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Ejerciciio 8
Realiza una traza compleeta en árbol de las llamaadas recursivvas que gene era quickSortt para el arra
ay v = {8, 12
2,
6, 9, 18, 15, 1}, indicando
o el orden en
n el que se ggeneran y se resuelven.

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
SOLUCCIÓN:

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver de fiesta no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Ejerciciio 9
Realiza una ttraza de merrgeSort para el array {3, 41, 52, 26, 38, 57, 9, 49}}.

SOLUCCIÓN:

mergeSort(vv, 0, 7) 0 1 2 3 4 5 6 7
meergeSort(v, 0,
0 3) 3 41 52 26 38 57
5 9 49
 mergeSSort(v, 0, 1)
  mergeSort((v, 0, 0)
  mergeSort((v, 1, 1) 0 1 2 3 4 5 6 7
  merge(v, 0,, 1, 1) 3 41 52 26 38 57
5 9 49
 mergeSSort(v, 2, 3)
  mergeSort((v, 2, 2)
  mergeSort((v, 3, 3)
0 1 2 3 4 5 6 7
  merge(v, 2,, 3, 3)
3 41 26 52 38 57
7 9 49
 merge((v, 0, 2, 3)
3 26 41 52 38 57
7 9 49
meergeSort(v, 4,
4 7)
 mergeSSort(v, 4, 5)
  mergeSort((v, 4, 4)
  mergeSort((v, 5, 5) 0 1 2 3 4 5 6 7
  merge(v, 4,, 5, 5) 3 41 52 26 38 57
7 9 49
 mergeSSort(v, 6, 7)
  mergeSort((v, 6, 6)
  mergeSort((v, 7, 7) 0 1 2 3 4 5 6 7
  merge(v, 6,, 7, 7) 3 41 26 52 38 57 9 49
 merge((v, 4, 6, 7) 3 26 41 52 9 38 49 57
meerge(v, 0, 4, 7)
7 3 9 26 38 41 49 52 57

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejerciciio 10
Diseña un mmétodo recurrsivo que devuelva el núúmero de ele
ementos igua
ales a uno daado que hayy en un arrayy
ordenado asscendentemeente y con elementos re petidos.
Estudia el co odo diseñado.
oste del méto

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
SOLUCCIÓN:

atic <T ext


public sta tends Compa
arable<T>> int igual
les(T v[], T x) {
return i ength ‐ 1) ;
iguales(v, x, 0, v.le
}

tatic <T ex
private st xtends Comp
parable<T> > int igua
ales(T v[], T x, int ini, int fin)
f {
if (ini > fin) ret
turn 0;
int mita
ad = (ini + fin) / 2;
;
int res = v[mitad]
].compareTo
o(x);
if (res < 0) retur
rn iguales(
(v, x, mitaad + 1, fi
in);
else if (res > 0) return igu
uales(v, x , ini, mit
tad – 1);
turn 1 + ig
else ret guales(v, x,
x ini, mit v, x, mitadd + 1, fin);
tad – 1) + iguales(v
}

Talla del pro


oblema:
 N = ffin – ini + 1 (En
( la llamad
da más alta: N = v.length)

Instancias significativas:
 Mejo or caso: el elemento x no
o está en el vvector.
 Peorr caso: todoss los elementtos del vectoor son iguale
es a x.

Ecuaciones d
de recurrenccia:
 Mejo or caso: TigualesM(N=0)) = k
TigualesM(N>0)) = 1 * TigualesM (N/2) + k
 Peorr caso: TigualesP(N=0) = k
TigualesP(N>0) = 2 * TigualesP (N/2) + k

Coste:
 Tiguales(N)  (log2N), aplican
ndo el teorem
ma 3 con a=11 y c=2.
e teorema 3 con a=2 y c=2.
 Tiguales(N)  O(N)), aplicando el

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver a clase no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE
Ejerciciio 11
Un array se dice que tieene un elemmento mayorritario si máss de la mitad
d de sus eleementos tien
nen el mismoo
valor.
Dado un arrray genérico v, diseñad un
u algoritmoo siguiendo una
u estrategiia Divide y V
Vencerás quee devuelva su
u

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
elemento mayoritario (oo null en caso
o de que v noo tenga elem
mento mayorritario).
Estudia la co
omplejidad teemporal del método rec ursivo diseñado.

SOLUCCIÓN:

atic <E> E elementoMa


public sta ayoritario (E v[]) {
return e
elementoMay v, 0, v.le ngth ‐ 1);
yoritario(v
}

tatic <E> E elementoM


private st Mayoritarioo(E v[], int
i izq, in
nt der) {
if (izq == der) reeturn v[izq
q];
int mita
ad = (izq + der) / 2;;
E mayIzq
q = elementtoMayoritar
rio(v, izq , mitad);
E mayDer
r = elementtoMayoritar
rio(v, mitaad + 1, de
er);
if (mayI
Izq == nulll && mayDer
r == null) return nuull;
if (mayI
Izq != nulll && mayDer
r != null &&& mayIzq.equals(mayyDer)) retuurn mayIzq;
int numM
MayIzq = 0, r = 0, n = (der ‐ iz
, numMayDer zq + 1) / 2;
2
t i = izq; i <= der; i++)
for (int
if (ma
ayIzq != nuull && v[i]
].equals(maayIzq)) nu
umMayIzq++;
if (mayDer != null &&
else i & v[i].equaals(mayDer
r)) numMayDDer++;
if (numM
MayIzq > n)) return ma
ayIzq;
else if (numMayDerr > n) retu
urn mayDer ;
turn null;
else ret
}

Talla del pro


oblema:
 N = der – izq + 1 (En la llamada m
más alta: N = v.length)
v

Instancias significativas:
 Mejo or caso: todoos los elementos de v so n iguales.
 Peorr caso: el eleemento mayo oritario de laa parte izquie
erda siempre
e es distinto al elemento mayoritario
o
de laa parte derecha.

Ecuaciones d
de recurrenccia:
 Mejo or caso: TelementoMayorittarioM(N=1) = k 1
TelementoMayorittarioM(N>1) = 2 * TelementoMayoritarioM(N/2) + k2
 Peorr caso: TelementoMayorittarioP(N=1) = k 1
TelementoMayorittarioP(N>1) = 2 * TelementoMayoritarioP(N/2)) + k3*N + k4

Coste:
 TelemmentoMayoritario(N
N)  (N), aplicando el tteorema 3 co on a=2 y c=2.
N)  O(N logg2N), aplicanndo el teorem
 TelemmentoMayoritario(N ma 4 con a=2
2 y c=2.

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Las descargas sin publicidad se realizan con las coins


Ejerciciio 12
Dado un vector de núm meros entero os (positivoss y negativoss), diseñad un
u algoritmoo Divide y Vencerás
V quee
permita enccontrar la su ubsecuencia de númeross (consecutivvos) cuya su uma sea máxxima. La funnción deberáá
devolver el vvalor de la su
uma de dicha a subsecuen cia.

Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Ejemplos:
 Dado el vector v = {‐2, 3, 4, 4 ‐3, 5, 6, ‐22}, la función
n devolverá 15 ya que laa subsecuen
ncia de sumaa
máxxima es {3, 4,, ‐3, 5, 6}.
 Dado el vector v = {‐2, 11, ‐4, 13, ‐5, 22}, la función n devolverá 20 ya que laa subsecuen
ncia de sumaa
máxxima es {11, ‐4,‐ 13}.
omplejidad teemporal del método rec ursivo diseñado.
Estudia la co

SOLUCCIÓN:

atic int su
public sta ubSumaMax(i
int v[]) {
return s
subSumaMax( ength ‐ 1) ;
(v, 0, v.le
}

tatic int subSumaMax(


private st s (int v[], int izq, int
i der) {
if (izq == der)
if (v[
[izq] > 0) return v[i
izq];
return 0;
else r
int mita
ad = (izq + der) / 2;
;
int suma
aIzqMax = subSumaMax(
s (v, izq, m itad);
int suma
aDerMax = subSumaMax(
s (v, mitad + 1, der);
int suma
aMaxBordeIz maBordeIzq = 0;
zq = 0, sum
for (int
t i = mitad
d; i >= izq
q; i‐‐) {
sumaBo
ordeIzq += v[i] ;
if (su
umaBordeIzq xBordeIzq) sumaMaxBo
q > sumaMax ordeIzq = sumaBordeIz
s zq;
}
int suma
aMaxBordeDe
er = 0, sum
maBordeDer = 0;
for (int
t i = mitad = der; i++ ) {
d + 1; i <=
sumaBo
ordeDer += v[i] ;
if (su
umaBordeDer xBordeDer) sumaMaxBo
r > sumaMax ordeDer = sumaBordeDe
s er;
}
return M
Math.max(Ma
ath.max(sum
maIzqMax, sumaDerMax
x), sumaMax
xBordeIzq + sumaMaxBo
ordeDer);
}

oblema: N = der
Talla del pro d – izq + 1 (En la lla mada más alta: N = v.len
ngth)

Instancias significativas: no hay ni mejor ni peor caso.

Ecuaciones d
de recurrenccia: TsubSumaMaax(N=1) = k1
TsubSumaMax(N>1) = 2 * TsubSumaMax(N/2) + k2*N + k3

Θ  log2N), aplicando
Coste: TsubSuumaMax(N)  Θ(N a el teorema 4 con a=2 y c=2
2.

a64b0469ff35958ef4ab887a898bd50bdfbbe91a-4881650

Volver a clase no es fácil. Por eso BOLT te da un 60% de descuento en tu primer viaje con el código: ATREVETE

También podría gustarte