Vous êtes sur la page 1sur 45

Mdulo 3

Recursin y
Algoritmos de
Ordenacin.
3.1- Introduccin.
La recursividad es uno de los conceptos ms importantes en programacin.

Es una capacidad que tienen los sub-programas a auto invocarse.

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.

A partir de esta suposicin debe hacerse lo siguiente:

1. Identificar sub-problemas atmicos de resolucin inmediata (casos


base).

2. Descomponer el problema en sub-problemas resolubles, mediante el


algoritmo pre-existente; la solucin de estos sub-problemas debe
aproximarnos a los casos base.

3. Probar de manera informal que tanto los casos base como los generales
pueden solucionarse con el algoritmo desarrollado.

La forma de un algoritmo recursivo es por ejemplo:

ALGORITMO recursin

Inicio

Recursin()

..

fin

Tenemos varias aplicaciones clsicas de recursividad, por ejemplo:

1
1- Averiguar el factorial de un nmero dado.

ALGORITMO N Factorial(E n:N)


VAR
N fact
INICIO
si(n = 0)
entonces fact = 1
sino fact = n*Factorial(n-1)
finsi

devolver fact
FIN

2- Calcular el valor de la funcin de Fibonacci para un nmero N dado:

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

3- Obtener el valor binario de un nmero decimal dado:

ALGORITMO Decabin(E N num)


INICIO
Si(num >= 2)
entonces Decabin(num DIV 2)
Escribir(num MOD 2)
Sino Escribir(num)
finsi
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.

Se trata de una tcnica de demostracin que se utiliza para demostrar


muchos teoremas que afirman que P(n) es verdadera para todos los
enteros positivos n.

La induccin matemtica se usa para demostrar proposiciones de la forma


VnP(n), donde el dominio es el conjunto de los enteros positivos.

Una demostracin por induccin de que P(n) es verdadera para toda n


Z+ consiste en dos pasos:

PASO BASE: Se muestra que la proposicin P(1) es verdadera.

PASO INDUCTIVO: se muestra que la implicacin P(k) P(k + 1) es


verdadera para todo entero positivo k.

La sentencia P(k) para un entero positivo fijo k se denomina la hiptesis de


induccin.

La induccin matemtica expresada como regla de inferencia:

En pocas palabras slo se muestra que si se supone que P(k) es verdadera,


entonces P(k+1) es tambin verdadera.

Veamos un ejemplo de uso:

Demostrar por induccin que la suma de los n primeros enteros positivos


para n > 1 es n(n+1)
2
es decir:

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

PASO BASE: Se muestra que P(1) es verdadera.


Entonces
P(1): 1 = 1(1+1)
2
lo cual es verdadera.

PASO INDUCTIVO: Se debe demostrar que si P(k) es verdadera entonces


P(k +1) para k > 1

Sea P(k) : (hiptesis de induccin)


1+2+3+ +k =k(k +1)
2
Ahora hay que demostrar la verdad de P(k + 1) : (tesis de induccin)
1+2+3+ +(k +1) =(k +1)(k +2)
2
Entonces comienza la demostracin tomando la hiptesis:
1+2+3+ +k = k(k +1)
2
Se suma (k +1) en ambos miembros:
1+2+3+ +k +(k +1) = k(k +1) +(k +1)
2
1+2+3+ +k+(k+1) =k(k +1)+2(k +1)
2
factorizando (k +1) nos queda:
1+2+3+ +k +(k +1) =(k +1)(k +2)
2
Por lo tanto, como se demostr la tesis de induccin, entonces P(n) es
verdadero para todos los valores n > 1.

3.3- 3.3 Recursin


Bsica.
La recursin es un recurso muy poderoso que permite expresar soluciones
simples y naturales a ciertos tipos de problemas.

Es importante recordar que no todos los problemas son recursivos.

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:

Directa: el programa o subprograma se llama directamente a s mismo.

Indirecta: el programa o subprograma llama a otro y ste en algn


momento llama al primero.

En toda definicin recursiva de un problema siempre se deben establecer


dos pasos diferentes y muy importantes:

El paso bsico

El paso recursivo.

El primero, uno o varios, dependiendo del problema, se utiliza como


condicin de parada o fin de la recursividad. A ste llegamos cuando
encontramos la solucin del problema o cuando decidimos que ya no
vamos a seguir, porque no estn dadas las condiciones para hacerlo.

El segundo paso, por otra parte, propicia recursividad.

Se pueden presentar uno o varios, nuevamente dependiendo del problema


a resolver.

Cuando se analiza la solucin recursiva de un problema es importante


determinar con precisin cules sern los pasos bsico y 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.

Puede que el problema se encuentre mal definido y entonces la mquina


se quedara ejecutando por tiempo indefinido el programa y slo
terminara al agotarse la memoria.

Como todas las funciones recursivas tienen la misma estructura, el cuerpo


de la funcin ser un condicional.

Cuntas condiciones debo poner?

Una por cada caso base

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.

En una oportunidad escuch la definicin de un matemtico sobre la Teora


de Nmeros, diciendo que la misma est tan idealizada como la
Matemtica misma en el resto de las ciencias.

En la Teora Elemental de Nmeros, se estudian los nmeros enteros sin


emplear tcnicas procedentes de otros campos de las Matemticas.

Pertenecen a la Teora Elemental de Nmeros las cuestiones de


divisibilidad, el algoritmo de Euclides para calcular el mximo comn
divisor, la factorizacin de los enteros como producto de nmeros primos,
la bsqueda de los nmeros perfectos y las congruencias.

Son enunciados tpicos el pequeo teorema de Fermat y el teorema de


Euler que lo extiende, el teorema chino del resto y la ley de reciprocidad
cuadrtica.

En esta rama se investigan las propiedades de las funciones multiplicativas


como la funcin de Mbius y la funcin de Euler; as como las sucesiones
de nmeros enteros como los factoriales y los nmeros de Fibonacci.

En este trabajo tomaremos la visin de la Teora Computacional de


Nmeros la cual estudia los algoritmos relevantes de la Teora de Nmeros.

Los algoritmos rpidos para evaluar nmeros primos y factorizacin de


enteros tienen importantes aplicaciones en Criptografa.

Como ha dicho Enzo R. Gentile:

La evolucin de la Computacin ha hecho que la


Aritmtica deje de ser una ciencia contemplativa y de
especialistas para ser una rama aplicada.
6
Ahora bien, veamos qu es la CRIPTOGRAFIA.

Etimolgicamente, la palabra Criptologa proviene de las palabras griegas


Kryto y logos y significa estudio de lo oculto.

Una rama de la Criptologa es la Criptografa, que se ocupa del cifrado de


mensajes. sta se basa en que el emisor emite un mensaje en claro, que es
tratado mediante un cifrador con la ayuda de una clave, para crear un
texto cifrado.

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.

Las dos claves implicadas en el proceso de cifrado/descifrado pueden ser o


no iguales dependiendo del sistema de cifrado utilizado.

A fin de poder ver en ms detalle este proceso es que lo divid en los


siguientes problemas que entiende:

Aritmtica Modular

Exponenciacin Modular

Mximo Comn Divisor e Inverso Multiplicativo

RSA

Los cuales veremos a continuacin.

3.5- Aritmtica
Modular.
La Aritmtica Modular es una de las aplicaciones ms importantes de la
teora de nmeros.

Est representada por la funcin mod.

La funcin mdulo representa el resto de la divisin.

Por ejemplo a mod b significa que queremos hallar el resto de a, que


representamos como:

7
La Aritmtica Modular tambin define un sistema de numeracin.

Veamos por ejemplo la secuencia:

0 mod 3, 1 mod 3, 2 mod 3, 3 mod 3, 4 mod 3....

Evaluando tenemos 0, 2, 1, 0, 1... que equivale a la numeracin en base 3.

Para profundizar este tema me parece interesante poder describir algunas


de las propiedades ms importantes de la Aritmtica Modular.

Suma: (x + y) mod m = (x mod m + y mod m) mod m.


Por ejemplo:
(8 + 7) mod 3 = 15 mod 3 = 0
por la propiedad de la suma: (8 mod 3 + 7 mod 3) mod 3

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.

Multiplicacin: La multiplicacin xy mod m = (x mod m)(y mod m)


mod m.
Esto se da debido a que la multiplicacin es simplemente una suma
repetida.

Divisin No existe el inverso de la multiplicacin como la


conocemos por ejemplo veamos dx mod m = dy mod m se puede
pensar que podemos simplificar d obteniendo x mod m = y mod m,
que no se cumplen en todos los casos.

Veamos un ejemplo

6 2 mod 3 = 6 1 mod 3 = 0

Si simplificamos el 6 tenemos 2 mod 3 = 1 = 1 mod 3 = 2.

Slo es posible realizar estas simplificaciones cuando el


mcd(d,m) = 1.

Existen muchas aplicaciones de la Aritmtica Modular, por ejemplo en el


calendario los das de la semana corresponden a una aritmtica mdulo 7,
las horas, minutos y segundos corresponden al mdulo 60.

Hallar el ltimo dgito de un nmero decimal corresponde a una aritmtica


mdulo 10.

8
El ejemplo que se presenta es extractado de [MAR03].

Hallar el ltimo dgito del numero 2100.

Para esto no es necesario hallar el valor del exponente y luego obtener el


ltimo dgito se puede resolver como sigue:

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

Otra propiedad es la congruencia.

Se dice que a es congruente b mdulo m cuando (a b)/m = km.

Se escribe:

a = b mod m

Esto equivale a que a, b son mltiplos de m.

3.6- Exponenciacin
modular.
La Exponenciacin Modular es un operador de amplio uso en tcnicas
criptogrficas tales como:

RSA

Rabin

Elgamal

McEliece

Bsicamente, el operador es el equivalente aritmtico a calcular una


exponenciacin natural y luego calcular el mdulo o residuo del resultado
respecto a cierto nmero (M).

9
La Exponenciacin Modular recibe tres operandos de entrada:

El operando X es llamado comnmente la base de la exponenciacin,


El nmero Y es referido como el exponente
M es referido como el mdulo de la representacin.

Sean X, Y y M nmeros enteros tal que:


M>0.

Se define la Exponenciacin Modular P como:

P = XY mod M

Si y slo si existe un nmero entero k tal que:

XY = kM + P

La Exponenciacin Modular debe operar sobre nmeros enteros de gran


tamao, generalmente en binario, esto es debido a que por niveles de
seguridad cada vez ms exigentes en los sistemas criptogrficos modernos,
obliga a un aumento paulatino en el tamao en bits de las claves, de modo
que los operadores que componen el sistema deben manejar operandos de
mayor tamao.

Esta situacin tiende a hacer lenta la ejecucin de algunos de estos


operadores, especialmente en aquellos de gran complejidad.

Existe entonces un inters por la optimizacin de tales operaciones, de


modo que se puedan conseguir tiempos de ejecucin aceptables.

Las implementaciones en hardware aparecen como alternativa de diseo,


ya que el hardware dedicado y optimizado para una operacin es
potencialmente ms rpido que la ejecucin de una aplicacin de software
sobre hardware genrico.

El algoritmo binario es la primera aproximacin prctica al problema del


clculo de la exponenciacin modular.

Se trata de un algoritmo que tiene dos versiones, dependiendo del sentido


en el que se recorre la representacin binaria del exponente y est basado
en la Regla de Horner. Esta regla bsicamente expresa una manera
alternativa y recursiva de representar un nmero binario en cierta base b.

Tomemos como entrada, nmeros enteros, que representan:

Base= a
Exponente= n
Mdulo = m

Estos nmeros tienen las siguientes restricciones:

10
0<= a < m, m>=2, n>=0

Retorna, un entero exp=an mod m

Funcin exponenciacin (entero a, entero n, entero m)

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

La idea detrs de la exponenciacin modular rpida consiste en obtener la


representacin del exponente n en dgitos binarios (dt,d t-1,...,d2,d1), con dt
=1, y hallar los distintos cuadrados sucesivos (mod m) de la base a:
(a1,a2,a4,...,a2t), para despus multiplicar mdulo m las potencias a2i
correspondientes a los dgitos binarios di que sean "1".

Partiendo de esta idea, el algoritmo arriba mostrado se sirve de un bucle


en el que en cada iteracin se van generando y multiplicando los cuadrados
correspondientes, al mismo tiempo que se va dividiendo el exponente n
entre 2 (para obtener los dgitos del exponente en binario).

3.7- Mximo comn


divisor e inverso
multiplicativo
Cuando intentamos encontrar el Mximo Comn Divisor (MCD),
aprendimos en el colegio que:

Descomponemos en factores primos los dos nmeros y tomamos los


factores comunes a ambos con el menor exponente con el que aparezcan.

11
El problema inicial es el siguiente:

Encontrar el mximo comn divisor entre dos nmeros enteros positivos y.

Aunque es un mtodo bastante til y sencillo para conseguir lo que


queremos tiene un evidente problema: si los nmeros son muy grandes, o
si sus factores primos lo son, la cosa se complica ya que el clculo de la
descomposicin se torna bastante tedioso. Por ello es interesante tener a
mano otro mtodo para casos en los que el procedimiento inicial se
complique.

El llamado algoritmo de Euclides nos servir; ste nos dice lo 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.

Esta divisin nos proporcionar un cociente,c1, y un resto,r1.

Si r1=0 , entonces mcd(a,b)=b.

Si no es cero dividimos el divisor, c1, entre el resto, r1, obteniendo otro


cociente,c2, y otro resto,r2.

Si r2 = 0, entonces mcd(a.b) = r1 .

Si no es cero volvemos a dividir divisor entre resto.

Y as sucesivamente.

Esto es, el mximo comn divisor entre a y b es el ltimo resto distinto de


cero que obtengamos con el procedimiento anterior.

Si analizamos el algoritmo de Euclides se ve claramente que necesitamos


demostrar que el mximo comn divisor entre a y b es igual al mximo
comn divisor entre b y r1.

De este modo, esa igualdad se mantendr durante todo el proceso y


llegaremos a que el ltimo resto distinto de cero es el mximo comn
divisor de los dos enteros positivos iniciales.

Veamos ahora cmo podemos demostrar este hecho y despus poder ver
un algoritmo con un ejemplo:

Teorema:

El mximo comn divisor de dos nmeros enteros positivos a y b, con a >


b > 0, coincide con el mximo comn divisor de b y r, siendo r el resto que
se obtiene al dividir a entre b.

Demostracin:

Sean d = mcd(a.b) y t = mcd(b.r)

12
Vamos a demostrar que d = t.

Por definicin de mximo comn divisor, se tiene que d es un divisor tanto


de a como de b. Por tanto a= a1d y b = b1d

Por otro lado, por el algoritmo de la divisin se tiene que:

a = bq + r, con 0<= r < b (1)

de donde llegamos a

r = a bq = a1dq = (a1 b1q) d

Por tanto d es un divisor de r.

Como ya tenamos que tambin es un divisor de b entonces debe dividir a


su mximo comn divisor, esto es, d es un divisor de t.

Por otro lado, t es un divisor tanto de b como de r.

Por ello se tiene que b = pt y r = st .

Sustituyendo estas dos igualdades en (1) obtenemos lo siguiente:

a = ptq + st = (pq + s)t

Por tanto t es un divisor de a. Como tambin lo era de b debe ser un divisor


de su mximo comn divisor, es decir, t es un divisor de d.

Como d es un divisor de t y t es un divisor de d no queda otra opcin ms


que t = d.

Por tanto el algoritmo de Euclides funciona.

Ejemplos de aplicacin del algoritmo

En esta seccin de la lectura vamos a ver un par de ejemplos de aplicacin


del algoritmo de Euclides. Vamos con ellos:

Clculo de mcd(721, 448)

Como hemos explicado antes dividimos el nmero mayor entre el menor; si


el resto no es cero dividimos el divisor entre el resto; y as sucesivamente
hasta que llegamos a un punto en el que el resto es cero.

Los resultados de las divisiones (expresados como dividendo=divisor


cociente + resto) son:

721 = 448 . 1 + 273


448 = 273 . 1 + 175
273 = 175 . 1 + 98

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)

Vamos con el segundo ejemplo, con nmeros ms grandes en este caso.


Expresamos los resultados parciales de la misma forma que en el ejemplo
anterior:

25134 = 19185 . 1 + 5949


19185 = 5949 . 3 + 1338
5949 = 1338 . 4 + 597
1338 = 597 . 2 + 144
597 = 144 . 4 + 21
144 = 21 . 6 + 18
21 = 18 . 1 + 3*
18 = 3 . 6 + 0

Vemos que aunque los nmeros son bastante mayores que los anteriores
el nmero de operaciones necesarias para el clculo es el mismo.

Concluyendo, tenemos que, como marca el *, mcd(25134, 19185) = 3.

Un ejemplo de un algoritmo que realice esta funcin puede ser:

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

Ahora veremos el concepto de inverso multiplicativo, recproco o inversa


de un nmero x, es el nmero, denotado como 1x x 1, que multiplicado
por x da 1 como resultado.

14
El multiplicador modular inverso de un entero n mdulo p es un entero m
tal que:

n-1 m (mod p)

Esto significa que es el inverso multiplicativo en el anillo de los enteros


mdulo p. Es equivalente a

mn 1 (mod p)

El multiplicador inverso de n mdulo p existe si y slo si n y p son coprimos,


es decir, si MCD(n, p)=1.

Si existe el multiplicador modular inverso de n mdulo p, se puede definir


la operacin de divisin entre n mdulo p mediante la multiplicacin por el
inverso.

El 0 no tiene inverso multiplicativo.

Todo nmero complejo, salvo el 0, tiene un inverso que es un nmero


complejo.

El inverso de un nmero real tambin es real, y el de un nmero racional


tambin es racional.

Para obtener una aproximacin del inverso multiplicativo de x, empleando


nicamente la multiplicacin y la resta, se puede empezar con un nmero y
(una primera aproximacin), y reemplazar y por 2y-xy2.

Una vez que la variacin entre dos iteraciones sucesivas de y se haga lo


suficientemente pequea (y se mantenga pequea), y ser una
aproximacin del inverso de x.

Es decir:

Si tenemos Y/X su inverso multiplicativo es X/Y; o bien


Si tenemos X su inverso multiplicativo es 1/X.

El inverso multiplicativo es aplicable a distintos tipos de objetos


matemticos.

La inversa de una matriz es otra matriz, denominada matriz inversa,


que al multiplicarse por la original es igual a la matriz identidad.

La inversa de una funcin es la resultante de despejar la variable


independiente, convirtindola en dependiente. Grficamente es un
trazado paralelo a la recta diagonal y = x.

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|.

En las Aritmtica Modular, el inverso multiplicativo de x tambin


est definido: es el nmero a tal que (a x) mod n = 1. Sin embargo,
este inverso multiplicativo slo existe si a y n son primos entre s. Por
ejemplo, el inverso de 3 mdulo 11 es 4, porque es la solucin de (3
x) mod 11 = 1. Un algoritmo empleado para el clculo de inversos
modulares es el Algoritmo extendido de Euclides.

3.8- RSA.
El algoritmo RSA se asocia a los conceptos criptogrficos que mencionamos
en el punto 3.4 Aplicaciones numricas.

Como una simple definicin podemos entender que la Criptografa aparece


ligada a la necesidad de mantener secretas cierta informacin que
necesitamos operar.

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.

En la actualidad el objetivo que se espera alcanzar es garantizar la


confidencialidad de la informacin enviada por medios informticos y
electrnicos.

El sistema criptogrfico RSA fue propuesto por Rivest, Shamir y Adleman)


en 1978 y es el primer criptosistema de clave pblica construido.

A hoy sigue siendo el ms utilizado. La (probable) funcin de una va en que


se apoya es el producto de nmeros enteros, ya que la factorizacin se
considera un problema intratable.

Veamos en detalle el sistema RSA:

Generacin de las claves:

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

La descripcin que hemos hecho contiene el mtodo de transmitir un


mensaje numrico.

Qu hemos visto como puntos a destacar en este mtodo?

En primer lugar, observemos que el mtodo reposa en la certidumbre de


que, en general, es difcil factorizar un nmero que es producto de dos
primos.

Evidentemente esto no es verdad en general, los primos en cuestin deben


satisfacer algunas condiciones suplementarias. En general los mtodos de
factorizacin eficaces existentes imponen condiciones sobre el tipo de
primos que se admiten. Digamos que las parejas de primos que evitan los
mtodos de factorizacin conocidos se llamarn primos seguros y notemos
que, claramente, este concepto es variable por cuanto mtodos nuevos de
factorizacin impondrn nuevas condiciones.

Algunas de las propiedades de un primo seguro son evidentes, por


ejemplo, han de ser grandes; a hoy se estima que los primos seguros han
de tener un mnimo de 100 dgitos.

Adems de esta primera condicin es necesario analizar las distintas etapas


con el fin de asegurarnos que las operaciones que han de ser rpidas
efectivamente lo son y que las que han de ser intratables tambin.

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.

Es una tcnica para el diseo de algoritmos que consiste en resolver un


problema a partir de la solucin de subproblemas del mismo tipo, pero de
menor tamao.

Si los subproblemas son todava relativamente grandes se aplicar de


nuevo esta tcnica hasta alcanzar subproblemas lo suficientemente
pequeos para ser solucionados directamente.

Ello naturalmente sugiere el uso de la recursin en las implementaciones


de estos algoritmos.

La resolucin de un problema mediante esta tcnica consta


fundamentalmente de los siguientes pasos:

1. En primer lugar ha de plantearse el problema de forma que pueda ser


descompuesto en k subproblemas del mismo tipo, pero de menor tamao.
Es decir, si el tamao de la entrada es n, hemos de conseguir dividir el
problema en k subproblemas (donde 1 k n), cada uno con una entrada
de tamao nk y donde 0 nk < n. A esta tarea se le conoce como divisin.

El nmero k debe ser pequeo e independiente de la entrada determinada,


por ejemplo: en el caso particular de contener una sola llamada recursiva
tendremos k = 1

Donde llegamos a este tipo de algoritmo, podemos hablar de


simplificacin; ejemplos: el clculo de la factorial de un nmero. Tambin
son algoritmos de simplificacin el de bsqueda binaria en un vector o el
que resuelve el problema del k-simo elemento.

2. En segundo lugar han de resolverse independientemente todos los


subproblemas, bien directamente si son elementales o bien de forma
recursiva.

El hecho de que el tamao de los subproblemas sea estrictamente menor


que el tamao original del problema nos garantiza la convergencia hacia los
casos elementales, tambin denominados casos base.

18
3. Por ltimo, combinar las soluciones obtenidas en el paso anterior para
construir la solucin del problema original.

Ahora veamos algunas caractersticas de los algoritmos Divide y Vencers.

Anteriormente hablamos de los algoritmos de simplificacin, de los cuales


podemos nombrar como ventajas el poder reducir el tamao del problema
en cada paso, por lo que sus tiempos de ejecucin suelen ser muy buenos
(normalmente de orden logartmico o lineal). Adems pueden admitir una
mejora adicional, puesto que en ellos suele poder eliminarse fcilmente la
recursin mediante el uso de un bucle iterativo, lo que conlleva menores
tiempos de ejecucin y menor complejidad espacial al no utilizar la pila de
recursin, aunque por contra, tambin en detrimento de la legibilidad del
cdigo resultante.

Ahora bien, por el hecho de usar un diseo recursivo, los algoritmos


diseados mediante la tcnica de Divide y Vencers van a heredar las
ventajas e inconvenientes que la recursin plantea:

a) Se obtiene un diseo simple, claro, robusto y elegante, lo que da lugar a


una mayor legibilidad y facilidad de depuracin y mantenimiento del
cdigo obtenido.

b) Sin embargo, los diseos recursivos necesitan un mayor tiempo de


ejecucin que los iterativos, adems de la complejidad espacial que puede
representar el uso de la pila de recursin.

Desde un punto de vista de la eficiencia de los algoritmos Divide y


Vencers, es muy importante conseguir que los subproblemas sean
independientes, es decir, que no exista solapamiento entre ellos. De lo
contrario el tiempo de ejecucin de estos algoritmos ser exponencial.

Como ejemplo pensemos en el clculo de la sucesin de Fibonacci, el cual,


a pesar de ajustarse al esquema general y de tener slo dos llamadas
recursivas, tan slo se puede considerar un algoritmo recursivo pero no
clasificarlo como diseo Divide y Vencers.

Esta tcnica est concebida para resolver problemas de manera eficiente y


evidentemente este algoritmo no lo es dado que el tiempo de ejecucin es
exponencial.

En cuanto a la eficiencia hay que tener en tambin en consideracin un


factor importante durante el diseo del algoritmo: el nmero de
subproblemas y su tamao, pues esto influye de forma notable en la
complejidad del algoritmo resultante.

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.

Otra consideracin importante a la hora de disear algoritmos Divide y


Vencers es el reparto de la carga entre los subproblemas, puesto que es
importante que la divisin en subproblemas se haga de la forma ms
equilibrada posible.

En caso contrario nos podemos encontrar con anomalas de


funcionamiento como le ocurre al algoritmo de ordenacin Quicksort.

ste es un representante claro de los algoritmos Divide y Vencers, y su


caso peor aparece cuando existe un desequilibrio total en los
subproblemas al descomponer el vector original en dos subvectores de
tamao 0 y n1.

Como vimos en el tema referido a algoritmos de ordenacin, en este caso


su orden es O(n2), frente a la buena complejidad, O(nlogn), que consigue
cuando descompone el vector en dos subvectores de igual tamao.

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.

La programacin dinmica resuelve los subprogramas una sola vez y guarda


sus soluciones en una tabla para su futura utilizacin.

La solucin de problemas mediante esta tcnica se basa en el llamado


principio de ptimo enunciado por Bellman (1957) y que dice:

En una secuencia de decisiones ptima toda subsecuencia ha de ser


tambin ptima.

20
Para que un problema pueda ser abordado por esta tcnica ha de cumplir
dos condiciones:

La solucin al problema ha de ser alcanzada a travs de una secuencia de


decisiones, una en cada etapa.

Dicha secuencia de decisiones ha de cumplir el principio de ptimo.

En grandes lneas, el diseo de un algoritmo de Programacin Dinmica


consta de los siguientes pasos:

1. Planteamiento de la solucin como una sucesin de decisiones y


verificacin de que sta cumple el principio de ptimo.

2. Definicin recursiva de la solucin.

3. Clculo del valor de la solucin ptima mediante una tabla en donde se


almacenan soluciones a problemas parciales para reutilizar los clculos.

4. Construccin de la solucin ptima haciendo uso de la informacin


contenida en la tabla anterior.

Las tems 1-3 constituyen la base de la solucin de Programacin Dinmica


para un cierto problema.

Cuando se realiza el punto 4, a veces mantenemos informacin adicional


durante el punto 3 para facilitar la construccin de una solucin ptima.

Vemos as que la Programacin Dinmica, igual que la tcnica Divide y


Vencers, resuelve problemas combinando las soluciones de
subproblemas.

Como vimos anteriormente, los algoritmos Divide y Vencers particionan el


problema en subproblemas independientes, resuelven stos
recursivamente, y combinan sus soluciones para obtener la solucin del
problema original.

De manera contraria, la Programacin Dinmica es aplicable cuando los


subproblemas no son independientes, es decir, cuando los subproblemas
comparten sub-subproblemas.

En este contexto, un algoritmo Divide y Vencers hace ms trabajo del


necesario, ya que resuelve repetidamente sub-subproblemas comunes.

Un algoritmo de Programacin Dinmica resuelve cada sub-subproblema


slo una vez, salvando su solucin en una tabla de cara a evitar el trabajo
de recalcular la solucin cada vez que se encuentra ese sub-subproblema.

Por otro lado, el enfoque que define la Programacin Dinmica tiene


tambin ciertos parecidos con el que propone la tcnica greedy, pero la
diferencia esencial entre el mtodo greedy y el de la Programacin

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.

Pensemos por ejemplo en el problema del camino mnimo. Si queremos


encontrar el camino de longitud mnima entre el vrtice i y el j, sea A el
conjunto de vrtices adyacentes desde i. Cul de los vrtices en A debe
ser el segundo vrtice del camino? No hay forma de tomar esa decisin en
ese momento y garantizar que las decisiones futuras producirn una
solucin optimal.

Por ltimo, en lo que se refiere a similitudes, otra forma de resolver


problemas en los que no es posible conseguir una sucesin de decisiones
que, etapa por etapa, formen una sucesin optimal, es intentarlo sobre
todas las posibles sucesiones de decisiones, es decir, lo que comnmente
se llama enfoque de la fuerza bruta.

Segn esa metodologa, lo que se hace es enumerar todas esas sucesiones,


y entonces tomar la mejor respecto al criterio que se est usando como
objetivo.

La Programacin Dinmica haciendo uso explcito del Principio de


Optimalidad de Bellman, a menudo, reduce drsticamente la cantidad de
enumeraciones que hay que hacer, evitando la enumeracin de algunas
sucesiones que posiblemente nunca podrn ser optimales.

De hecho mientras que el nmero total de sucesiones de decisin


diferentes es exponencial en el nmero de decisiones (si hay d elecciones
para cada una de las n decisiones, entonces hay dn posibles sucesiones de
decisiones), los algoritmos de Programacin Dinmica suelen tener
eficiencia polinomial.

Un ejemplo que podemos mencionar es resolver la serie de Fibonacci pero


no de manera recursiva como la vimos anteriormente, sino aplicando los
conceptos de programacin dinmica:

Proc otrofibonacci(n: cardinal):cardinal


Var i,suma,x,y:cardinal

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

En general, los algoritmos obtenidos mediante la aplicacin de esta tcnica


consiguen tener complejidades (espacio y tiempo) bastante razonables,
pero debemos evitar que el tratar de obtener una complejidad temporal de
orden polinmico conduzca a una complejidad espacial demasiado elevada

La Programacin Dinmica se adapta a problemas de carcter secuencial,


por ejemplo:

Bsqueda de caminos ms cortos entre dos puntos

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.

Se llaman algoritmos de vuelta atrs, porque en el caso de no encontrar


una solucin a una subtarea se retrocede a la subtarea anterior y se prueba
otro camino diferente a los probados anteriormente.

Estos algoritmos se asemejan al recorrido en profundidad dentro de un


grafo, siendo cada subtarea un nodo del grafo.

El caso es que el grafo no est definido de forma explcita (como lista o


matriz de adyacencia), sino de forma implcita, es decir, que se ir creando
segn avance el recorrido de la bsqueda. A menudo dicho grafo se

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.

Los problemas que manejan los algoritmos exhaustivos, se caracterizan


por:

a. Se trata generalmente de problemas de optimizacin, con o sin


restricciones.

b. La solucin es expresable en forma de una secuencia de decisiones.

c. Existe una funcin denominada factible que permite averiguar si en una


secuencia de decisiones, la solucin en curso, viola o no las restricciones.

d. Existe una funcin, denominada solucin, que permite determinar si una


secuencia de decisiones factible es solucin al problema planteado.

El esquema general de solucin presenta los siguientes pasos:

a. Vuelta Atrs hace un recorrido en profundidad del espacio de bsqueda


partiendo de la raz.

b. El recorrido en profundidad regresa sobre sus pasos, retrocede, cada vez


que encuentra un camino que se ha acabado o por el que no puede
continuar.

c. En un recorrido en profundidad o en anchura sobre un espacio de


bsqueda se conoce de antemano el orden en que se van a generar o
recorrer, sus nodos.

Este tipo de metodologa es muy genrica, ya que trata de recorrer todas


las posibles soluciones y encontrar la ms apropiada para cada caso o las
soluciones que satisfacen una condicin, con lo que puede ser aplicada en
la mayora de problemas. Por ello, esta tcnica de resolucin es usada en
muchos mbitos de la programacin, por ejemplo, para el clculo de
expresiones regulares o para tareas de reconocimiento de texto y de
sintaxis de lenguajes regulares.

Esta tcnica es usada en diversos lenguajes de programacin como ser


Planner o Prolog y da soporte a muchos algoritmos en inteligencia artificial.
En este tipo de algoritmo, la eleccin de un sucesor en una etapa, no
implica su eleccin definitiva, con lo que es probable que se vuelva a
referenciar en un futuro.

Adems, si son comparados con algoritmos de programacin dinmica, se


observa, que stos tratan de almacenar los resultados para no tener que

24
recalcularlos, mientras que en vuelta atrs no podemos hacer esto, ya que
el nmero de casos es muy elevado.

Si bien, aunque de forma general este tipo de algoritmos son muy


ineficientes, es cierto que se pueden considerar otros mtodos
algortmicos, ejemplo programacin dinmica, para realizar posibles
optimizaciones de algoritmos vuelta atrs, ya que a veces stos son el
nico camino posible para resolver determinados problemas.

En general para poder aplicar vuelta atrs, la solucin al problema debe


poder expresarse como una secuencia ordenada (x1,x2, ...,xn)
unidimensional, donde los xi representan elecciones de algn conjunto
finito Ci. Es decir, cada componente xi se elige en cada etapa de entre un
conjunto finito de valores y cada etapa es un nivel en el rbol de
soluciones.

El funcionamiento del algoritmo, consiste en pasar por todos las posibles


soluciones de forma metdica y ordenada, es decir, por todos los valores
en cada elemento. Para ello tenemos que determinar cules sern los
valores posibles que podremos ir introduciendo en sta.

Adems de esto tenemos que identificar los tipos de nodos con los que se
va a trabajar:

- Nodo solucin: El cual se establece cuando el recorrido del rbol tiene


xito (hoja del rbol).

- Nodo problema: Que es en el que hasta el momento encaja todo y se


puede encontrar una solucin.

- Nodo fracaso: Que es un nodo en el que el recorrido no tiene xito,


debido a que en alguna etapa, la solucin construida no se puede
completar.

Este tipo de algoritmos no son eficientes, ya que se basan en el mtodo de


prueba y error, y en muchas ocasiones para conseguir solucin se tiene que
recorrer todo el rbol de bsqueda o gran parte de l.

Ahora bien hay que decir que la eficiencia depende de:

El nmero de nodos del rbol de bsqueda que se visitan para


conseguir la solucin

v(n).

El trabajo realizado en cada nodo, esto es, el coste de la funcin de


solucin completa o ver si la solucin es aceptable hasta el
momento. Este coste lo podemos expresar como p(n), ya que
generalmente ser polinmico.

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.

Tambin se podran crear funciones acotadoras para que reduzcan mucho


el nmero de nodos generados, si stas slo dejaran un nodo el algoritmo
se convertira en voraz y su coste bajara a O(p(n)n).

Aunque normalmente los costes ms bajos que se pueden conseguir son el


orden de O(p(n)2n).

Se puede concluir que los algoritmos de vuelta atrs no son todo lo


eficientes que deberan, y se deben utilizar para resolver parte de otros
problemas o problemas reducidos.

Aun as la gran ventaja que tienen es que si hay solucin la encontrarn;


veamos un esquema de ejemplo:

algoritmo Vuelta Atras


INICIO
inicializar seleccin de candidatos;
Mientras (exitosa o no mas candidatos) hacer
seleccionar siguiente;
si (aceptable)
entonces registrarlo;
si (solucin incompleta)
entonces ensaya;
si (no exitoso)
entonces cancelar registro
finsi
fin si
fin si
fin hacer
fin

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:

- Ascendente/Descendente; refirindonos a nmeros

- Alfabtico; refirindonos a caracteres

Los procesos de ordenamiento pueden ser:

1- Internos: clasificamos un array o vector. Se denomina as porque se


realiza directamente en memoria con lo que el proceso es ms rpido.

2- Externos: clasificamos un registro de un archivo almacenado en un


dispositivo externo ms lento.

La complejidad de un algoritmo es la cantidad de trabajo realizado y se


mide por el nmero de operaciones bsicas que se han llevado a cabo.

Por lo cual podemos comenzar comparando los algoritmos que


desarrollaremos en esta unidad.

4.2- Ordenacin por


insercin y otras
ordenaciones simples.
Se supone que se tiene un segmento inicial del array ordenado, el paso
general es aumentar la longitud del segmento ordenado insertando el
elemento siguiente X en el lugar adecuado, esto se hace moviendo cada
elemento del segmento ordenado a la derecha, hasta que se encuentra un
elemento < X.

27
Algoritmo INSERCION

desde (I=2 hasta N) hacer


Ordenamiento por X L(I)
Insercin. J I- 1
Comportamiento = Mientras ( (L(J) > X) and (J > 0)) hacer
L(J+1) L(J)
O(n2) J J-1
fin_mientras
L(J+1) X
fin_desde
fin

Para hallar la complejidad del algoritmo, analizamos el peor, el mejor y el


caso medio.

El peor caso, es decir, el mayor nmero de comparaciones, se dara cuando


el bucle interno tiene que hacer el mayor nmero de veces (I-1) siendo I el
valor del ncleo externo, es decir, cuando cada elemento examinado es
menor que el resto y esto ocurrir cuando el array est ordenado en orden
contrario al que deseamos.

En el caso medio las comparaciones que se haran seran: para cada


elemento I examinando como mnimo realizo una comparacin en el caso
que sea mayor que el resto y como mximo N-I.

Mtodo de la burbuja o intercambio


Su filosofa es ir comparando los elementos del array 2 a 2, intercambiando
sus posiciones si es necesario y repetir este proceso hasta que ya tengo
todo el array ordenado.

Pasos del Algoritmo:

Tenemos almacenado en memoria un array A de nmeros; el algoritmo


funciona de la siguiente forma:

1) Comparamos A1 y A2 y los colocamos en el orden que deseemos.


Comparamos A2 y A3 y hacemos lo mismo, realizamos esta operacin hasta
conseguir A n-1 con An.

Este primer paso implica n-1 comparaciones y despus de este paso el


elemento mayor del array se posiciona hacia la ltima posicin.

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.

3) Repetir el primer paso hasta comparar A n-3 con A n-2 y as sucesivamente


hasta realizar el paso A n-1 en el que compararamos A 1 y A 2 solamente.

Veamos un caso prctico:


Ordenemos el siguiente vector: 20 80 10 30

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

Vemos que el proceso es una estructura repetitiva de pasos y


comparaciones: bucles.

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.

Estando en un paso I bastar que realice N-I comparaciones.

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

La complejidad viene dada por la frmula:

(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.

Se trata de saltar ms de una posicin para hacer la comparacin.

El salto comienza siendo de N+1/2 elementos donde N es el tamao del


array y se va reduciendo a la mitad en cada iteracin, hasta que el valor del
salto sea uno:

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.

Esto permite que a medida que el paso se va haciendo ms pequeo, los


elementos ya estn bastante ordenados globalmente y al realizar la ltima
etapa con paso h=1 (que es una ordenacin por Insercin), prcticamente
se lleva a cabo en una sola pasada (O(n) ), dado todo el trabajo realizado en
las iteraciones previas.

Este algoritmo es un claro ejemplo de cmo una pequea modificacin a


un algoritmo lento lo puede convertir en uno bastante ms rpido.

El nmero de comparaciones efectuado por Shellsort es una funcin de las


secuencias de incremento o distancias que utiliza.

Es un algoritmo bastante simple pero tambin debemos indicar que su


anlisis es difcil y requiere respuestas a varios problemas matemticos.

Tenemos otros algoritmos ms eficientes para ordenamiento de arreglos


que el Shellsort, si lo comparamos con otros cuya complejidad es O (N log
N), pero tambin debemos indicar que es un algoritmo fcil de programar.

SHELLSORT, COMPLEJIDAD PROMEDIO EN TIEMPO =


O (n9/8)
Mejor secuencia
Es vital para la eficiencia del algoritmo que todos los elementos de la serie
Es un muy buen de pasos sean nmeros impares, para lo cual basta con restarle 1 al paso si
candidato para resolver ste es par.
problemas de
ordenamiento en Con esta pequea modificacin se reduce el tiempo promedio de ejecucin
conjuntos de menos de y su varianza.
100.000 elementos.

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.

Sin embargo, an no se sabe con certeza cul es la eficiencia real del


algoritmo, y es muy posible que existan series de pasos que reduzcan los
tiempos de ejecucin obtenidos en los tests descriptos.

Valor particular: 64.700


El profesor Benjamn Bustos, de la Universidad de Chile, realiz el siguiente
informe sobre pruebas realizadas en el mtodo de ordenamiento Shellsort

Logr probar el rendimiento de la serie:

hi = h i+1 / 2.4

Partiendo de:

ht = n / 4.8

Terminando cuando:

h1 = 1

Se parti de un valor inicial de 100 y se llevo hasta un tamao de 100000,


en incrementos de 100.

Se identificaron dos situaciones en el estudio:

Las diferencias en el tiempo utilizado entre cantidades de elementos muy


similares eran grandes.

El algoritmo se comportaba estrepitosamente mal con arreglos de


exactamente 64.700 elementos, es decir, un orden de magnitud de
diferencia con respecto a arreglos de 64.600 y 64.800 elementos).

Este caso particular se debe a que el peor caso de Shellsort:

hi = 2 i-1 (h es potencia de 2)

Ejecuta un nmero de operaciones

O (n2)

Si los elementos estn distribuidos originalmente en el arreglo de tal


manera que la mitad mayor se encuentre en celdas pares y la mitad menor
en celdas impares.

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.

De este modo en el ltimo paso se deben realizar una gran cantidad de


comparaciones.

Efectivamente esto era lo que ocurra con la serie de pasos estudiada.

Todas las aproximaciones de:

hi = h i+1 / 2.4 partiendo con :ht = 64700 / 4.8 dan nmeros pares.

Siendo el nico valor entre 100 y 100000 en incrementos de 100 en el que


ocurre esta particularidad, por lo que el ltimo paso debe realizar una gran
cantidad de trabajo al no haberse comparado nunca las posiciones impares
del arreglo con las pares, lo que degradaba notablemente el rendimiento
del algoritmo.

Realizando la pequea optimizacin de restarle uno al paso si ste resulta


par, se obtiene un algoritmo mucho ms homogneo y eficiente en su
comportamiento.

4.4- Mergesort.
Este clase de algoritmo es un tpico uso del concepto divide y vencers.
Fue desarrollado por John Van Neumann en 1945.

Durante el desarrollo de este tem, utilizaremos el smbolo merge:

Ahora bien, las condiciones que debemos considerar son:

Si el nmero de elementos est entre 0 y 1 el algoritmo termina.

Se invoca recursivamente al algoritmo.

Se mezclan las dos mitades ordenadas en un vector ordenado.

El tiempo que demanda un algoritmo del tipo MERGESORT est definido


por la recurrencia:

34
T(n) = 1 SI n = 1

T(n) = 2T(n/2)+

El algoritmo para realizar el merge tiene las siguientes caractersticas:

El orden del algoritmo es n log n, tanto en el peor como en el mejor caso.

Necesita un espacio extra de almacenamiento para poder funcionar

Es muy eficiente manejando medios secuenciales de acceso lento

Es eficiente en el uso de lista enlazada

4.5- Quicksort.
Es el mtodo de ordenacin ms rpido.

Se lo conoce tambin como Ordenamiento por Particin, fue creado por


Charles Antony Hoare en 1960.

Se basa en dividir la lista inicial en otras ms pequeas que luego se


ordenarn recursivamente y que contendr una, los elementos ms
pequeos, y otra los ms grandes.

PASOS

Se elige arbitrariamente un elemento de la lista al que llamaremos pivote.

El objetivo final es que a la izquierda del pivote queden colocados los


elementos ms pequeos que l y a la derecha, los ms grandes, con lo que
el pivote quedar en la posicin que le corresponde en la lista ordenada.

Nosotros tomaremos como pivote el primer elemento del array.

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

Procedimiento SUBLISTAS (FIRST,LAST,PIV:entero,L:array)


var X,I:entero
inicio
X L(FIRST)
PIV FIRST
desde (I=FIRST+1 hasta LAST)
si (L(I) < X)
entonces
(PIV PIV+1)
AUX L(PIV)
L(PIV) L(I)
L(I) AUX
fin_si
fin_desde
L(FIRST) L(PIV)
L(PIV) X
Fin

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.

Si consideramos computadoras con ms de un procesador, estamos


teniendo una muy clara aplicacin del concepto de paralelizacin de
procesos.

En los equipos con varios procesadores, donde se puede optimizar el uso


de los recursos, dado la posibilidad de sumar la memoria RAM de cada
procesador.

Culminada esta etapa tenemos:

Un grupo de elementos menores que el pivote,


PIVOTE
El pivote,
La eleccin del PIVOTE
es un factor de xito Otro grupo compuesto por nmeros mayores a l.
Podemos: elegir el Luego de lo cual debemos aplicar el concepto de recursividad:
central, comparar entre
ambos extremos y el si volvemos a dividir a cada uno de esos grupos, aplicando nuevamente lo
central, la mediana de indicado ms arriba en forma recursiva tenemos resuelto el problema.
ellos, etc.
Otros elementos muy importantes son:

El tamao de las sublistas es cada vez menor.

El tiempo de procesamiento es cada vez menor

En cada nivel el tamao de las sublistas es la mitad del anterior

Hace un eficiente uso de recursos

QUICKSORT Tiempo de Ejecucin


Promedio = O(N log N)
Peor caso= O(N2),
(depende principalmente de la eleccin del pivote)

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.

Lo ideal es poder utilizar el QUICKSORT como base y realizarle los ajustes


necesarios.

Como vimos anteriormente, el QUICKSORT hace uso de dos llamadas


recursivas, por lo cual en este caso slo necesitaramos una. Adems
podemos entender que en el peor de los casos de la SELECCIN RAPIDA
estaramos con las caractersticas del QUICKSORT.

Nuevamente, la eleccin del pivote, es el factor de xito de este proceso.

4.7- Otros algoritmos.


Me pareci muy importante terminar de hablar de ordenamiento,
comentando la forma como los principales buscadores de la web tienen
pensado los trabajos de bsqueda y ordenamiento de la informacin, por
medio de algoritmos muy especializados y tal vez poco conocidos.

Por lo cual coincidiendo con los estudios de Sergio Martin Ballesteros en


esta parte del trabajo intento ejemplificar las caractersticas de los
principales buscadores de manera genrica y sin puntualizar en los

38
buscadores especficos que lo usan, pero debemos entender que cada uno
de ellos utiliza a estos algoritmos como piezas principales para su trabajo.

De este modo, la informacin sobre sus caractersticas es tomada en base a


su desenvolvimiento, ms que a la poca documentacin que se tiene en la
web.

Como vimos anteriormente, podemos abarcar tambin que un algoritmo


es la frmula de valoracin de las pginas, segn ms de cien conceptos a
los que se otorga una importancia diferente dependiente del trmino que
se valora. De todas maneras, no se conoce con seguridad la totalidad de los
puntos que se valoran, ni tampoco la importancia real que se les otorga, lo
cual adems se acaba de complicar al tener en cuenta que tanto los
conceptos a valorar como la importancia que se les da, experimentan
variaciones constantemente, ya sea para mejorar la calidad de los
resultados, como para evitar que se descubra el algoritmo exacto.

Los conceptos se utilizan para valorar las pginas, se dividen en dos


grandes familias:

1.- Criterios internos

2.- Criterios externos

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.

Criterios internos a la pgina web:

A grandes rasgos, consisten en todo aquello que se encuentra en la propia


pgina, entre ellos destacan:

1. Nmero de pantallas: (adems pantallas ms valoracin)

2. Ttulos de las pantallas: (las pantallas deben tener un ttulo)

3. Redaccin de los textos

4. Estructura que permita una fcil navegacin

5. Tecnologas aplicadas: (evitar utilizacin abusiva de flash, javascripts...)

6. Direcciones de las pantallas de acuerdo con el contenido: (url


descriptivas).

39
Criterios externos a la pgina web:

Son los conceptos que los buscadores interpretan como derivados de la


democracia de Internet, segn la que cuanto ms enlaces tiene una pgina,
ms relevancia merece, y por lo tanto aparecer ms arriba en las
bsquedas relacionadas.

Estos enlaces pueden realizarse de varias maneras, aun cuando algunos no


tienen valor para los buscadores, la explicacin en este caso se limitar a
aquellas que si que tienen. De un lado, existe la posibilidad de enlaces
mediante imgenes (.GIF o bien .JPG); estas imgenes, si no contienen
textos alternativos ni descripcin, simplemente votan a la pgina de
destino, incrementando el valor de cara a los motores de bsqueda.

El otro tipo de enlace, es el enlace de texto, que al cliquear encima, lleva


hacia la pgina web de destino. Este tipo de enlace es interesante porque
potencia la pgina de destino por el texto exacto del enlace, permitiendo
potenciar exclusivamente aquel texto, adems de tambin incrementar el
valor de la pgina de destino por su propio contenido.

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.

De este modo, las pginas destinatarias de enlaces, ganan posiciones por


ser consideradas como ms importantes por aquellos trminos por los que
estn referidas, an as, es necesario saber cmo deben ser dichos enlaces
para optimizar su utilidad.

Ahora veremos algunos de los algoritmos utilizados por los principales


buscadores de la web.

PageRank es el algoritmo de posicionamiento utilizado por uno de los ms


grandes buscadores.

Ante todo, se basa en los enlaces entrantes a nuestra pgina. Si bien, en


vez de calcular la relevancia y pertinencia slo en medidas como la
densidad de una palabra clave dentro de un texto, una vez que localiza las
pginas pertinentes en su ndice hace clculos basados en el nmero de
links externos, internos, del texto de los enlaces, de la temtica de las
pginas enlazadas y del peso de las mismas, de las etiquetas meta, de la
frecuencia relativa del trmino en la bsqueda en el texto, as hasta ms de
100 variables.

Pasamos a mostrar los ms relevantes:

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.

Pagerank-3. Palabra clave en el enlace Ms conocido como bombing, es un


factor muy importante.

Pagerank-4. Nmero de enlaces externos en la pgina que nos enlaza (no


del sitio web). Cuantos menos tenga mejor, da ms peso al link que nos
enlaza.

Pagerank-5. Posicin del link en la pgina que nos enlaza. Cuanto ms


arriba en el cdigo html mejor.

Pagerank-6. Densidad de palabras clave en la pgina que nos enlaza. Si


coinciden con las nuestras, cuanto mejor posicionada est aquella, mejor
para nosotros.

Pagerank-7. Ttulo html en la pgina que nos enlaza. Si coincide con el


nuestro, cuanto mejor posicionada est aquella, mejor para nosotros.

Pagerank-8. Link de sitio de "experto" (webs con listas de recursos de una


misma temtica). Estos enlaces son muy importantes, vienen de fuentes
reputadas sobre la misma temtica de nuestras palabras claves.

Pagerank-9. Temtica de la pgina que nos enlaza. Mejor si es de la misma


temtica que la nuestra, aunque si hay un alto nmero de enlaces, no
importa (bombing).

Pagerank-10. Estar incluido en una categora de DMOZ. Cuanto ms


relacionada la categora con nuestras palabras clave, mejor.

Para determinar el PageRank, el buscador analiza el nmero de enlaces que


provienen de otras pginas web.

Su lgica es la siguiente:

Si una pgina web enlaza con otra pgina, es que la est recomendando.

Y si la recomienda, es que debe ser importante en el mbito del tema que


trata la primera pgina web.

Pasamos a mostrar los factores que tiene en cuenta el Algoritmo de


posicionamiento PageRank para posicionar de forma negativa las pginas.

PageRank negativo1. Cero links a nosotros Para empezar no hacen falta,


pero para permanecer en la base de datos del buscador, al menos 1 enlace.

PageRank negativo2. Cloaking (ocultar determinada informacin). Algunos


buscadores penalizan esta tcnica que consiste en servir pginas distintas
segn quien las solicite, o a los robots unas y a los usuarios otras.

41
PageRank negativo3. Links desde servidores problemticos (porno,
penalizados, etc.) Problemtico en principio.

PageRank negativo4. Consultas automticas al buscador. Si desde un


servidor se realizan ms de 100 consultas seguidas con la misma palabra
clave, puede bloquear esa IP.

Otro algoritmo de ordenamiento de buscadores es WebRank.

El algoritmo de posicionamiento WebRank , en teora, funciona de forma


similar al algoritmo de posicionamiento PageRank. Sin embargo, la
experiencia de varias personas que hemos experimentado con los dos
algoritmos de posicionamiento nos hace pensar que esto no es del todo
cierto. Ms bien tiene en cuenta la popularidad del sitio medida en las
personas que utilizan su barra para acceder al mismo.

Seguidamente detallar ciertos criterios que pueden ser positivos para


ascender en este buscador. Estos criterios son nicamente una opinin de
personal, dado que estos Algoritmos de posicionamiento y ordenamiento
siguen siendo an bastante desconocidos.

Webrank-1. Es importante darse de alta en determinados directorios.

Webrank-2. Es importante ser consciente que este buscador no omite


trminos en las bsquedas, es decir, Algoritmos de posicionamiento y
Algoritmos y posicionamiento dara resultados distintos. En concreto para
la primera bsqueda a fecha 10 de abril de 2006 esta pgina aparece la
primera situada y para la segunda la tercera.

Webrank-3. Este buscador da una mayor relevancia a valores on the page


que el PageRank

Webrank-4. Otro elemento a tener en cuenta es el denominado Spam on


the page.

El hecho de repetir keywords con altas densidades y variando el texto, hace


muy posible que aparezcamos en muchas bsquedas relacionadas y
variadas con las keywords que tengan una alta densidad.

Webrank-5. Este buscador le da gran importancia al ttulo de la pgina. La


principal diferencia con PageRank es que no es estricto a la hora de la
repeticin de KeyWords en l.

Webrank-6. La densidad de las palabras clave es fundamental para obtener


un buen resultado en este buscador. Se recomienda su uso tanto en el
texto, como en el ttulo, etiquetas meta, etc.

Webrank-7. Las palabras clave o Keyword en la URL tienen un mayor peso,


sobre todo cuanto ms a la izquierda se encuentren.

42
Webrank-8. Los cambios y actualizaciones en este buscador son ms lentos
que en PageRank.

Desde hace algn tiempo se viene especulando con la posibilidad de que se


sustituya el actual algoritmo de posicionamiento PageRank, por otro
algoritmo de posicionamiento denominado Trust Rank.

Se desea que en las primeras posiciones de los resultados de bsqueda


encontremos pginas de cierta relevancia y que estn siendo
recomendadas por otras pginas que a su vez tambin tengan relevancia.

Para determinar el PageRank, algunos buscadores analizan el nmero de


enlaces que provienen de otras pginas web y su PageRank.

El Trust Rank parte de la misma base, pero en lugar de valorar la


importancia de una recomendacin en funcin del PageRank de la pgina
que recomienda, lo hace a partir de una serie de pginas web que han sido
consideradas importantes por humanos en lugar de por algoritmos.

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.

Para ilustrarlo con un ejemplo:

Supongamos que disponemos de una web semilla A.

A trasmitir un valor de 100 Trust Rank a todas las webs a las que enlace.

Estas pginas, a su vez, transmitirn un Trust Rank de 99 a todas las webs a


las que enlacen. Y estas ltimas, transmitirn un Trust Rank de 98 a las que
ellas enlacen. Quines sern las webs semilla? Al respecto hay
discrepancias. Se habla de un algoritmo que determinar las webs que
pueden ser semilla.

En ciertos foros especializados en posicionamiento en buscadores se afirma


que sern las webs gubernamentales y de universidades las que empezarn
a transmitir el Trust Rank semilla, y en otros foros se afirma que ser uno
de los principales buscadores, con capacidad de sumar recursos humanos a
esta tarea.

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.

Ramirez Felipe. (2008) Introduccin a la programacin. Alfaomega.

Perez Berro. Algoritmo y Programacin. Nueva Librera.

R.C.T. Lee. (2007). Introduccin al diseo y anlisis de algoritmos. Mxico. Mc


Graw Hill.

Cairo B. Metodologa de la Programacin.

Joyanes Aguilar. (2000). C. Algoritmos, programacin y estructuras de datos.

Perez Julio. Matemtica Discreta y Algoritmos.

Joyanes Aguilar. (2005) Algoritmo y estructura de datos una perspectiva en C.


Mc Graw Hill.

De Giusti (2001) Algoritmos datos y programas. Pearson.

Knuth Donald. (1995) Algoritmos fundamentales. REVERTE.

Hernandez Roberto. (2001) Estructuras de datos y algoritmos. Prentice Hall.

Sanchez Velsquez (1998) Introduccin al anlisis de algoritmos. Trillas.

Torres Carmen (1992). Diseo y anlisis de algoritmos. Thomson


Paraninfo,S.A.

www.uesiglo21.edu.ar

44

Vous aimerez peut-être aussi