Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Módulo 3 - Recursión y Algoritmos de Ordenación-2
Módulo 3 - Recursión y Algoritmos de Ordenación-2
Recursin y
Algoritmos de
Ordenacin.
3.1- Introduccin.
La recursividad es uno de los conceptos ms importantes en programacin.
RECURSIVIDAD La recursividad nos permite trabajar donde las estructuras del tipo
iterativas vistas en el mdulo 1 no son de fcil aplicacin. Esto nos indica
Es una capacidad que que no hay problemas intrnsecamente recursivos o iterativos; cualquier
permite que un sub- proceso puede expresarse de una u otra forma.
programa se llame a s
mismo y dentro de su Si bien la recursividad, como veremos, da lugar a algoritmos ms fciles de
propio cdigo. seguir y entender, debemos tener en cuenta que consume ms recursos y
es ms lenta que una solucin iterativa.
Para desarrollar algoritmos recursivos hay que partir del supuesto de que
ya existe un algoritmo que resuelve una versin ms sencilla del problema.
3. Probar de manera informal que tanto los casos base como los generales
pueden solucionarse con el algoritmo desarrollado.
ALGORITMO recursin
Inicio
Recursin()
..
fin
1
1- Averiguar el factorial de un nmero dado.
devolver fact
FIN
ALGORITMO N Fib(E N n)
VAR
N fb
INICIO
si(n <= 2)
Entonces fb = 1
sino fb = Fib(n-1) + Fib(n-2)
finsi
devolver fb
FIN
SUGERENCIA
Debemos usar la recursividad en aquellos problemas
en los cuales no podemos aplicar una solucin
iterativa sencilla.
2
3.2-Demostraciones
por induccin.
Hablaremos ahora sobre el concepto de induccin desde el punto de vista
matemtico.
1+2+3+ +n = n(n+1)
2
Sea P(n) : el predicado 1+2+3+ +n = n(n+1)
2
3
para n > 1
4
Un objeto recursivo es el que aparece en la definicin de s mismo, as
como el que se llama a s mismo.
En toda definicin Los rboles (vistos en el mdulo 2) son las estructuras de datos, no lineales
recursiva se deben y dinmicas, ms eficientes que existen en Computacin. La caracterstica
establecer 2 pasos: de los rboles es que son estructuras inherentemente recursivas. En otras
palabras cualquier actividad de programacin que se realice con rboles se
PASO BSICO utiliza recursividad.
PASO RECURSIVO Como vimos, la recursin puede presentarse de 2 maneras:
El paso bsico
El paso recursivo.
En cada vuelta del ciclo es importante que nos acerquemos cada vez ms a
la solucin del problema en cuestin, es decir, al paso bsico. Si esto no
ocurre podemos estar en un ciclo extrao.
5
Una por el caso recursivo
Se debe probar primero el caso base, porque si ste tiene errores (lgicos)
es posible que la funcin se quede haciendo un ciclo infinito.
3.4- Aplicaciones
numricas.
Antes de ingresar en este tema me parece necesario hablar un poco sobre
la Teora de Nmeros.
Este texto cifrado, por medio del canal de comunicacin establecido, llega
al descifrador que convierte el texto cifrado, apoyndose en otra clave,
para obtener el texto en claro original.
Aritmtica Modular
Exponenciacin Modular
RSA
3.5- Aritmtica
Modular.
La Aritmtica Modular es una de las aplicaciones ms importantes de la
teora de nmeros.
7
La Aritmtica Modular tambin define un sistema de numeracin.
Resta: La resta es slo la suma con valores negativos por los que (x
y)
mod m = (x mod m y mod m) mod m.
Veamos un ejemplo
6 2 mod 3 = 6 1 mod 3 = 0
8
El ejemplo que se presenta es extractado de [MAR03].
23 mod 10 = 8
26 mod 10 = (8 8) mod 10 = 4
212 mod 10 = (4 4) mod 10 = 6
224 mod 10 = (6 6) mod 10 = 6
248 mod 10 = (6 6) mod 10 = 6
296 mod 10 = (6 6) mod 10 = 6
2100 mod 10 = 296 23 21 mod 10 = 6 8 2 mod 10 = 6
Se escribe:
a = b mod m
3.6- Exponenciacin
modular.
La Exponenciacin Modular es un operador de amplio uso en tcnicas
criptogrficas tales como:
RSA
Rabin
Elgamal
McEliece
9
La Exponenciacin Modular recibe tres operandos de entrada:
P = XY mod M
XY = kM + P
Base= a
Exponente= n
Mdulo = m
10
0<= a < m, m>=2, n>=0
exp= 1
x = a mod m
Mientras (n>0) hacer
Si (n es impar)
Entonces exp = (exp * x) mod m
Fin si
x = (x * x) mod m
n=n/2
Fin mientras
Retorna(exp)
Fin funcin
11
El problema inicial es el siguiente:
Para calcular el mximo comn divisor entre dos nmeros enteros positivos
a y b dividimos el ms grande, digamos a entre el ms pequeo, digamos b.
Si r2 = 0, entonces mcd(a.b) = r1 .
Y as sucesivamente.
Veamos ahora cmo podemos demostrar este hecho y despus poder ver
un algoritmo con un ejemplo:
Teorema:
Demostracin:
12
Vamos a demostrar que d = t.
de donde llegamos a
13
175 = 98 . 1 + 77
98 = 77 . 1 + 21
77 = 21 . 3 + 14
21 = 14 . 1 + 7*
14 = 7 . 2 + 0
Como marca el *, se tiene que mcd(721, 448) = 7, el ltimo divisor que no
es nulo.
! Clculo de mcd(25134,19185)
Vemos que aunque los nmeros son bastante mayores que los anteriores
el nmero de operaciones necesarias para el clculo es el mismo.
Algoritmo Euclides
Entrada a y b
Salida mcd(a y b)
R0 = a
R1 = b
I=1
Mientras (Ri = 0) hacer
R i + 1 = R i 1 mod Ri
I=i+1
Fin Mientras
Mcd = R i 1
14
El multiplicador modular inverso de un entero n mdulo p es un entero m
tal que:
n-1 m (mod p)
mn 1 (mod p)
Es decir:
15
En las Matemticas Constructivas, para que un nmero real x tenga
inverso, no es suficiente que sea falso que x = 0. Adems, debe existir
un nmero racional r tal que 0 < r < |x|.
3.8- RSA.
El algoritmo RSA se asocia a los conceptos criptogrficos que mencionamos
en el punto 3.4 Aplicaciones numricas.
Debemos aclarar que este concepto y sus caractersticas son aun anteriores
a la utilizacin de elementos informticos.
Uno de los nombres que identificamos con esta rama de la ciencia es Alan
Turing y sus logros para descifrar los cdigos durante la Segunda Guerra
Mundial.
1.1. Cada usuario i del sistema elige una pareja de nmeros primos pi, qi
1.2. Calcula ni = piqi y la funcin de Euler de ni, (ni) = (pi 1)(qi 1).
16
1.3. Elige arbitrariamente ei, 0 < ei < (ni), tal que mcd(ei, (ni)) = 1 y
calcula su inverso modular di = ei1 mod (ni).
1.4. Toma como clave pblica (ni, ei) y como su clave privada di.
Cifrado:
Un mensaje M, 0 < M < ni se cifra mediante:
Z/niZ" Z/niZ
M " Mei = C mod ni
Descifrado:
Un mensaje cifrado C, 0 < C < ni se descifra mediante:
Z/niZ" Z/niZ
C "Cdi = C mod ni
17
3.9- Algoritmos divide y
vencers.
Veremos los conceptos de unos algoritmos conocidos como Divide y
Vencers, los cuales pueden considerarse como una filosofa para resolver
problemas.
18
3. Por ltimo, combinar las soluciones obtenidas en el paso anterior para
construir la solucin del problema original.
Las diferencias surgen de los distintos valores que pueden tomar a y b, que
en definitiva determinan el nmero de subproblemas y su tamao.
19
Lo importante es observar que en todos los casos la complejidad es de
orden polinmico o polilogartmico pero nunca exponencial, frente a los
algoritmos recursivos que pueden alcanzar esta complejidad en muchos
casos.
3.10 Programacin
dinmica.
Hemos vistos que muchos algoritmos tienen una resolucin recursiva, casi
natural, pero tambin vemos cmo el tiempo de ejecucin de los mismos
es del orden exponencial y por lo tanto inaplicable, y una manera de
resolver este problema es justamente con la aplicacin de Programacin
Dinmica.
20
Para que un problema pueda ser abordado por esta tcnica ha de cumplir
dos condiciones:
21
Dinmica es que en el primero siempre se generaba slo una sucesin de
decisiones, mientras que en Programacin Dinmica pueden generarse
muchas sucesiones de decisiones. Sin embargo las sucesiones que
contengan subsucesiones suboptimales no pueden ser optimales (si se
verifica el Principio de Optimalidad), y por tanto no se generarn.
Inicio
Si (n>1)
Entonces retorna = 1
SiNo x= 1
y= 1
para(i=2 hasta n) hacer
suma=x + y
22
y= x
x= suma
fin para
fin Si
fin proc
Planificacin de tareas
Gestin de recursos
Gestin de stock
3.11- Algoritmos de
vuelta atrs.
El retroceso o vuelta atrs es una tcnica de resolucin de problemas que
realiza una bsqueda exhaustiva, sistemtica y organizada sobre el espacio
de bsqueda del problema, aplicable a problemas de optimizacin, juegos,
bsquedas entre otros.
23
comporta como un rbol, que no contiene ciclos, es decir, es imposible
llegar a una misma solucin partiendo de dos subtareas distintas.
Este tipo de estrategias tienen una premisa fundamental que afirma que si
un problema tiene solucin, ste la encuentra.
24
recalcularlos, mientras que en vuelta atrs no podemos hacer esto, ya que
el nmero de casos es muy elevado.
Adems de esto tenemos que identificar los tipos de nodos con los que se
va a trabajar:
v(n).
25
El coste en general ser: O(p(n)v(n)), este coste ser exponencial en
el peor caso.
Para conseguir mejoras en los costes se suele recurrir a marcar los caminos
ya recorridos que no llegan a ninguna solucin como nodo fracaso o
camino fracaso.
4.1- Introduccin.
Para conseguir mayor eficiencia en el tratamiento de la informacin, tanto
en el mbito de almacenamiento interno (arrays) como externo (archivos),
la informacin debe tener algn tipo de ordenamiento.
26
Ordenamiento o clasificacin es la operacin que permite organizar un
conjunto de datos en un orden determinado:
27
Algoritmo INSERCION
28
2) Repetir el primer paso, pero con una ordenacin menos, es decir,
terminar al comparar A n-2 con A n-1 y obtendremos el segundo elemento
mayor en A n-1.
PASO I:
1) 20 80 10 30
2) 20 10 80 30
3) 20 10 30 80
PASO II:
1) 10 20 30 80
2) 10 20 30 80
PASO III:
1) 10 20 30 80
MTODO 1
El algoritmo menos eficiente sera aquel que por cada paso realizase N-1
comparaciones, es decir, que no tuviese en cuenta que en cada paso ya
queda colocado en su posicin un elemento.
EJERCICIO
Algoritmo BURBUJA_1
Inicio
desde (I=1 hasta (N-1)) hacer
desde (J=1 hasta (N-1)) hacer
Si (X(j) > X(j+1))
entonces
AUX # X(j)
X(j) #X(j+1)
29
X(j+1)# AUX
fin_si
fin_desde
fin_desde
fin
MTODO 2
Podemos introducir una mejora del mtodo anterior teniendo en cuenta al
hecho de que ya queda colocado un elemento en su posicin correcta.
EJERCICIO
Algoritmo BURBUJA_2
inicio
desde (I=1 hasta(N-I)) hacer
desde (J=1 hasta (N-I)) hacer
Si (X(j) > X(j+1))
entonces
AUX #X(j)
X(j) #X(j+1)
X(j+1)#AUX
fin_si
fin_desde
fin_desde
fin
(N-I)=(N-I)+(N-2)+...+2+1=N(N-1)/2
MTODO 3
Finalmente, la ltima mejora la podemos introducir teniendo en cuenta
que despus de un paso anterior al ltimo puede que ya tengamos el array
ordenado, es decir, que puede que no siempre sea necesario llegar al paso
N-1. Para aprovechar esta ventaja utilizamos la variable MARCA que nos
indicar cuando tras la ejecucin de un paso no se ha producido ningn
intercambio lo que indicar que el array est ordenado.
EJERCICIO
Algoritmo BURBUJA_3
inicio
30
MARCA <-- FALSO
I #1
mientras ((MARCA=FALSO) y (I< N-1)) hacer
MARCA <--- VERDADERO
desde (J=1 hasta (N-1)) hacer
Si (X(j) > X(j+1))
entonces AUX #X(j)
X(j) #X(j+1)
X(j+1) # AUX
MARCA # FALSO
fin_si
fin_desde
I # I+1
fin_mientras
fin
4.3- Shellsort
Fue inventado por Donald Shell y es una mejora al mtodo de insercin.
Mientras que en el de insercin por cada elemento siempre comparo con
todos los anteriores a la izquierda, ahora se trata de ahorrar tiempo y en
vez de comparar de uno en uno, slo se compara con algunos de la
izquierda.
EJERCICIO
Ordenamiento
Algoritmo SHELL
Shellsort
inicio
Mejora su eficiencia si
mientras ((SALTO > 0)) hacer
los nmeros de pasos
desde (I=SALTO+1 hasta N) hacer
son impares
J #J-SALTO
mientras ((J > 0)) hacer
K #J-SALTO
si (L(J) < L(K))
entonces
J#0
sino
31
AUX # L(J)
L(J) #L(K)
L(K) #AUX
fin_si
J #J-SALTO
fin_mientras
fin_desde
SALTO #SALTO div 2
fin_mientras
fin
Si consideramos por ejemplo como arreglo t-ordenado aquel en el cual los
elementos que se encuentran a distancia t, dentro del arreglo, estn
ordenados, se puede demostrar que si un arreglo h-ordenado es
transformado a k-ordenado (con k<h), se mantiene h-ordenado.
32
Adems, el estudio demuestra empricamente que algunas series
dependientes del tamao del arreglo reducen el tiempo de ejecucin del
algoritmo con respecto a las series clsicas.
hi = h i+1 / 2.4
Partiendo de:
ht = n / 4.8
Terminando cuando:
h1 = 1
hi = 2 i-1 (h es potencia de 2)
O (n2)
33
Dado que todos los incrementos son pares exceptuando el ltimo, cuando
se ha llegado a la ltima iteracin, con el nico incremento impar igual a 1,
continan estando todos los elementos mayores en las celdas pares y los
menores en las celdas impares.
hi = h i+1 / 2.4 partiendo con :ht = 64700 / 4.8 dan nmeros pares.
4.4- Mergesort.
Este clase de algoritmo es un tpico uso del concepto divide y vencers.
Fue desarrollado por John Van Neumann en 1945.
34
T(n) = 1 SI n = 1
T(n) = 2T(n/2)+
4.5- Quicksort.
Es el mtodo de ordenacin ms rpido.
PASOS
EJERCICIO
Procedimiento QUICKSORT(Li,Ls:entero;L:array[1..N])
var PIVOTE:entero
inicio
si (Li < Ls)
entonces SUBLISTAS (Li,Ls,PIVOTE,L:array)
QUICKSORT (Li,PIVOTE-1,L:array)
QUICKSORT (PIVOTE+1,Ls,L:array)
35
fin_si
fin_quicksort
Algoritmo PRIN_QUICKSORT
var a:array [1..N]
inicio
leer A
QUICKSORT(1,N,A)
escribir A
fin
Resumiendo
Como vimos el proceso de Quicksort consiste en dividir la lista original en
Caractersticas dos listas ms pequeas.
QUICKSORT
Vimos que debemos elegir un elemento cualquiera (aunque en general se
Ordena una lista de suele utilizar el que se encuentra en medio de la lista) que llamamos Uno
1.024 elementos en 10 de los puntos clave es la eleccin del pivote, dado que una mala eleccin
pasadas puede atentar contra la eficiencia del mtodo.
Otra de 1.000.000 de Luego recorremos toda la lista, con el objeto de colocar los elementos ms
elementos en 20 pequeos que el pivote a la izquierda del mismo, y los mayores a la
pasadas derecha.
36
Una forma de hacer aun ms eficiente esta tarea, es lograr recorrer
simultneamente le lista en ambas direcciones e intercalando entre si cada
par de elementos que se encuentran a cada lado.
Complejidad
Cada algoritmo de ordenamiento que hemos visto ahora tiene, por
definicin, operaciones y clculos mnimos y mximos que realiza por lo
que podemos estimar una complejidad en cada uno de ellos, que
corresponde a cada mtodo de ordenamiento:
37
4.6- Seleccin Rpida.
Una caracterstica especial es la SELECCIN, la cual tiene una complejidad
tal vez menor que el ordenamiento. Esto es debido principalmente a que
debemos encontrar un elemento dentro de un arreglo y no tenemos la
complejidad del ordenar al resto.
38
buscadores especficos que lo usan, pero debemos entender que cada uno
de ellos utiliza a estos algoritmos como piezas principales para su trabajo.
Tanto los conceptos internos a la propia pgina web como los externos son
importantes, algunos de los conceptos incluso no se valoran directamente,
sino que permiten que la pgina consiga una mejor valoracin para otras.
Hay que saber qu es lo que se pretende con una pgina antes de definir
qu estrategia o combinacin de estrategias se aplicar.
39
Criterios externos a la pgina web:
Por este motivo, si hay muchas pginas que enlazan una pgina, los
buscadores interpretan que cada pgina web emite su voto para aquella a
la que va destinado el enlace, dndole ms y ms preferencia.
Pagerank-1. Total links entrantes (links desde otros webs) Cuentan todos
los enlaces.
40
Pagerank-2. Links entrantes de webs con PR4 o mayores. Links entrantes
de webs con PR4 o mayores. Cuantos mayores es el PR de la web que nos
enlaza, mejor.
Su lgica es la siguiente:
Si una pgina web enlaza con otra pgina, es que la est recomendando.
41
PageRank negativo3. Links desde servidores problemticos (porno,
penalizados, etc.) Problemtico en principio.
42
Webrank-8. Los cambios y actualizaciones en este buscador son ms lentos
que en PageRank.
A las pginas web que los humanos han determinado como importantes se
las considera "web semilla" y a sus enlaces se les asigna un valor. Ser ese
valor el que se ir transmitiendo por toda la red.
A trasmitir un valor de 100 Trust Rank a todas las webs a las que enlace.
43
Bibliografa Bsica
Weiss, M.A. (2000). Estructura de Datos en Java. Adisson Weasley.
Bibliografa Ampliatoria
Lage Fernando. Fundamentos de algoritmo y programacin. Nueva Librera.
www.uesiglo21.edu.ar
44