Está en la página 1de 9

Universidad Nacional de Colombia, Medellı́n – Escuela de Matemáticas – Programación Cientı́fica – 16 mayo 2014

Taller 2/Parcial 2

Entregar soluciones antes del lunes 26 de mayo a las 5pm. Para los ejercicios 8,9,10 (marcados con ?) también
debe implementar el algortimo en pyhton (enviar por correo además de incluir en la solución escrita/impresa).
Para todos debe escribir el algoritmo en pseudocódigo. Justfique y explique sus respuestas. Puede discutir con
compañeros, pero debe escribir su solución independientemente.

1. a) Describa un algoritmo que determine el máximo de n elementos usando n − 1 comparaciones.


b) Describa un algoritmo que determine el máximo y el mı́nimo de n elementos usando no más de 3n/2
comparaciones entre ellos.

2. Dada una lista L, qué regresa la siguiente función ranFun(L) ? Cuál es su tiempo esperado de ejecución
en términos de n=len(L) ? (asuma que M.append toma tiempo constante).

import random
def ranFun (L):
p = random.choice(range(len(L)))
candidato = L[p]
M = []
for i in L:
if i > candidato:
M.append(i)
if M == []:
return candidato
else:
return ranFun (M)

3. Recuerde el algoritmo quicksort discutido en clase:


def partition (A, i, j, p): # it partitions the sublist A[i, ..., j] using A[p]
A[j], A[p] = A[p], A[j] # as pivot, it’s assumed i<=p<=j
k, l= i, j
while k < l:
while (k < l) and (A[k] <= A[j]):
k += 1
while (k < l) and (A[l] >= A[j]):
l -= 1
A[k], A[l] = A[l], A[k]
A[k], A[j] = A[j], A[k]
return k

import random

def quicksort (A, i, j): # it sorts A[i, ...,j]


if j>i:
p = random.randint(i,j)
q = partition (A, i, j, p)
quicksort (A, i, q-1)
quicksort (A, q+1, j)
return

El algoritmo resultante no es estable, es decir, si al comienzo se tienen i < j y A[i] = A[j], entonces es
posible que al final estos mismos objetos estén en posiciones k, l respectivamente con k > l. Estabilidad

1
puede ser importante cuando además de las llaves usadas para el ordenamiento, cada objeto tiene otra
información asociada.

Modifique la función partition de tal manera que el algoritmo de ordenamiento resultante sea estable.
Sólo puede utilizar, si es necesario, una cantidad constante de espacio adicional (en particular no puede
usar otra lista auxiliar).

4. Se tiene una lista con n elementos posiblemente con repeticiones. Describa un algoritmo que determine
el elemento con más repeticiones, ó uno de ellos si hay más de uno. Trate de que sea los más eficiente
posible. Ayuda si los elementos son números enteros en {0, 1, 2, . . . , 4n − 1} ?

5. Un arreglo A[0 : n] se dice unimodal si consiste de un sucesión creciente seguida de una sucesión decre-
ciente. Más precisamente, si existe un ı́ndice m ∈ {0, . . . , n − 1} tal que

? A[i] < A[i + 1] para 0 ≤ i < m, si m > 0, y


? A[i] > A[i + 1] para m ≤ i < n − 1, si m < n − 1.

En particular, se tiene que A[m] es el máximo elemento (y es el único “máximo local”).

a) Dé un algoritmo para determinar el máximo de un arreglo unimodal A[0 : n] en tiempo O(log n).
Justifique que el algoritmo es correcto y que el tiempo de ejecución es O(log n).

Un polı́gono es convexo si todos sus ángulos interiores son menores que 180 grados (y no hay intersecciones
entre aristas). Representamos un polı́gono por medio de un arreglo V[0 : n] donde V[i] es un vértice (xi , yi )
del polı́gono, y estos aparecen en el arreglo en el orden contrario a las manecillas del reloj comenzando
con el vérticeHandout
de coordenada x más
5: Problem Set 1 pequeña, y si hay más de uno, el de coordenada y3 más pequeña entre
estos (en la figura este es el marcado como V[1], y que deberı́a ser V[0]).

b) DescribaFigure
un algoritmo para determinar el vértice con máxima coordenada
1: An example of a convex polygon represented by the array .
x.
is the vertex
c) Describawith
unthealgoritmo
minimum -coordinate,
que, paraand cualquierarevector
ordered(a,
counterclockwise.
b), determina el vértice V[i] = (xi , yi ) tal que
axi + byi es máximo.
d) Describa (b)
un Give
algoritmo que,to para
an algorithm find thecualquier recta
vertex with the `, especificada
maximum coordinate inpor parámetros
time. a y b y la ecuación
determina
ax + by =(c)1,Give si to` find
an algorithm intersecta
the vertex P y the
with en maximum
caso afirmativo
coordinateelinpunto ótime.
los puntos de intersección.

6. a) Para cada una de las funciones en la figura 1, caracterice el tiempo de ejecución en términos de n
usando notación big-O .
b) Para cada una de las funciones en la figura 2, caracterice el tiempo de ejecución en términos de n
usando notación big-O .

7. Suponga que las operaciones de insertar y borrar un elemento en una tabla de dispersión (hash) es
constante, O(1). Para asegurar que la tabla es suficientemente constante, sin desperdiciar mucha memoria,
se siguen las siguentes reglas para reconstrucción:

2
3.5. Exercises 143
1 def example1(S):
2 ”””Return the sum of the elements in sequence S.”””
3 n = len(S)
4 total = 0
5 for j in range(n): # loop from 0 to n-1
6 total += S[j]
7 return total
8
9 def example2(S):
10 ”””Return the sum of the elements with even index in sequence S.”””
11 n = len(S)
12 total = 0
13 for j in range(0, n, 2): # note the increment of 2
14 total += S[j]
15 return total
16
17 def example3(S):
18 ”””Return the sum of the prefix sums of sequence S.”””
19 n = len(S)
20 total = 0
21 for j in range(n): # loop from 0 to n-1
22 for k in range(1+j): # loop from 0 to j
23 total += S[k]
24 return total
25
26 def example4(S):
27 ”””Return the sum of the prefix sums of sequence S.”””
28 n = len(S)
29 prefix = 0
30 total = 0
31 for j in range(n):
32 prefix += S[j]
33 total += prefix
34 return total
35
36 def example5(A, B): # assume that A and B have equal length
37 ”””Return the number of elements in B equal to the sum of prefix sums in A.”””
38 n = len(A)
39 count = 0
40 for i in range(n): # loop from 0 to n-1
41 total = 0
42 for j in range(n): # loop from 0 to n-1
43 for k in range(1+j): # loop from 0 to j
44 total += A[k]
45 if B[i] == total:
46 count += 1
47 return count
Code Fragment 3.10: Some sample algorithms for analysis.
Figura 1: Programas para el ejercicio 6a

3
Figura 2: Programas para el ejercicio 6b

Después de una inserción, si la table está ocupada una fraccı́on mayor que 3/4, entonces se crea una
nueva tabla con el doble del tamaño, se copian todos los datos a la nueva tabla y se “libera” la tabla
anterior.
Después de un borrado, si la tabla está ocupada una fracción menor que 1/4, entonces se crea una
nueva tabla con la mitad del tamaño, se copian todos los datos a la nueva tabla, y se “libera” la
tabla anterior.
Note que a pesar de las operaciones normales toman un tiempo O(1), una operación que lleva a la creación
de una nueva tabla, toma un tiempo O(s) donde s es el tamaño de la nueva tabla. Justifique que, a pesar
de esto, para cualquier secuencia de inserciones y borrados, se puede decir que el costo/tiempo amortizado
por operación es constante, O(1).
8. ? Describa un algoritmo que dado una lista de n intervalos [ai , bi ], i = 0, . . . , n − 1 determina si existen
dos de los intervalos que se intersectan. Trate de hacerlo tan eficiente como sea posible.
Por ejemplo, en [3,8], [12,15], [9,11], [13,16], los intervalos [12,15] y [13,16] se intersectan.
9. ? Describa un algortimo que dada una lista de números encuentra una subsecuencia creciente de máxima
longitud posible. Trate de hacerlo tan eficiente como sea posible.
Por ejemplo, en [5,3,-1,4,2,5,6,-1,8,9,0,13], se tiene la subsecuencia creciente [3,4,5,6,8,9,13].
10. ? Sistema de ecuaciones lineales tridiagonal. Describa un algoritmo para resolver un sistema tridiagonal:
     
b0 c0 0 ··· 0 0 0 x0 d0

 a1 b1 c1 ··· 0 0 0  
  x1  
  d1 


 0 a2 b2 ··· 0 0 0  
  x2  
  d2 

.. .. .. .. .. .. .. .. ..
· =
     

 . . . . . . .   .   . 

 0
 0 0 ··· bn−3 cn−3 0   xn−3
 
  dn−3
 


 0 0 0 ··· an−2 bn−2 cn−2   xn−2   dn−2 
0 0 0 ··· 0 an−1 bn−1 xn−1 dn−1
Sugerencia. Sumando un múltiplo de la primera ecuación a la segunda se elimina la variable x1 . Ahora
sumando un múltiplo de esta ecuación resultante se suma a la tercera para eliminar x2 , y ası́ sucesivamente
se obtienen ecuaciones con dos variables hasta que al llegar a la última se tiene una ecuación con sólo xn−1
que se puede resolver. Ahora reemplazando hacia atrás en las ecuaciones de dos variables sucesivamente
se pueden determinar todas las variables. Qué puede fallar ?

4
Juan camilo garzon upegui

Taller/Parcial 2

1) El algoritmo para hallar el máximo de n elementos haciendo


n-1 comparaciones es el más usual, que consiste en tomar el
primer elemento y compararlo con los demás.
Un algoritmo sería:

1. poblar el vector V de N valores.


2. variable Z tipo entero.
3. variable X tipo entero.
4. inicia ciclo desde X = 0 y Z = 0.
5 Si el valor del índice X del vector es mayor que Z,
entonces Z es igual a ese valor.
6. Sumarle uno a X.
7. Si X es menor a N ir al paso 5. en caso contrario ir al
8
8. Regresar valor de Z como el mayor de V.
9 FIN.

El otro algoritmo, para hallar máximo y mínimo en 3n/2 consiste en


dividir el problema tanto como sea posible basándose en el método
“divide y vencerás” el cual es más eficiente que el anterior

2) devuelve el máximo entero de una lista L, con numero de


comparaciones
(3N/2)-2 con N=2^k
3) def partition(lst, start, end):

pos=0

if len(lst)<2:

return

for i in range(len(lst[start:end])):

if lst[i] < lst[end]:

lst[i],lst[pos]=lst[pos],lst[i]

pos+=1

elif i==(len(lst[start:end])-1):

lst[end],lst[pos]=lst[pos],lst[end]

return pos

def quick_sort_recursive(lst, start, end):

pos=partition(lst, start, end)

if start<=pos<=end :

quick_sort_recursive(lst, start, pos-1)

quick_sort_recursive(lst, pos+1, end)

else:

return lst
4) para L=lista (vector)

Para i de 0 hasta rango L

K=lista()

Para n en rango L

Si L[i]=L[i+n]

Agrego L[i] a K

Sino i=i+1

Hago el mismo proceso con la lista K

El último elemento que quede es el mas repetido

6) para example1: time complexity🡪 O(n) lineal

Para example2: time complexity🡪 O(n)+2 lineal

Para example3: time complexity🡪 O(2n) lineal

Para example4: time complexity🡪 O(n) lineal

Para example5: time complexity🡪 O(4n) lineal

Procedurematmpy: time complexity🡪 O(nlogn) lineal-log

Proceduremystery: time complexity🡪 O(nlogn)+O(1) lineal-log

Procedureveryodd: time complexity🡪 O(nlogn) lineal-log

Functionrecursive: time complexity🡪 O(logn) log

7) el tiempo O(s) es amortizado al final ya que al eliminar las


tablas anteriores se libera espacio utilizando un tiempo de O(1)

Constante, al final la optimización resulta constante si


len(s)<1/4 para el borrado o len(S)>3/4 para el añadido

O(3/4+1/4)=O(4/4)=O(1)
9)

S=lista de elementos

li=longitud de la secuencia creciente mas larga que termina en Si

función:

l0=0

li=maxj<=i-1{lj+1} para los j tales que Sj<=Si-1

solución: máximo li

[cc lang="python"] def LCS(X, Y):

m = len(X)

n = len(Y)

# An (m+1) times (n+1) matrix

C = [[0] * (n+1) for i in range(m+1)] B = [[0] * (n+1) for i in


range(m+1)] for i in range(1, m+1):

for j in range(1, n+1):

if X[i-1] == Y[j-1]:

C[i][j] = C[i-1][j-1] + 1

B[i][j] = u’\u2196′

else:

C[i][j] = max(C[i][j-1], C[i-1][j])

if C[i-1][j] > C[i][j-1]:

B[i][j] = u’\u2191′

else:

B[i][j] = u’\u2190′

return B, C
10) (i = 0, 1, \dots, n-1 donde n es el número de incógnitas).

def TDMASolve(a, b, c, d):

n = len(d)#n in the numbers is rows

# Modify the first-row coefficients

c[0] /= b[0] #Division by zero risk.

d[0] /= b[0]

for i in xrange(1, nmax):

ptemp = b[i] - (a[i] * c[i-1])

c[i] /= ptemp

d[i] = (d[i] - a[i] * d[i-1])/ptemp

#Back Substitution

x = [0 for i in xrange(nmax)]

x[-1] = d[-1]

for i in range(-2,-nmax-1,-1):

x[i] = d[i] - c[i] * x[i+1]

return x

También podría gustarte