Você está na página 1de 7

UNIVERSIDAD NACIONAL DE SAN AGUSTN

ESCUELA PROFESIONAL DE INGENIERA DE SISTEMAS


CURSO: ANLISIS Y DISEO DE ALGORITMOS
DOCENTE: Dr. Csar A. Beltrn Castan
2012.

Arequipa, Julio de

LISTA DE EJERCICIOS
Pregunta 1. CLRS 2.3-7
Describa un algoritmo con consumo de tiempo O(n lg n) que, dados un
conjunto S de n enteros y otro entero x, determina si existen o no dos
elementos en S cuya suma es exactamente x.
Solucion:
En primer lugar, odenamos los elementos del array usando un algoritmo de
ordenacin como el merge sort el cual se ejecuta en tiempo O(n lg n).
Despus podemos encontrar si dos que existen en S cuya suma es x. Para
cada elemento s[i] en S establecemos y=s[i]-x.
Ahora usamos la busqueda binaria, y averiguamos si el elemento y existe en
S. Si es asi devuelve a[i] y y, si no se encuentra y para cualquier s[i],
entonces devuelve que no existe ningun par de elementos.
Cada busqueda binaria toma tiempo O(lg n) y hay un n elementos a buscar.
Por lo tanto, el tiempo total para este procedimiento es de T(n) = (n lg n)
+(n lg n) donde el primer termino proviene de a ordenacin y el segundo
termino viene de realizar la busqueda binaria para cada uno de los n
elementos. Por lo tanto, el tiempo total de ejecucin es T(n) = (n lg n).
Un procedimiento alternativo para encontrar los dos elemntos de la matriz
ordenada es la siguiente:
SUM-TO-X(A)
1
Merge-Sort(S)
2
i1
3
j length(S)
4
while i = j
5
if S[i] + S[j] == x
6
return S[i], S[j]
7
if S[i] + S[j] < x
8
then i i + 1
9
if S[i] + S[j] > x
10
then j j - 1
Se ha establecido dos contadores en los dos extremos del array. Si su suma
es x, devuelve esos valores. Si la suma es menor a x, necesitamos una
suma grande por lo que incrementamos el contador de la parte inferior. Si la
suma es mayor que x, disminuimos en el contador superior. El bucle hace

(n) iteraciones, ya que en cada iteracin que ya sea aumentar i o disminuir


j para j-i s siempre esta disminuyendo y terminara cuando j-i<0. Sin
embargo, esto aun se ejeuta en el tiempo (n lg n), ya que el tiempo de
ejecucin esta dominado por la ordenacin (merge sort)
void sum(int a[],int n,int S)
{
mergesort(a,0,n-1);
int i=0,j=n-1;
while(i<j)
{
if(a[i]+a[j]>S)
j--;
else if(a[i]+a[j]<S)
i++;
else
{
printf("YES");
break;
}
}
if(i==j)
printf("NO");
}
int bisearch(int a[],int start,int end,int key)
{
int middle=0;
while(start<end)
{
middle=(start+end)/2;
if(key<a[middle])
end=middle-1;
else if(key>a[middle])
start=middle+1;
else
return 1;
}
return 0;
}
void sumbsearch(int a[],int n,int S)
{
mergesort(a,0,n-1);
int i=0,tmp=0;
for(i=0;i<n-1;i++)
{
tmp=S-a[i];
if(bisearch(a,i+1,n-1,tmp)==1)
{
printf("YES");
break;
}
}
if(i==n-1)
printf("NO");

}
Pregunta 2.
Un vector A[1n] se dice tener un elemento mayoritario si ms de la mitad
de sus entradas tienen el mismo valor. Por lo tanto, x es elemento
mayoritario de A si el nmero de ocurrencias de x en A es mayor a n/2. La
tarea es disear un algoritmo que, dado un vector con n entradas,
determine si hay un elemento mayoritario y, si fuese el caso, encontrarlo. El
consumo de tiempo de su algoritmo debe ser O(n lg n). Los elementos del
vector no son necesariamente de algn conjunto ordenado, como los
enteros, y no puede haber comparacin del tipo A[i] > A[j]?. Por tanto,
preguntas del tipo A[i] = A[j]? pueden ser respondidas en tiempo
constante.

Pregunta 3.
Para cada uno de los algoritmos abajo, escriba la recurrencia para el
consumo de tiempo en el peor caso y resulvala usando notacin asinttica.
1. Algoritmo A1 tiene como entrada una matriz n X n. El algoritmo
ejecuta 8 llamadas recursivas para matrices de tamao n/2 X n/2.
El consumo de tiempo del resto del procesamiento es dominado
por una llamada del algoritmo Strassen para multiplicar dos
matrices 3n X 3n. Esencialmente, a cada 8 llamadas recursivas es
hecha una llamada al algoritmo de Strassen. Ud. puede asumir
que n es potencia de 2.
2. Algoritmo A2 tiene como entrada una secuencia de n enteros. Este
algoritmo hace 3 llamadas recursivas, cada una de ellas para
secuencia de n/3 enteros. El consumo de tiempo del resto del
procesamiento es dominado por una llamada del algoritmo
mergesort para ordenar una secuencia de n enteros.
Esencialmente, a cada 3 llamadas recursivas es hecha una
llamada al algoritmo mergesort. Ud. puede asumir que n es
potencia de 3.

Pregunta 4.
Escriba un algoritmo SELECT(A, W, p, r, i) que recibe vectores A[pr] y
W[pr] de nmeros enteros positivos y un nmero entero i tal que
y devuelve el valor del i-simo menor

elemento de la lista formada por W[p] copias de A[p], W[p+1] copias de


A[p+1], . . ., W[r] copias de A[r]. Por ejemplo, para p = 6, r = 8, i = 6,

El algoritmo debe devolver 4 que es el 6 menor elemento de la lista


formada por:
4 4 4 2 2 2 2 2 8 8 8 8.
El consumo de tiempo del algoritmo SELECT debe ser O(n), donde n = r p
+ 1. Explique suscitamente porque su algoritmo est correcto y tiene el
consumo de tiempo pedido.
Pregunta 5. CLRS 16-4
Sea {1, , n} un conjunto de tareas. Cada tarea consume un da de
trabajo; durante un da de trabajo solamente una de las tareas puede ser
ejecutada. Los das de trabajo son numerados de 1 a n. A cada tarea t est
asociado un plazo p[t]: idealmente, la tarea t debe ser ejecutada en algn
da del intervalo 1 .. p[t]. A cada tarea t est asociada una multa no
negativa m[t]. Si una tarea dada t es ejecutada despus del plazo p[t], la
multa m[t] deber ser pagada (pero la multa no depende del nmero de
das de atraso). Un escalonamiento de tareas es un vector e tal que e[d] =
t si la tarea t debe ser ejecutada en el da d.
Escriba un algoritmo MIN-MULTA(p, m, n) que recibe un vector de plazos p[1
n] y un vector de multas m[1n] y devuelve el menor valor de la multa
de un escalonamiento. El consumo de tiempo de su algoritmo debe ser
O(n2).
Pregunta 6. CLRS 34-2
Bonnie y Clyde acabaron de robar un banco. Ellos tienen un saco de dinero
que necesita ser dividido. Para cada una de las posibilidades abajo, describa
un algoritmo polinomial o muestre que el problema es NP-Completo. La
entrada es siempre una lista de n tems, junto con el valor de cada tem. Use
que el problema de la Particin es NP-difcil: dado un conjunto de enteros
positivos X, decidir si existe un subconjunto de X cuya suma es la mitad de
la suma de los elementos de X.
1. El saco contiene n monedas, pero solamente 2 posibles valores:
algunas valen x reales y otras valen y reales. Ellos desean dividir
el dinero en partes iguales.
2. El saco contiene n cheques que, por una coincidencia espantosa,
estn nominales a Bonnie o Clyde. Ellos desean dividir el dinero
en partes iguales.
3. El saco contiene n cheques, como en el tem anterior, pero esta
vez ellos aceptan una diferencia de 100 soles en los totales que
cada uno recibe.
Solucion:

(A)Supongamos que hay m monedas de un valor de x soles, n-m monedas


por el valor de y soles.
Entonces el importe total es m*x+(n-m)*y soles, sealados como S. Por lo
tanto cada uno de ellos quiere tomar S/2 soles.
Tenga en cuenta que Bonnie se puede tomar 0 monedas de un valor de x
soles o 1 moneda de un vamor de x soles, o dos monedas de x soles., o en
la mayoria de las m monedas por un valor de x soles. Dado que solo hay
dos, solo se puede comprobar despus de que Bonnie tome manedas por un
valor de x soles, si las monedas por un valor de y.
Por ejemplo, si bonnie no toma las monedas por un valor de x soles.
Comprobamos si S/2 mod y , y si (S/2-x)/y <= (n-m). Hay a lo sumo m+1
posibilidad de comprobar, porque Bonnie puede tomar la mayoria de las
monedas m.
En cada posibilidad, un numero constante de operaciones se necesita, por lo
tanto este es un algoritmo polinomial
(B) Ordenar todas las monedas en orden decreciente. Dar a Bonnie la
moneda ms grande, a continuacin, dar monedas de Clyde hasta que
tenga la misma cantidad como Bonnie. Esto siempre va a pasar si el resto
del dinero es menor que su diferencia, ya que las denominaciones de las
monedas son de "2".Cuando tienen la misma cantidad, Bonnie le da la
moneda ms grande del resto de las monedas, se repite el proceso anterior
hasta que todas las monedas se han ido. Si despus de dar a Bonnie una
moneda C, la suma de las monedas restantes es inferior a C. Entonces no
podemos encontrar una divisin uniforme. De lo contrario, podemos hacerlo.
(C) NP-Completo Este problema es realmente un problema de particin. En
primer lugar, dado una divisin, sumando los controles propuestos a Bonnie
para ver si la suma es "S / 2" verifica la solucin. ("S" es la suma de la
cantidad de todos los cheques)Entonces, reducimos subconjunto de Suma
problema a este problema. Supongamos que en el problema de
subconjuntos de suma, se nos da un conjunto de nmeros, denominado P.
Sea "S" ser la suma de todos los nmeros en P, y T es el nmero de
destino. Forman el conjunto, P tiene un subconjunto que suman t, si y slo si
P 'puede ser "' {'2 PPS t = - }" dividida en dos sets con suma igual. La
reduccin es obviamente polinomio. Como subconjunto de Suma problema
es la APN, por lo que nuestro problema es tambin la APN.
(D) NP-Completo En primer lugar, teniendo en cuenta una divisin, u slo
comprobar si la suma de los controles dado a Bonnie y Clyde tienen una
diferencia de menos de 100. Polinomio tiempos verificables. Entonces
reducir el problema de CNP (c) que se sabe que este problema. Sin prdida
de generalidad, suponemos que la unidad bsica de que el dinero de los
cheques es de 1 dlar. El problema en (c) es la siguiente: dado un conjunto
de controles de {}, decidir si pueden ser divididos en partes iguales. Luego
se construye el conjunto de controles en el problema (d) como {c1 * 1000, *
1000 c2, ...}.El conjunto original de los cheques pueden ser divididos en

partes iguales si y slo si estos controles se multiplicaron puede ser dividido


exactamente por lo que permite una diferencia no mayor que 100. La
transformacin es al parecer, tiempo polinomial.

Pregunta 7. CLRS 8-5


Suponga que, en vez de ordenar un vector, necesitamos apenas que los
elementos crezcan en media. Ms precisamente, un vector A[1 n] con n
elementos se dice estar k-ordenado si, para cada i = 1, 2, . . ., n k, lo
siguiente vale:

a. Qu quiere decir que un vector es 1-ordenado?


b. Muestre una permutacin de los nmeros 1, 2, . . ., 10 que est 2ordenado, pero no ordenado.
c. Muestre que A est k-ordenado si y solamente si A[i] A[i + k]
para cada i = 1, 2, . . ., n-k.
d. Describa un algoritmo con consumo de tiempo O(n lg (n/k)) que kordene un vector con n elementos.
e. Muestre que un vector k-ordenado puede ser ordenado en tiempo
O(n lg k).
f. Muestre que cuando k es constante, el consumo de tiempo para kordenar un vector es (n lg n) en el peor caso.
a. Sorted
b. Simple
c. Simple.
d. Divida la matriz en k grupos, cada uno con una longitud de n / k.
Clasificar los k grupos por separado. Construimos un array de destino
eligiendo uno de los elementos por turnos de los grupos k. La
clasificacin de grupos k toma un tiempo O (kn / lg n k / k) = O (n log
n / k).
e. Construimos subarreglos k mediante la extraccin de i, i k, i 2 k, ...
a partir del array k-ordenados. Ahora tenemos k arrays ordenados con
una longitud de n / k. Podemos utilizar un metodo para ordenar todos
los elementos en O (n lg k) del tiempo.
f. Ms tarde.
Pregunta 8. CLRS 22.4-2
Sea G = (V, A) un grafo orientado acclico con pesos positivos en las aristas
dados por w:AR.
El problema del conteo de caminos es el siguiente: dados dos vrtices u y v
en V, encontrar el nmero de caminos del largo mnimo que conectan u a v.

Por ejemplo, en el grafo abajo existen 6 caminos de u a v, dentro de los


cuales solamente 2 son caminos mnimos.
a. Describa un algoritmo eficiente para el problema de conteo de
caminos. Analice su complejidad.
b. Describa un algoritmo eficiente para el problema conteo de
caminos mnimos. Analice su complejidad.

Você também pode gostar