You are on page 1of 45

Módulo 3

Recursión y
Algoritmos de
Ordenación.

3.1- Introducción.
La recursividad es uno de los conceptos más importantes en programación.

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 módulo 1 no son de fácil aplicación. Esto nos indica
Es una capacidad que que no hay problemas intrínsecamente 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 más fáciles de
propio código. seguir y entender, debemos tener en cuenta que consume más recursos y
es más lenta que una solución iterativa.

Para desarrollar algoritmos recursivos hay que partir del supuesto de que
ya existe un algoritmo que resuelve una versión más sencilla del problema.

A partir de esta suposición debe hacerse lo siguiente:

1. Identificar sub-problemas atómicos de resolución inmediata (casos
base).

2. Descomponer el problema en sub-problemas resolubles, mediante el
algoritmo pre-existente; la solución 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 recursión

Inicio

…….

Recursión(…)

……..

fin

Tenemos varias aplicaciones clásicas de recursividad, por ejemplo:

1

1- Averiguar el factorial de un número 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 función de Fibonacci para un número 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 número 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 solución
iterativa sencilla.

2

3.2-Demostraciones
por inducción.
Hablaremos ahora sobre el concepto de inducción desde el punto de vista
matemático.

Se trata de una técnica de demostración que se utiliza para demostrar
muchos teoremas que afirman que P(n) es verdadera para todos los
enteros positivos n.

La inducción matemática se usa para demostrar proposiciones de la forma
VnP(n), donde el dominio es el conjunto de los enteros positivos.

Una demostración por inducción de que P(n) es verdadera para toda n ∈
Z+ consiste en dos pasos:

PASO BASE: Se muestra que la proposición P(1) es verdadera.

PASO INDUCTIVO: se muestra que la implicación 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 hipótesis de
inducción.

La inducción matemática expresada como regla de inferencia:

En pocas palabras sólo se muestra que si se supone que P(k) es verdadera,
entonces P(k+1) es también verdadera.

Veamos un ejemplo de uso:

Demostrar por inducción 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

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) : (hipótesis de inducción) 1+2+3+· · ·+k =k(k +1) 2 Ahora hay que demostrar la verdad de P(k + 1) : (tesis de inducción) 1+2+3+· · ·+(k +1) =(k +1)(k +2) 2 Entonces comienza la demostración tomando la hipótesis: 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. entonces P(n) es verdadero para todos los valores n > 1. 3. Es importante recordar que no todos los problemas son recursivos.3.3.para n > 1 PASO BASE: Se muestra que P(1) es verdadera.3 Recursión Básica. como se demostró la tesis de inducción. La recursión es un recurso muy poderoso que permite expresar soluciones simples y naturales a ciertos tipos de problemas. 4 .

el cuerpo de la función será un condicional. uno o varios. El segundo paso. • Indirecta: el programa o subprograma llama a otro y éste en algún momento llama al primero. porque no están dadas las condiciones para hacerlo. Si esto no ocurre podemos estar en un ciclo extraño. la recursión puede presentarse de 2 maneras: • Directa: el programa o subprograma se llama directamente a sí mismo. al paso básico. A éste llegamos cuando encontramos la solución del problema o cuando decidimos que ya no vamos a seguir. se utiliza como condición de parada o fin de la recursividad. no lineales recursiva se deben y dinámicas. ¿Cuántas condiciones debo poner? • Una por cada caso base 5 . En toda definición recursiva de un problema siempre se deben establecer dos pasos diferentes y muy importantes: • El paso básico • El paso recursivo. En toda definición Los árboles (vistos en el módulo 2) son las estructuras de datos. es decir. así como el que se llama a sí mismo. Como todas las funciones recursivas tienen la misma estructura. En otras palabras cualquier actividad de programación que se realice con árboles se • PASO BÁSICO utiliza recursividad. Puede que el problema se encuentre mal definido y entonces la máquina se quedaría ejecutando por tiempo indefinido el programa y sólo terminaría al agotarse la memoria. nuevamente dependiendo del problema a resolver. Cuando se analiza la solución recursiva de un problema es importante determinar con precisión cuáles serán los pasos básico y recursivo. Se pueden presentar uno o varios. En cada vuelta del ciclo es importante que nos acerquemos cada vez más a la solución del problema en cuestión. • PASO RECURSIVO Como vimos. propicia recursividad. Un objeto recursivo es el que aparece en la definición de sí mismo. El primero. dependiendo del problema. más eficientes que existen en Computación. por otra parte. La característica establecer 2 pasos: de los árboles es que son estructuras inherentemente recursivas.

Como ha dicho Enzo R. • Una por el caso recursivo Se debe probar primero el caso base. el algoritmo de Euclides para calcular el máximo común divisor. En la Teoría Elemental de Números.Aplicaciones numéricas. Pertenecen a la Teoría Elemental de Números las cuestiones de divisibilidad. el teorema chino del resto y la ley de reciprocidad cuadrática. la factorización de los enteros como producto de números primos. así como las sucesiones de números enteros como los factoriales y los números de Fibonacci. diciendo que la misma está tan idealizada como la Matemática misma en el resto de las ciencias. se estudian los números enteros sin emplear técnicas procedentes de otros campos de las Matemáticas. Son enunciados típicos el pequeño teorema de Fermat y el teorema de Euler que lo extiende. En este trabajo tomaremos la visión de la Teoría Computacional de Números la cual estudia los algoritmos relevantes de la Teoría de Números. En esta rama se investigan las propiedades de las funciones multiplicativas como la función de Möbius y la función φ de Euler. 6 . En una oportunidad escuché la definición de un matemático sobre la Teoría de Números. la búsqueda de los números perfectos y las congruencias. Gentile: La evolución de la Computación ha hecho que la Aritmética deje de ser una ciencia contemplativa y de especialistas para ser una rama aplicada. 3. porque si éste tiene errores (lógicos) es posible que la función se quede haciendo un ciclo infinito. Los algoritmos rápidos para evaluar números primos y factorización de enteros tienen importantes aplicaciones en Criptografía.4. Antes de ingresar en este tema me parece necesario hablar un poco sobre la Teoría de Números.

Ésta se basa en que el emisor emite un mensaje en claro. la palabra Criptología proviene de las palabras griegas Kryto y logos y significa estudio de lo oculto. apoyándose en otra clave. La función módulo representa el resto de la división. Este texto cifrado. La Aritmética Modular es una de las aplicaciones más importantes de la teoría de números.5. para obtener el texto en claro original. A fin de poder ver en más detalle este proceso es que lo dividí en los siguientes problemas que entiende: • Aritmética Modular • Exponenciación Modular • Máximo Común Divisor e Inverso Multiplicativo • RSA Los cuales veremos a continuación. 3. por medio del canal de comunicación establecido. que se ocupa del cifrado de mensajes. Las dos claves implicadas en el proceso de cifrado/descifrado pueden ser o no iguales dependiendo del sistema de cifrado utilizado.Aritmética Modular. que representamos como: 7 . Una rama de la Criptología es la Criptografía. para crear un texto cifrado.Ahora bien. Por ejemplo a mod b significa que queremos hallar el resto de a. Etimológicamente. Está representada por la función mod. llega al descifrador que convierte el texto cifrado. veamos qué es la CRIPTOGRAFIA. que es tratado mediante un cifrador con la ayuda de una clave.

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..m) = 1. 4 mod 3. 3 mod 3. Veamos por ejemplo la secuencia: 0 mod 3. que equivale a la numeración en base 3. las horas. Existen muchas aplicaciones de la Aritmética Modular. 8 . Evaluando tenemos 0. • División No existe el inverso de la multiplicación 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. Para profundizar este tema me parece interesante poder describir algunas de las propiedades más importantes de la Aritmética Modular. Sólo es posible realizar estas simplificaciones cuando el mcd(d.. que no se cumplen en todos los casos. • Multiplicación: La multiplicación xy mod m = (x mod m)(y mod m) mod m. 2. 1. 2 mod 3.. 1 mod 3. Esto se da debido a que la multiplicación es simplemente una suma repetida.La Aritmética Modular también define un sistema de numeración. 1. • Suma: (x + y) mod m = (x mod m + y mod m) mod m. por ejemplo en el calendario los días de la semana corresponden a una aritmética módulo 7. 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 sólo la suma con valores negativos por los que (x − y) mod m = (x mod m − y mod m) mod m. 0. minutos y segundos corresponden al módulo 60... Hallar el último dígito de un número decimal corresponde a una aritmética módulo 10.

Se escribe: a = b mod m Esto equivale a que a. el operador es el equivalente aritmético a calcular una exponenciación natural y luego calcular el módulo o residuo del resultado respecto a cierto número (M). Hallar el último dígito del numero 2100. 9 . La Exponenciación Modular es un operador de amplio uso en técnicas criptográficas tales como: • RSA • Rabin • Elgamal • McEliece Básicamente.El ejemplo que se presenta es extractado de [MAR03]. Se dice que a es congruente b módulo m cuando (a − b)/m = km.Exponenciación modular. 3. Para esto no es necesario hallar el valor del exponente y luego obtener el último dígito 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.6. b son múltiplos de m.

obliga a un aumento paulatino en el tamaño en bits de las claves. Las implementaciones en hardware aparecen como alternativa de diseño. de modo que se puedan conseguir tiempos de ejecución aceptables. ya que el hardware dedicado y optimizado para una operación es potencialmente más rápido que la ejecución de una aplicación de software sobre hardware genérico. El algoritmo binario es la primera aproximación práctica al problema del cálculo de la exponenciación modular. esto es debido a que por niveles de seguridad cada vez más exigentes en los sistemas criptográficos modernos. que representan: Base= a Exponente= n Módulo = m Estos números tienen las siguientes restricciones: 10 . Existe entonces un interés por la optimización de tales operaciones. dependiendo del sentido en el que se recorre la representación binaria del exponente y está basado en la Regla de Horner. Se trata de un algoritmo que tiene dos versiones. especialmente en aquellos de gran complejidad. generalmente en binario. • El número Y es referido como el exponente • M es referido como el módulo de la representación.La Exponenciación Modular recibe tres operandos de entrada: • El operando X es llamado comúnmente la base de la exponenciación. números enteros. Esta situación tiende a hacer lenta la ejecución de algunos de estos operadores. Esta regla básicamente expresa una manera alternativa y recursiva de representar un número binario en cierta base b. Y y M números enteros tal que: M>0. Sean X. de modo que los operadores que componen el sistema deben manejar operandos de mayor tamaño. Tomemos como entrada. Se define la Exponenciación Modular P como: P = XY mod M Si y sólo si existe un número entero k tal que: XY = k・M + P La Exponenciación Modular debe operar sobre números enteros de gran tamaño.

Partiendo de esta idea.. n>=0 Retorna.d1).... con dt =1. 11 ..d t-1. un entero exp=an mod m Función exponenciación (entero a..a2. 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 función La idea detrás de la exponenciación modular rápida consiste en obtener la representación del exponente n en dígitos binarios (dt. 3.a4. y hallar los distintos cuadrados sucesivos (mod m) de la base a: (a1.Máximo común divisor e inverso multiplicativo Cuando intentamos encontrar el Máximo Común Divisor (MCD).d2.7. m>=2. al mismo tiempo que se va dividiendo el exponente n entre 2 (para obtener los dígitos del exponente en binario). el algoritmo arriba mostrado se sirve de un bucle en el que en cada iteración se van generando y multiplicando los cuadrados correspondientes.. entero n.a2t). 0<= a < m.. aprendimos en el colegio que: Descomponemos en factores primos los dos números y tomamos los factores comunes a ambos con el menor exponente con el que aparezcan. para después multiplicar módulo m las potencias a2i correspondientes a los dígitos binarios di que sean "1".

El problema inicial es el siguiente: Encontrar el máximo común divisor entre dos números enteros positivos y. • Si no es cero volvemos a dividir divisor entre resto.c2. la cosa se complica ya que el cálculo de la descomposición se torna bastante tedioso. el máximo común divisor entre a y b es el último resto distinto de cero que obtengamos con el procedimiento anterior.r) 12 .b) y t = mcd(b. Aunque es un método bastante útil y sencillo para conseguir lo que queremos tiene un evidente problema: si los números son muy grandes. • Si no es cero dividimos el divisor. y otro resto. con a > b > 0. c1. r1. entonces mcd(a. El llamado algoritmo de Euclides nos servirá. digamos b. • Si r2 = 0. entonces mcd(a. siendo r el resto que se obtiene al dividir a entre b.c1. Si analizamos el algoritmo de Euclides se ve claramente que necesitamos demostrar que el máximo común divisor entre a y b es igual al máximo común divisor entre b y r1. • Esta división nos proporcionará un cociente. entre el resto. o si sus factores primos lo son. • Y así sucesivamente. obteniendo otro cociente. Veamos ahora cómo podemos demostrar este hecho y después poder ver un algoritmo con un ejemplo: Teorema: • El máximo común divisor de dos números enteros positivos a y b. • Si r1=0 . éste nos dice lo siguiente: Para calcular el máximo común divisor entre dos números enteros positivos a y b dividimos el más grande. digamos a entre el más pequeño.b)=b. Demostración: Sean d = mcd(a. y un resto.r2. esa igualdad se mantendrá durante todo el proceso y llegaremos a que el último resto distinto de cero es el máximo común divisor de los dos enteros positivos iniciales. coincide con el máximo común divisor de b y r. Por ello es interesante tener a mano otro método para casos en los que el procedimiento inicial se complique. De este modo.b) = r1 . Esto es.r1.

t es un divisor tanto de b como de r.Vamos a demostrar que d = t. Ejemplos de aplicación del algoritmo En esta sección de la lectura vamos a ver un par de ejemplos de aplicación del algoritmo de Euclides. Por otro lado. Los resultados de las divisiones (expresados como dividendo=divisor · cociente + resto) son: • 721 = 448 . Por ello se tiene que b = pt y r = st . d es un divisor de t. y así sucesivamente hasta que llegamos a un punto en el que el resto es cero. Sustituyendo estas dos igualdades en (1) obtenemos lo siguiente: a = ptq + st = (pq + s)t Por tanto t es un divisor de a. por el algoritmo de la división se tiene que: a = bq + r. esto es. t es un divisor de d. es decir. Como ya teníamos que también es un divisor de b entonces debe dividir a su máximo común divisor. si el resto no es cero dividimos el divisor entre el resto. 1 + 175 • 273 = 175 . Por definición de máximo común divisor. Como también lo era de b debe ser un divisor de su máximo común divisor. Por tanto a= a1d y b = b1d Por otro lado. 448) Como hemos explicado antes dividimos el número mayor entre el menor. 1 + 98 13 . Vamos con ellos: Cálculo de mcd(721. 1 + 273 • 448 = 273 . Como d es un divisor de t y t es un divisor de d no queda otra opción más que t = d. con 0<= r < b (1) de donde llegamos a r = a – bq = a1dq = (a1 – b1q) d Por tanto d es un divisor de r. Por tanto el algoritmo de Euclides funciona. se tiene que d es un divisor tanto de a como de b.

se tiene que mcd(721. 3 + 14 • 21 = 14 . 6 + 0 Vemos que aunque los números son bastante mayores que los anteriores el número de operaciones necesarias para el cálculo es el mismo. es el número. con números más grandes en este caso. 1 + 5949 • 19185 = 5949 . recíproco o inversa de un número x. Concluyendo. 3 + 1338 • 5949 = 1338 . que multiplicado por x da 1 como resultado. 14 . el último divisor que no es nulo. tenemos que. 4 + 21 • 144 = 21 . mcd(25134. Cálculo de mcd(25134. 4 + 597 • 1338 = 597 . 2 + 144 • 597 = 144 . 19185) = 3. denotado como 1⁄x ó x −1. 1 + 21 • 77 = 21 . 448) = 7.• 175 = 98 . 1 + 3* • 18 = 3 . 2 + 0 Como marca el *. 6 + 18 • 21 = 18 . 1 + 77 • 98 = 77 . como marca el *.19185) Vamos con el segundo ejemplo. Un ejemplo de un algoritmo que realice esta función 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. 1 + 7* • 14 = 7 . Expresamos los resultados parciales de la misma forma que en el ejemplo anterior: • 25134 = 19185 .

se puede empezar con un número y (una primera aproximación). Para obtener una aproximación del inverso multiplicativo de x. convirtiéndola en dependiente. El inverso de un número real también es real. Es equivalente a mn ≡ 1 (mod p) El multiplicador inverso de n módulo p existe si y sólo si n y p son coprimos. se puede definir la operación de división entre n módulo p mediante la multiplicación por el inverso. Todo número complejo. y el de un número racional también es racional. Una vez que la variación entre dos iteraciones sucesivas de y se haga lo suficientemente pequeña (y se mantenga pequeña). o bien • Si tenemos X su inverso multiplicativo es 1/X. El 0 no tiene inverso multiplicativo. y reemplazar y por 2y-xy2. • La inversa de una función es la resultante de despejar la variable independiente. empleando únicamente la multiplicación y la resta. Es decir: • Si tenemos Y/X su inverso multiplicativo es X/Y. • La inversa de una matriz es otra matriz. salvo el 0. Gráficamente es un trazado paralelo a la recta diagonal y = x. si MCD(n. tiene un inverso que es un número complejo. El inverso multiplicativo es aplicable a distintos tipos de objetos matemáticos. es decir. p)=1. 15 . denominada matriz inversa. y será una aproximación del inverso de x. Si existe el multiplicador modular inverso de n módulo p. que al multiplicarse por la original es igual a la matriz identidad.El multiplicador modular inverso de un entero n módulo 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 módulo p.

Sin embargo. φ (ni) = (pi − 1)(qi − 1). Veamos en detalle el sistema RSA: Generación de las claves: 1. Debemos aclarar que este concepto y sus características son aun anteriores a la utilización de elementos informáticos. el inverso multiplicativo de x también está definido: es el número a tal que (a × x) mod n = 1. El sistema criptográfico RSA fue propuesto por Rivest. Un algoritmo empleado para el cálculo de inversos modulares es el Algoritmo extendido de Euclides. 3. Como una simple definición podemos entender que la Criptografía aparece ligada a la necesidad de mantener secretas cierta información que necesitamos operar. 16 . Calcula ni = piqi y la función de Euler de ni.4 Aplicaciones numéricas. debe existir un número racional r tal que 0 < r < |x|.RSA. Uno de los nombres que identificamos con esta rama de la ciencia es Alan Turing y sus logros para descifrar los códigos durante la Segunda Guerra Mundial. qi 1. • En las Aritmética Modular. Shamir y Adleman) en 1978 y es el primer criptosistema de clave pública construido.8. • En las Matemáticas Constructivas. Además. La (probable) función de una vía en que se apoya es el producto de números enteros. para que un número real x tenga inverso. Por ejemplo. ya que la factorización se considera un problema intratable. Cada usuario i del sistema elige una pareja de números primos pi. En la actualidad el objetivo que se espera alcanzar es garantizar la confidencialidad de la información enviada por medios informáticos y electrónicos. no es suficiente que sea falso que x = 0. El algoritmo RSA se asocia a los conceptos criptográficos que mencionamos en el punto 3.1. este inverso multiplicativo sólo existe si a y n son primos entre sí. el inverso de 3 módulo 11 es 4.2. porque es la solución de (3 × x) mod 11 = 1. A hoy sigue siendo el más utilizado.

φ (ni)) = 1 y calcula su inverso modular di = ei−1 mod φ (ni). los primos en cuestión deben satisfacer algunas condiciones suplementarias. 0 < C < ni se descifra mediante: Z/niZ Z/niZ C Cdi = C mod ni La descripción que hemos hecho contiene el método de transmitir un mensaje numérico. ei) y como su clave privada di. a hoy se estima que los primos seguros han de tener un mínimo de 100 dígitos. Digamos que las parejas de primos que evitan los métodos de factorización conocidos se llamarán primos seguros y notemos que. observemos que el método reposa en la certidumbre de que. 17 . Elige arbitrariamente ei.4. por ejemplo. ¿Qué hemos visto como puntos a destacar en este método? En primer lugar. Evidentemente esto no es verdad en general. 1. En general los métodos de factorización eficaces existentes imponen condiciones sobre el tipo de primos que se admiten. han de ser “grandes”. en general. claramente.3. es difícil factorizar un número que es producto de dos primos. este concepto es variable por cuanto métodos nuevos de factorización impondrán nuevas condiciones. 0 < ei < φ (ni). tal que mcd(ei. Algunas de las propiedades de un primo seguro son evidentes. Cifrado: Un mensaje M. Además de esta primera condición es necesario analizar las distintas etapas con el fin de asegurarnos que las operaciones que han de ser rápidas efectivamente lo son y que las que han de ser intratables también. 0 < M < ni se cifra mediante: Z/niZ Z/niZ M Mei = C mod ni Descifrado: Un mensaje cifrado C. Toma como clave pública (ni.1.

pero de menor tamaño.Algoritmos divide y vencerás. Veremos los conceptos de unos algoritmos conocidos como Divide y Vencerás.9. si el tamaño de la entrada es n. ejemplos: el cálculo de la factorial de un número. pero de menor tamaño. podemos hablar de simplificación. 18 . En primer lugar ha de plantearse el problema de forma que pueda ser descompuesto en k subproblemas del mismo tipo. El número k debe ser pequeño e independiente de la entrada determinada. también denominados casos base. La resolución de un problema mediante esta técnica consta fundamentalmente de los siguientes pasos: 1. Es decir. por ejemplo: en el caso particular de contener una sola llamada recursiva tendremos k = 1 Donde llegamos a este tipo de algoritmo. los cuales pueden considerarse como una filosofía para resolver problemas. 2. hemos de conseguir dividir el problema en k subproblemas (donde 1 ≤ k ≤ n). El hecho de que el tamaño de los subproblemas sea estrictamente menor que el tamaño original del problema nos garantiza la convergencia hacia los casos elementales. Ello naturalmente sugiere el uso de la recursión en las implementaciones de estos algoritmos. cada uno con una entrada de tamaño nk y donde 0 ≤ nk < n. En segundo lugar han de resolverse independientemente todos los subproblemas. También son algoritmos de simplificación el de búsqueda binaria en un vector o el que resuelve el problema del k-ésimo elemento. bien directamente si son elementales o bien de forma recursiva.3. Es una técnica para el diseño de algoritmos que consiste en resolver un problema a partir de la solución de subproblemas del mismo tipo. Si los subproblemas son todavía relativamente grandes se aplicará de nuevo esta técnica hasta alcanzar subproblemas lo suficientemente pequeños para ser solucionados directamente. A esta tarea se le conoce como división.

19 . pues esto influye de forma notable en la complejidad del algoritmo resultante.3. De lo contrario el tiempo de ejecución de estos algoritmos será exponencial. b) Sin embargo. Ahora veamos algunas características de los algoritmos Divide y Vencerás. En cuanto a la eficiencia hay que tener en también en consideración un factor importante durante el diseño del algoritmo: el número de subproblemas y su tamaño. además de la complejidad espacial que puede representar el uso de la pila de recursión. los diseños recursivos necesitan un mayor tiempo de ejecución que los iterativos. Desde un punto de vista de la eficiencia de los algoritmos Divide y Vencerás. Ahora bien. los algoritmos diseñados mediante la técnica de Divide y Vencerás van a heredar las ventajas e inconvenientes que la recursión plantea: a) Se obtiene un diseño simple. también en detrimento de la legibilidad del código resultante. aunque por contra. claro. es decir. tan sólo se puede considerar un algoritmo recursivo pero no clasificarlo como diseño Divide y Vencerás. Esta técnica está concebida para resolver problemas de manera eficiente y evidentemente este algoritmo no lo es dado que el tiempo de ejecución es exponencial. robusto y elegante. que no exista solapamiento entre ellos. el cual. que en definitiva determinan el número de subproblemas y su tamaño. Como ejemplo pensemos en el cálculo de la sucesión de Fibonacci. lo que da lugar a una mayor legibilidad y facilidad de depuración y mantenimiento del código obtenido. lo que conlleva menores tiempos de ejecución y menor complejidad espacial al no utilizar la pila de recursión. Anteriormente hablamos de los algoritmos de simplificación. por lo que sus tiempos de ejecución suelen ser muy buenos (normalmente de orden logarítmico o lineal). combinar las soluciones obtenidas en el paso anterior para construir la solución del problema original. puesto que en ellos suele poder eliminarse fácilmente la recursión mediante el uso de un bucle iterativo. es muy importante conseguir que los subproblemas sean independientes. Además pueden admitir una mejora adicional. Las diferencias surgen de los distintos valores que pueden tomar a y b. a pesar de ajustarse al esquema general y de tener sólo dos llamadas recursivas. Por último. por el hecho de usar un diseño recursivo. de los cuales podemos nombrar como ventajas el poder reducir el tamaño del problema en cada paso.

En caso contrario nos podemos encontrar con “anomalías de funcionamiento” como le ocurre al algoritmo de ordenación Quicksort. pero también vemos cómo el tiempo de ejecución de los mismos es del orden exponencial y por lo tanto inaplicable. frente a la buena complejidad. Éste es un representante claro de los algoritmos Divide y Vencerás. casi natural.10 Programación dinámica. frente a los algoritmos recursivos que pueden alcanzar esta complejidad en muchos casos.Lo importante es observar que en todos los casos la complejidad es de orden polinómico o polilogarítmico pero nunca exponencial. La programación dinámica resuelve los subprogramas una sola vez y guarda sus soluciones en una tabla para su futura utilización. 20 . y su caso peor aparece cuando existe un desequilibrio total en los subproblemas al descomponer el vector original en dos subvectores de tamaño 0 y n–1. 3. y una manera de resolver este problema es justamente con la aplicación de Programación Dinámica. O(nlogn). Hemos vistos que muchos algoritmos tienen una resolución recursiva. puesto que es importante que la división en subproblemas se haga de la forma más equilibrada posible. Como vimos en el tema referido a algoritmos de ordenación. que consigue cuando descompone el vector en dos subvectores de igual tamaño. en este caso su orden es O(n2). Otra consideración importante a la hora de diseñar algoritmos Divide y Vencerás es el reparto de la carga entre los subproblemas. La solución de problemas mediante esta técnica 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 también óptima”.

En grandes líneas. resuelve problemas combinando las soluciones de subproblemas. y combinan sus soluciones para obtener la solución del problema original.Para que un problema pueda ser abordado por esta técnica ha de cumplir dos condiciones: • La solución al problema ha de ser alcanzada a través de una secuencia de decisiones. pero la diferencia esencial entre el método greedy y el de la Programación 21 . 4. resuelven éstos recursivamente. ya que resuelve repetidamente sub-subproblemas comunes. De manera contraria. el enfoque que define la Programación Dinámica tiene también ciertos parecidos con el que propone la técnica greedy. Cálculo del valor de la solución óptima mediante una tabla en donde se almacenan soluciones a problemas parciales para reutilizar los cálculos. a veces mantenemos información adicional durante el punto 3 para facilitar la construcción de una solución óptima. Planteamiento de la solución como una sucesión de decisiones y verificación de que ésta cumple el principio de óptimo. Por otro lado. los algoritmos Divide y Vencerás particionan el problema en subproblemas independientes. Vemos así que la Programación Dinámica. En este contexto. salvando su solución en una tabla de cara a evitar el trabajo de recalcular la solución cada vez que se encuentra ese sub-subproblema. es decir. cuando los subproblemas comparten sub-subproblemas. Cuando se realiza el punto 4. el diseño de un algoritmo de Programación Dinámica consta de los siguientes pasos: 1. 3. la Programación Dinámica es aplicable cuando los subproblemas no son independientes. 2. Un algoritmo de Programación Dinámica resuelve cada sub-subproblema sólo una vez. igual que la técnica Divide y Vencerás. • Dicha secuencia de decisiones ha de cumplir el principio de óptimo. un algoritmo Divide y Vencerás hace más trabajo del necesario. Definición recursiva de la solución. Construcción de la solución óptima haciendo uso de la información contenida en la tabla anterior. una en cada etapa. Como vimos anteriormente. Las ítems 1-3 constituyen la base de la solución de Programación Dinámica para un cierto problema.

evitando la enumeración de algunas sucesiones que posiblemente nunca podrán ser optimales. es decir. y entonces tomar la mejor respecto al criterio que se esté usando como objetivo.Dinámica es que en el primero siempre se generaba sólo una sucesión de decisiones. en lo que se refiere a similitudes. Un ejemplo que podemos mencionar es resolver la serie de Fibonacci pero no de manera recursiva como la vimos anteriormente. Pensemos por ejemplo en el problema del camino mínimo. ¿Cuál de los vértices en A debe ser el segundo vértice del camino? No hay forma de tomar esa decisión en ese momento y garantizar que las decisiones futuras producirán una solución optimal. Por último. lo que se hace es enumerar todas esas sucesiones. sea A el conjunto de vértices adyacentes desde i. otra forma de resolver problemas en los que no es posible conseguir una sucesión de decisiones que. sino aplicando los conceptos de programación dinámica: Proc otrofibonacci(n: cardinal):cardinal Var i.y:cardinal Inicio Si (n>1) Entonces retorna = 1 SiNo x= 1 y= 1 para(i=2 hasta n) hacer suma=x + y 22 . Sin embargo las sucesiones que contengan subsucesiones suboptimales no pueden ser optimales (si se verifica el Principio de Optimalidad). y por tanto no se generarán. formen una sucesión optimal.suma. Según esa metodología. a menudo. etapa por etapa. es intentarlo sobre todas las posibles sucesiones de decisiones. reduce drásticamente la cantidad de enumeraciones que hay que hacer. Si queremos encontrar el camino de longitud mínima entre el vértice i y el j.x. entonces hay dn posibles sucesiones de decisiones). mientras que en Programación Dinámica pueden generarse muchas sucesiones de decisiones. los algoritmos de Programación Dinámica suelen tener eficiencia polinomial. lo que comúnmente se llama enfoque de la fuerza bruta. De hecho mientras que el número total de sucesiones de decisión diferentes es exponencial en el número de decisiones (si hay d elecciones para cada una de las n decisiones. La Programación Dinámica haciendo uso explícito del Principio de Optimalidad de Bellman.

A menudo dicho grafo se 23 .Algoritmos de vuelta atrás. que se irá creando según avance el recorrido de la búsqueda. sistemática y organizada sobre el espacio de búsqueda del problema. aplicable a problemas de optimización. pero debemos evitar que el tratar de obtener una complejidad temporal de orden polinómico conduzca a una complejidad espacial demasiado elevada La Programación Dinámica se adapta a problemas de carácter secuencial. juegos. Se llaman algoritmos de vuelta atrás. es decir. sino de forma implícita. El retroceso o vuelta atrás es una técnica de resolución de problemas que realiza una búsqueda exhaustiva. búsquedas entre otros. porque en el caso de no encontrar una solución a una subtarea se retrocede a la subtarea anterior y se prueba otro camino diferente a los probados anteriormente.11. y= x x= suma fin para fin Si fin proc En general. los algoritmos obtenidos mediante la aplicación de esta técnica consiguen tener complejidades (espacio y tiempo) bastante razonables. por ejemplo: • Búsqueda de caminos más cortos entre dos puntos • Planificación de tareas • Gestión de recursos • Gestión de stock 3. siendo cada subtarea un nodo del grafo. Estos algoritmos se asemejan al recorrido en profundidad dentro de un grafo. El caso es que el grafo no está definido de forma explícita (como lista o matriz de adyacencia).

sus nodos. para el cálculo de expresiones regulares o para tareas de reconocimiento de texto y de sintaxis de lenguajes regulares. es imposible llegar a una misma solución partiendo de dos subtareas distintas. Los problemas que manejan los algoritmos exhaustivos. ya que trata de recorrer todas las posibles soluciones y encontrar la más apropiada para cada caso o las soluciones que satisfacen una condición. por ejemplo. esta técnica de resolución es usada en muchos ámbitos de la programación. Vuelta Atrás hace un recorrido en profundidad del espacio de búsqueda partiendo de la raíz. se observa. Por ello. se caracterizan por: a. El recorrido en profundidad regresa sobre sus pasos. Esta técnica es usada en diversos lenguajes de programación como ser Planner o Prolog y da soporte a muchos algoritmos en inteligencia artificial. con lo que puede ser aplicada en la mayoría de problemas. retrocede. Además.comporta como un árbol. que no contiene ciclos. Se trata generalmente de problemas de optimización. no implica su elección definitiva. éste la encuentra. La solución es expresable en forma de una secuencia de decisiones. es decir. El esquema general de solución presenta los siguientes pasos: a. Existe una función. Este tipo de metodología es muy genérica. con o sin restricciones. que éstos tratan de almacenar los resultados para no tener que 24 . viola o no las restricciones. b. d. cada vez que encuentra un camino que se ha acabado o por el que no puede continuar. si son comparados con algoritmos de programación dinámica. En un recorrido en profundidad o en anchura sobre un espacio de búsqueda se conoce de antemano el orden en que se van a generar o recorrer. Existe una función denominada factible que permite averiguar si en una secuencia de decisiones. la elección de un sucesor en una etapa. c. c. Este tipo de estrategias tienen una premisa fundamental que afirma que si un problema tiene solución. la solución en curso. con lo que es probable que se vuelva a referenciar en un futuro. b. denominada solución. En este tipo de algoritmo. que permite determinar si una secuencia de decisiones factible es solución al problema planteado.

xn) unidimensional. . mientras que en vuelta atrás no podemos hacer esto. debido a que en alguna etapa.. Es decir. ya que a veces éstos son el único camino posible para resolver determinados problemas. por todos los valores en cada elemento. esto es. es decir. Si bien. En general para poder aplicar vuelta atrás. Este coste lo podemos expresar como →p(n).Nodo problema: Que es en el que hasta el momento encaja todo y se puede encontrar una solución.recalcularlos. la solución construida no se puede completar. 25 . Además de esto tenemos que identificar los tipos de nodos con los que se va a trabajar: .x2. es cierto que se pueden considerar otros métodos algorítmicos.. .Nodo fracaso: Que es un nodo en el que el recorrido no tiene éxito. El funcionamiento del algoritmo. ya que el número de casos es muy elevado. la solución al problema debe poder expresarse como una secuencia ordenada (x1. 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. Para ello tenemos que determinar cuáles serán los valores posibles que podremos ir introduciendo en ésta. consiste en pasar por todos las posibles soluciones de forma metódica y ordenada. Este tipo de algoritmos no son eficientes. ejemplo programación dinámica. ya que generalmente será polinómico. • El trabajo realizado en cada nodo. donde los xi representan elecciones de algún conjunto finito Ci.Nodo solución: El cual se establece cuando el recorrido del árbol tiene éxito (hoja del árbol). ya que se basan en el método de prueba y error. el coste de la función de solución completa o ver si la solución es aceptable hasta el momento. aunque de forma general este tipo de algoritmos son muy ineficientes. . para realizar posibles optimizaciones de algoritmos vuelta atrás.. Ahora bien hay que decir que la eficiencia depende de: • El número de nodos del árbol de búsqueda que se visitan para conseguir la solución →v(n). y en muchas ocasiones para conseguir solución se tiene que recorrer todo el árbol de búsqueda o gran parte de él.

si (no exitoso) entonces cancelar registro finsi fin si fin si fin hacer fin 4. Para conseguir mejoras en los costes se suele recurrir a marcar los caminos ya recorridos que no llegan a ninguna solución como nodo fracaso o camino fracaso. Mientras (exitosa o no mas candidatos) hacer seleccionar siguiente.Introducción. este coste será exponencial en el peor caso. veamos un esquema de ejemplo: algoritmo Vuelta Atras INICIO inicializar selección de candidatos. • El coste en general será: O(p(n)v(n)). la información debe tener algún tipo de ordenamiento.1. También se podrían crear funciones acotadoras para que reduzcan mucho el número de nodos generados. Aunque normalmente los costes más bajos que se pueden conseguir son el orden de O(p(n)2n). tanto en el ámbito de almacenamiento interno (arrays) como externo (archivos). Aun así la gran ventaja que tienen es que si hay solución la encontrarán. Se puede concluir que los algoritmos de vuelta atrás no son todo lo eficientes que deberían. 26 . si (solución incompleta) entonces ensaya. si (aceptable) entonces registrarlo. si éstas sólo dejaran un nodo el algoritmo se convertiría en voraz y su coste bajaría a O(p(n)n). Para conseguir mayor eficiencia en el tratamiento de la información. y se deben utilizar para resolver parte de otros problemas o problemas reducidos.

refiriéndonos a números . refiriéndonos a caracteres Los procesos de ordenamiento pueden ser: 1.Ordenamiento o clasificación es la operación que permite organizar un conjunto de datos en un orden determinado: .Externos: clasificamos un registro de un archivo almacenado en un dispositivo externo más lento.Alfabético. 2.Internos: clasificamos un array o vector. La complejidad de un algoritmo es la cantidad de trabajo realizado y se mide por el número de operaciones básicas que se han llevado a cabo. el paso general es aumentar la longitud del segmento ordenado insertando el elemento siguiente X en el lugar adecuado.Ordenación por inserción y otras ordenaciones simples. esto se hace moviendo cada elemento del segmento ordenado a la derecha. Por lo cual podemos comenzar comparando los algoritmos que desarrollaremos en esta unidad. 27 . hasta que se encuentra un elemento < X. Se supone que se tiene un segmento inicial del array ordenado.Ascendente/Descendente.2. Se denomina así porque se realiza directamente en memoria con lo que el proceso es más rápido. 4.

el mayor número de comparaciones. El peor caso. el algoritmo funciona de la siguiente forma: 1) Comparamos A1 y A2 y los colocamos en el orden que deseemos.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. intercambiando sus posiciones si es necesario y repetir este proceso hasta que ya tengo todo el array ordenado. el mejor y el caso medio. Pasos del Algoritmo: Tenemos almacenado en memoria un array A de números. cuando cada elemento examinado es menor que el resto y esto ocurrirá cuando el array esté ordenado en orden contrario al que deseamos. es decir. En el caso medio las comparaciones que se harían serían: para cada elemento I examinando como mínimo realizo una comparación en el caso que sea mayor que el resto y como máximo N-I. J I. Método de la burbuja o intercambio Su filosofía es ir comparando los elementos del array 2 a 2. es decir. 28 . Este primer paso implica n-1 comparaciones y después de este paso el elemento mayor del array se posiciona hacia la última posición. Comparamos A2 y A3 y hacemos lo mismo. se daría cuando el bucle interno tiene que hacer el mayor número de veces (I-1) siendo I el valor del núcleo externo. Algoritmo INSERCION desde (I=2 hasta N) hacer Ordenamiento por X L(I) Inserción. realizamos esta operación hasta conseguir A n-1 con An. analizamos el peor.

es decir. Veamos un caso práctico: 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. es decir. terminará al comparar A n-2 con A n-1 y obtendremos el segundo elemento mayor en A n-1. pero con una ordenación menos. 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 . MÉTODO 1 El algoritmo menos eficiente sería aquel que por cada paso realizase N-1 comparaciones.2) Repetir el primer paso. que no tuviese en cuenta que en cada paso ya queda colocado en su posición un elemento. 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 compararíamos A 1 y A 2 solamente.

+2+1=N(N-1)/2 MÉTODO 3 Finalmente.. X(j+1) AUX fin_si fin_desde fin_desde fin MÉTODO 2 Podemos introducir una mejora del método anterior teniendo en cuenta al hecho de que ya queda colocado un elemento en su posición correcta. Para aprovechar esta ventaja utilizamos la variable MARCA que nos indicará cuando tras la ejecución de un paso no se ha producido ningún intercambio lo que indicará que el array está ordenado. la última mejora la podemos introducir teniendo en cuenta que después de un paso anterior al último puede que ya tengamos el array ordenado.. es decir. Estando en un paso I bastará que realice N-I comparaciones. EJERCICIO Algoritmo BURBUJA_3 inicio 30 . que puede que no siempre sea necesario llegar al paso N-1. 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 fórmula: Σ(N-I)=(N-I)+(N-2)+.

sólo se compara con algunos de la izquierda. Se trata de saltar más de una posición para hacer la comparación. MARCA <-.3. Mientras que en el de inserción por cada elemento siempre comparo con todos los anteriores a la izquierda.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. El salto comienza siendo de N+1/2 elementos donde N es el tamaño del array y se va reduciendo a la mitad en cada iteración.Shellsort Fue inventado por Donald Shell y es una mejora al método de inserción. ahora se trata de ahorrar tiempo y en vez de comparar de uno en uno. hasta que el valor del salto sea uno: EJERCICIO Ordenamiento Algoritmo SHELL Shellsort inicio Mejora su eficiencia si mientras ((SALTO > 0)) hacer los números 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 .FALSO I 1 mientras ((MARCA=FALSO) y (I< N-1)) hacer MARCA <--.

para lo cual basta con restarle 1 al paso si candidato para resolver éste es par. Es un algoritmo bastante simple pero también debemos indicar que su análisis es difícil y requiere respuestas a varios problemas matemáticos. están ordenados. si lo comparamos con otros cuya complejidad es O (N log N). se mantiene h-ordenado. Esto permite que a medida que el paso se va haciendo más pequeño. prácticamente se lleva a cabo en una sola pasada (O(n) ). 32 . dentro del arreglo. se puede demostrar que si un arreglo h-ordenado es transformado a k-ordenado (con k<h). 100. SHELLSORT. El número de comparaciones efectuado por Shellsort es una función de las secuencias de incremento o distancias que utiliza. Tenemos otros algoritmos más eficientes para ordenamiento de arreglos que el Shellsort. 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. pero también debemos indicar que es un algoritmo fácil de programar. dado todo el trabajo realizado en las iteraciones previas.000 elementos. problemas de ordenamiento en Con esta pequeña modificación se reduce el tiempo promedio de ejecución conjuntos de menos de y su varianza. Este algoritmo es un claro ejemplo de cómo una pequeña modificación a un algoritmo lento lo puede convertir en uno bastante más rápido. los elementos ya están bastante ordenados globalmente y al realizar la última etapa con paso h=1 (que es una ordenación por Inserción). 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 números impares.

600 y 64. aún no se sabe con certeza cuál es la eficiencia real del algoritmo. 33 . el estudio demuestra empíricamente que algunas series dependientes del tamaño del arreglo reducen el tiempo de ejecución del algoritmo con respecto a las series clásicas. Valor particular: 64. de la Universidad de Chile. realizó el siguiente informe sobre pruebas realizadas en el método de ordenamiento Shellsort Logró probar el rendimiento de la serie: hi = h i+1 / 2.4 Partiendo de: ht = n / 4. Se identificaron dos situaciones en el estudio: • Las diferencias en el tiempo utilizado entre cantidades de elementos muy similares eran grandes. y es muy posible que existan series de pasos que reduzcan los tiempos de ejecución obtenidos en los tests descriptos. • El algoritmo se comportaba estrepitosamente mal con arreglos de exactamente 64. Sin embargo.700 elementos.700 El profesor Benjamín Bustos.8 Terminando cuando: h1 = 1 Se partió de un valor inicial de 100 y se llevo hasta un tamaño de 100000. es decir. un orden de magnitud de diferencia con respecto a arreglos de 64. en incrementos de 100.Además.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 número de operaciones O (n2) Si los elementos están distribuidos originalmente en el arreglo de tal manera que la mitad mayor se encuentre en celdas pares y la mitad menor en celdas impares.

continúan estando todos los elementos mayores en las celdas pares y los menores en las celdas impares. cuando se ha llegado a la última iteración. utilizaremos el símbolo “merge”: Ahora bien. lo que degradaba notablemente el rendimiento del algoritmo. De este modo en el último paso se deben realizar una gran cantidad de comparaciones. Realizando la pequeña optimización de restarle uno al paso si éste resulta par.4 partiendo con :ht = 64700 / 4. Todas las aproximaciones de: hi = h i+1 / 2. se obtiene un algoritmo mucho más homogéneo y eficiente en su comportamiento. con el único incremento impar igual a 1. Fue desarrollado por John Van Neumann en 1945. Efectivamente esto era lo que ocurría con la serie de pasos estudiada. Este clase de algoritmo es un típico uso del concepto “divide y vencerás”. las condiciones que debemos considerar son: • Si el número de elementos está entre 0 y 1 el algoritmo termina.8 dan números pares. • Se mezclan las dos mitades ordenadas en un vector ordenado. 4.4. 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. Durante el desarrollo de este ítem. Siendo el único valor entre 100 y 100000 en incrementos de 100 en el que ocurre esta particularidad. • Se invoca recursivamente al algoritmo.Dado que todos los incrementos son pares exceptuando el último.Mergesort. El tiempo que demanda un algoritmo del tipo MERGESORT está definido por la recurrencia: 34 .

Es el método de ordenación más rápido. Nosotros tomaremos como pivote el primer elemento del array. con lo que el pivote quedará en la posición que le corresponde en la lista ordenada.Quicksort.Ls.5. Se lo conoce también como Ordenamiento por Partición. PASOS Se elige arbitrariamente un elemento de la lista al que llamaremos pivote.T(n) = 1 SI n = 1 T(n) = 2T(n/2)+ El algoritmo para realizar el merge tiene las siguientes características: • El orden del algoritmo es n log n. los más grandes.L:array) 35 .N]) var PIVOTE:entero inicio si (Li < Ls) entonces SUBLISTAS (Li. • 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. tanto en el peor como en el mejor caso.Ls. y otra los más grandes.PIVOTE.L:array) QUICKSORT (Li.PIVOTE-1.. EJERCICIO Procedimiento QUICKSORT(Li.Ls:entero. Se basa en dividir la lista inicial en otras más pequeñas que luego se ordenarán recursivamente y que contendrá una. los elementos más pequeños.L:array[1.L:array) QUICKSORT (PIVOTE+1. fue creado por Charles Antony Hoare en 1960. El objetivo final es que a la izquierda del pivote queden colocados los elementos más pequeños que él y a la derecha.

y los mayores a la pasadas derecha. fin_si fin_quicksort Procedimiento SUBLISTAS (FIRST. con el objeto de colocar los elementos más elementos en 20 pequeños que el pivote a la izquierda del mismo. dado que una mala elección pasadas puede atentar contra la eficiencia del método.000 de Luego recorremos toda la lista.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.024 elementos en 10 de los puntos clave es la elección del pivote. 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..000. Otra de 1.A) escribir A fin Resumiendo Como vimos el proceso de Quicksort consiste en dividir la lista original en Características dos listas más pequeñas.N.PIV:entero.L:array) var X.N] inicio leer A QUICKSORT(1. 36 .LAST.

Podemos: elegir el Luego de lo cual debemos aplicar el concepto de recursividad: central. etc. aplicando nuevamente lo central. Si consideramos computadoras con más de un procesador. operaciones y cálculos mínimos y máximos que realiza por lo que podemos estimar una complejidad en cada uno de ellos. Culminada esta etapa tenemos: • Un grupo de elementos menores que el pivote. PIVOTE • El pivote. ellos. En los equipos con varios procesadores. por definición. La elección del PIVOTE es un factor de éxito • Otro grupo compuesto por números mayores a él. dado la posibilidad de sumar la memoria RAM de cada procesador. donde se puede optimizar el uso de los recursos. (depende principalmente de la elección del pivote) Complejidad Cada algoritmo de ordenamiento que hemos visto ahora tiene. es lograr recorrer simultáneamente le lista en ambas direcciones e intercalando entre si cada par de elementos que se encuentran a cada lado. Otros elementos muy importantes son: • El tamaño de las sublistas es cada vez menor. Una forma de hacer aun más eficiente esta tarea. la mediana de indicado más arriba en forma recursiva tenemos resuelto el problema”. • El tiempo de procesamiento es cada vez menor • En cada nivel el tamaño de las sublistas es la mitad del anterior • Hace un eficiente uso de recursos QUICKSORT Tiempo de Ejecución Promedio = O(N log N) Peor caso= O(N2). comparar entre ambos extremos y el “si volvemos a dividir a cada uno de esos grupos. que corresponde a cada método de ordenamiento: 37 . estamos teniendo una muy clara aplicación del concepto de paralelización de procesos.

Lo ideal es poder utilizar el QUICKSORT como base y realizarle los ajustes necesarios. por lo cual en este caso sólo necesitaríamos una. Esto es debido principalmente a que debemos “encontrar” un elemento dentro de un arreglo y no tenemos la complejidad del ordenar al resto. es el factor de éxito de este proceso. Como vimos anteriormente.4. la elección del pivote.7. Me pareció muy importante terminar de hablar de ordenamiento. Además podemos entender que en el peor de los casos de la SELECCIÓN RAPIDA estaríamos con las características del QUICKSORT. comentando la forma como los principales buscadores de la web tienen pensado los trabajos de búsqueda y ordenamiento de la información.6. por medio de algoritmos muy especializados y tal vez poco conocidos.Otros algoritmos. el QUICKSORT hace uso de dos llamadas recursivas. Por lo cual coincidiendo con los estudios de Sergio Martin Ballesteros en esta parte del trabajo intento ejemplificar las características de los principales buscadores de manera genérica y sin puntualizar en los 38 .Selección Rápida. Nuevamente. Una característica especial es la SELECCIÓN. la cual tiene una complejidad tal vez menor que el ordenamiento. 4.

lo cual además se acaba de complicar al tener en cuenta que tanto los conceptos a valorar como la importancia que se les da. algunos de los conceptos incluso no se valoran directamente.) 6.Criterios internos 2. ya sea para mejorar la calidad de los resultados. ni tampoco la importancia real que se les otorga. pero debemos entender que cada uno de ellos utiliza a estos algoritmos como piezas principales para su trabajo. según más de cien conceptos a los que se otorga una importancia diferente dependiente del término que se valora. Criterios internos a la página web: A grandes rasgos. De este modo. no se conoce con seguridad la totalidad de los puntos que se valoran.Criterios externos Tanto los conceptos internos a la propia página web como los externos son importantes.. Como vimos anteriormente.. la información sobre sus características es tomada en base a su desenvolvimiento. como para evitar que se descubra el algoritmo exacto. Estructura que permita una fácil navegación 5. experimentan variaciones constantemente. sino que permiten que la página consiga una mejor valoración para otras. más que a la poca documentación que se tiene en la web. podemos abarcar también que un algoritmo es la fórmula de valoración de las páginas. Los conceptos se utilizan para valorar las páginas. entre ellos destacan: 1. Número de pantallas: (además pantallas más valoración) 2. se dividen en dos grandes familias: 1. Hay que saber qué es lo que se pretende con una página antes de definir qué estrategia o combinación de estrategias se aplicará.. 39 . De todas maneras..buscadores específicos que lo usan. consisten en todo aquello que se encuentra en la propia página. Tecnologías aplicadas: (evitar utilización abusiva de flash. Títulos de las pantallas: (las pantallas deben tener un título) 3. javascripts. Direcciones de las pantallas de acuerdo con el contenido: (url descriptivas). Redacción de los textos 4.

en vez de calcular la relevancia y pertinencia sólo en medidas como la densidad de una palabra clave dentro de un texto. simplemente votan a la página de destino. Ante todo. aun cuando algunos no tienen valor para los buscadores. más relevancia merece. Ahora veremos algunos de los algoritmos utilizados por los principales buscadores de la web. 40 . es el enlace de texto. lleva hacia la página web de destino. es necesario saber cómo deben ser dichos enlaces para optimizar su utilidad. Si bien. dándole más y más preferencia. PageRank es el algoritmo de posicionamiento utilizado por uno de los más grandes buscadores.GIF o bien . ganan posiciones por ser consideradas como más importantes por aquellos términos por los que están referidas. y por lo tanto aparecerá más arriba en las búsquedas relacionadas. así hasta más de 100 variables. Total links entrantes (links desde otros webs) Cuentan todos los enlaces. si hay muchas páginas que enlazan una página. según la que cuanto más enlaces tiene una página. El otro tipo de enlace. de la frecuencia relativa del término en la búsqueda en el texto. se basa en los enlaces entrantes a nuestra página. una vez que localiza las páginas pertinentes en su índice hace cálculos basados en el número de links externos. De este modo. las páginas destinatarias de enlaces. de la temática de las páginas enlazadas y del peso de las mismas. estas imágenes. Este tipo de enlace es interesante porque potencia la página de destino por el texto exacto del enlace. De un lado. que al cliquear encima. de las etiquetas meta. la explicación en este caso se limitará a aquellas que si que tienen. Por este motivo. Estos enlaces pueden realizarse de varias maneras. aún así. Pasamos a mostrar los más relevantes: Pagerank-1. existe la posibilidad de enlaces mediante imágenes (. internos.JPG). incrementando el valor de cara a los motores de búsqueda. además de también incrementar el valor de la página de destino por su propio contenido. si no contienen textos alternativos ni descripción.Criterios externos a la página web: Son los conceptos que los buscadores interpretan como derivados de la democracia de Internet. del texto de los enlaces. permitiendo potenciar exclusivamente aquel texto. los buscadores interpretan que cada página web emite su voto para aquella a la que va destinado el enlace.

es que debe ser importante en el ámbito del tema que trata la primera página web. Pagerank-9. Cero links a nosotros Para empezar no hacen falta. es un factor muy importante. Su lógica es la siguiente: • Si una página web enlaza con otra página. Pagerank-3. Pagerank-8. Cuantos menos tenga mejor. da más peso al link que nos enlaza. cuanto mejor posicionada está aquella. Palabra clave en el enlace Más conocido como bombing. • Y si la recomienda. al menos 1 enlace. Cuanto más relacionada la categoría con nuestras palabras clave. Título html en la página que nos enlaza. el buscador analiza el número de enlaces que provienen de otras páginas web. aunque si hay un alto número de enlaces. Link de sitio de "experto" (webs con listas de recursos de una misma temática). mejor para nosotros. Estar incluido en una categoría de DMOZ. Links entrantes de webs con PR4 o mayores. mejor. Pagerank-5. Cuanto más arriba en el código html mejor. Pasamos a mostrar los factores que tiene en cuenta el Algoritmo de posicionamiento PageRank para posicionar de forma negativa las páginas. no importa (bombing). 41 . Pagerank-4. vienen de fuentes reputadas sobre la misma temática de nuestras palabras claves. Si coinciden con las nuestras.Pagerank-2. Densidad de palabras clave en la página que nos enlaza. PageRank negativo1. Cuantos mayores es el PR de la web que nos enlaza. Número de enlaces externos en la página que nos enlaza (no del sitio web). Posición del link en la página que nos enlaza. es que la está recomendando. Links entrantes de webs con PR4 o mayores. Si coincide con el nuestro. pero para permanecer en la base de datos del buscador. PageRank negativo2. Pagerank-10. mejor. Algunos buscadores penalizan esta técnica que consiste en servir páginas distintas según quien las solicite. Mejor si es de la misma temática que la nuestra. mejor para nosotros. o a los robots unas y a los usuarios otras. Estos enlaces son muy importantes. Pagerank-6. Pagerank-7. Para determinar el PageRank. Temática de la página que nos enlaza. cuanto mejor posicionada está aquella. Cloaking (ocultar determinada información).

Estos criterios son únicamente una opinión de personal. Links desde servidores problemáticos (porno.) Problemático en principio. hace muy posible que aparezcamos en muchas búsquedas relacionadas y variadas con las keywords que tengan una alta densidad. Webrank-3. Sin embargo. puede bloquear esa IP. la experiencia de varias personas que hemos experimentado con los dos algoritmos de posicionamiento nos hace pensar que esto no es del todo cierto. etc. etiquetas meta. Algoritmos de posicionamiento y Algoritmos y posicionamiento daría resultados distintos. Webrank-6. dado que estos Algoritmos de posicionamiento y ordenamiento siguen siendo aún bastante desconocidos. Las palabras clave o Keyword en la URL tienen un mayor peso. La principal diferencia con PageRank es que no es estricto a la hora de la repetición de KeyWords en él. como en el título. Es importante darse de alta en determinados directorios. Otro elemento a tener en cuenta es el denominado Spam on the page. Es importante ser consciente que este buscador no omite términos en las búsquedas. Este buscador da una mayor relevancia a valores on the page que el PageRank Webrank-4. Consultas automáticas al buscador.PageRank negativo3. es decir. en teoría. PageRank negativo4. Más bien tiene en cuenta la popularidad del sitio medida en las personas que utilizan su barra para acceder al mismo. penalizados. El algoritmo de posicionamiento WebRank . Webrank-2. sobre todo cuanto más a la izquierda se encuentren. La densidad de las palabras clave es fundamental para obtener un buen resultado en este buscador. Otro algoritmo de ordenamiento de buscadores es WebRank. funciona de forma similar al algoritmo de posicionamiento PageRank. Se recomienda su uso tanto en el texto. Webrank-5. Este buscador le da gran importancia al título de la página. Seguidamente detallaré ciertos criterios que pueden ser positivos para ascender en este buscador. 42 . Si desde un servidor se realizan más de 100 consultas seguidas con la misma palabra clave. En concreto para la primera búsqueda a fecha 10 de abril de 2006 esta página aparece la primera situada y para la segunda la tercera. Webrank-7. etc. El hecho de repetir keywords con altas densidades y variando el texto. Webrank-1.

43 . Para determinar el PageRank. algunos buscadores analizan el número de enlaces que provienen de otras páginas web y su PageRank. Se habla de un algoritmo que determinará las webs que pueden ser semilla. y en otros foros se afirma que será uno de los principales buscadores. Estas páginas. pero en lugar de valorar la importancia de una recomendación en función del PageRank de la página que recomienda. lo hace a partir de una serie de páginas web que han sido consideradas importantes por humanos en lugar de por algoritmos.Webrank-8. transmitirán un Trust Rank de 99 a todas las webs a las que enlacen. Y estas últimas. A las páginas web que los humanos han determinado como importantes se las considera "web semilla" y a sus enlaces se les asigna un valor. con capacidad de sumar recursos humanos a esta tarea. Para ilustrarlo con un ejemplo: Supongamos que disponemos de una web semilla A. En ciertos foros especializados en posicionamiento en buscadores se afirma que serán las webs gubernamentales y de universidades las que empezarán a transmitir el Trust Rank semilla. Se desea que en las primeras posiciones de los resultados de búsqueda encontremos páginas de cierta relevancia y que estén siendo recomendadas por otras páginas que a su vez también tengan relevancia. A trasmitirá un valor de 100 Trust Rank a todas las webs a las que enlace. a su vez. Será ese valor el que se irá transmitiendo por toda la red. transmitirán un Trust Rank de 98 a las que ellas enlacen. Los cambios y actualizaciones en este buscador son más lentos que en PageRank. por otro algoritmo de posicionamiento denominado Trust Rank. ¿Quiénes serán las webs semilla? Al respecto hay discrepancias. Desde hace algún tiempo se viene especulando con la posibilidad de que se sustituya el actual algoritmo de posicionamiento PageRank. El Trust Rank parte de la misma base.

(2000). • Hernandez Roberto. Thomson Paraninfo. • Knuth Donald. • De Giusti (2001) “Algoritmos datos y programas”.C. Mc Graw Hill. Lee. “Fundamentos de algoritmo y programación. • Torres Carmen (1992).” México. • Sanchez Velásquez (1998) “Introducción al análisis de algoritmos”. • R. (2005) “Algoritmo y estructura de datos una perspectiva en C”. “Matemática Discreta y Algoritmos. (2000). Bibliografía Ampliatoria • Lage Fernando.A. www. REVERTE. M. Algoritmos.ar 44 . (2008) “Introducción a la programación”. “Algoritmo y Programación.” • Joyanes Aguilar. (2007).A. programación y estructuras de datos. “Introducción al diseño y análisis de algoritmos.” Nueva Librería. • Perez Berro.S. Adisson Weasley. Trillas. (1995) “Algoritmos fundamentales”. “Diseño y análisis de algoritmos”.” Nueva Librería.T. “Estructura de Datos en Java”. “Metodología de la Programación. (2001) “Estructuras de datos y algoritmos”.” • Joyanes Aguilar. • Cairo B.Bibliografía Básica Weiss.” • Perez Julio. Prentice Hall. Mc Graw Hill. Pearson. • Ramirez Felipe.uesiglo21.edu. “C. Alfaomega.