Sunteți pe pagina 1din 5

ALGORITMO DIJSTRA

• La idea principal es realizar una búsqueda a lo ancho “ponderada” empezando por el vértice
inicial f.
• De manera iterativa se construye un conjunto de vértices seleccionados S que se toman del
conjunto de vértices candidatos C según el menor peso (distancia) desde f.
• El algoritmo termina cuando no hay más vértices de G fuera del conjunto formado.
• El paradigma usado corresponde al método voraz, en el que se trata de optimizar una función
sobre una colección de objetos (menor peso).
• Se usa un vector d[v] para almacenar la distancia de v a f.
• El algoritmo de dijkstra determina la ruta más corta desde un nodo origen hacia los demás
nodos para ello es requerido como entrada un grafo cuyas aristas posean pesos. Algunas
consideraciones:
• Si los pesos de mis aristas son negativos no puedo usar el algoritmo de Dijsktra.

Como trabaja:
• Primero marcamos todos los vértices como no utilizados. El algoritmo parte de un vértice
origen que será ingresado, a partir de ese vértices evaluaremos sus adyacentes, como dijkstra
usa una técnica greedy – La técnica greedy utiliza el principio de que para que un camino sea
óptimo, todos los caminos que contiene también deben ser óptimos- entre todos los vértices
adyacentes, buscamos el que esté más cerca de nuestro punto origen, lo tomamos como punto
intermedio y vemos si podemos llegar más rápido a través de este vértice a los demás.
• Después escogemos al siguiente más cercano (con las distancias ya actualizadas) y repetimos el
proceso. Esto lo hacemos hasta que el vértice no utilizado más cercano sea nuestro destino. Al
proceso de actualizar las distancias tomando como punto intermedio al nuevo vértice se le
conoce como relajación (relaxation).
Ejemplo:
• Applet de tiempo mínimo de viaje en avión
• Determinación de la ruta más corta en tiempo del vuelo entre ciudades de EEUU.
• La diferencia horaria entre las ciudades puede llegar a cuatro horas.
• Fichero de vuelos entre ciudades.
• Se toma la hora GMT para el cálculo del tiempo de vuelo.

ALGORITMO DE BELLMAN-FORD
Al igual que el algoritmo de Dijkstra se encarga de encontrar en camino más corto en un grafo dirigido,
la diferencia entre el estos algoritmos, el de Dijkstra y el de Bellman-Ford es que el primero no resuelve
el problema en un tiempo menor pero requiere que los pesos de las aristas no sean negativos, salvo
que el grafo sea dirigido y sin ciclos, en cambio el de Bellman-Ford admite valores negativos, podríamos
decir que es una forma general.
Versiones del algoritmo de Bellman-Ford
1) Versión no optimizada para grafos con ciclos negativos

boolBellmanFord(Grafo G, nodo_origen s)
// inicializamos el grafo. Ponemos distancias a INFINITO menos el nodo origen que
// tiene distancia 0
for v ∈ V[G] do
distancia[v]=INFINITO
predecesor[v]=null
distancia[s]=0
// relajamos cada arista del grafo tantas veces como número de nodos -1 haya en el grafo
for i=1 to |V[G]|-1 do
for (u, v) ∈ E[G] do
if distancia[v]>distancia[u] + peso(u, v) then
distancia[v] = distancia[u] + peso (u, v)
predecesor[v] = u
// comprobamos si hay ciclos negativo
for (u, v) ∈ E[G] do
if distancia[v] > distancia[u] + peso(u, v) then
print ("Hay ciclonegativo")
return FALSE
return TRUE

2) Versión optimizada para grafos con aristas de peso negativo

boolBellmanFord_Optimizado(Grafo G, nodo_origen s)
// inicializamos el grafo. Ponemos distancias a INFINITO menos el nodo origen que
// tiene distancia 0. Para ello lo hacemos recorriéndonos todos los vértices del grafo
for v ∈ V[G] hacer
distancia[v]=INFINITO
padre[v]=null
distancia[s]=0
encolar(s, Q)
en_cola[s]=TRUE
while Q!=0 hacer
u = extraer(Q)
en_cola[u]=FALSE
// relajamos las aristas
for v ∈ady[u] hacer
if distancia[v]>distancia[u] + peso(u, v) entonces
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
ifen_cola[v]==FALSE entones
encolar(v, Q)
en_cola[v]=TRUE

Aplicaciones de encaminamiento
Una variante distribuida del Algoritmo del Bellman-Ford se usa en protocolos de encaminamiento
basados en vector de distancias, por ejemplo el Protocolo de encaminamiento de información (RIP). El
algoritmo es distribuido porque envuelve una serie de nodos (routers) dentro de un Sistema
autónomo(AS), un conjunto de redes y dispositivos router IP administrados típicamente por un
Proveedor de Servicio de Internet (ISP).
Se compone de los siguientes pasos:
I. Cada nodo calcula la distancia entre él mismo y todos los demás dentro de un AS y almacena
esta información en una tabla.
II. Cada nodo envía su tabla a todos los nodos vecinos.
III. Cuando un nodo recibe las tablas de distancias de sus vecinos, éste calcula la ruta más corta a
los demás nodos y actualiza su tabla para reflejar los cambios.
Las desventajas principales del algoritmo de Bellman-Ford:
 No escala bien
 Los cambios en la topología de red no se reflejan rápidamente ya que las actualizaciones se
distribuyen nodo por nodo.
 Contando hasta el infinito(si un fallo de enlace o nodo hace que un nodo sea inalcanzable
desde un conjunto de otros nodos, éstos pueden estar siempre aumentando gradualmente sus
cálculos de distancia a él, y mientras tanto puede haber bucles de enrutamiento)
Ejemplo del algoritmo del Bellaman-Ford

ALGORITMO DE HUFFMAN

El algoritmo de Huffman es un algoritmo de compresión de información, el cual está basado en la idea


de que algunos caracteres aparecen muchas más veces que otros. Es especialmente eficaz en archivos
de texto, donde más de la mitad de los caracteres difícilmente aparezcan alguna vez y también entre los
caracteres que aparecen, hay algunos que aparecen mucho más que otros.

Cada carácter se almacena en una secuencia de 8 bits. Este algoritmo se encarga de asignar códigos más
cortos a los caracteres que más se repiten, y códigos más largos a los que menos se repiten. De esta
manera a cada carácter se le asigna una longitud que puede variar entre 1 y 255 bits.

1. DESCRIPCIÓN

 El algoritmo consiste en la creación de un árbol binario que tiene cada uno de los símbolos por hoja,
y construido de tal forma que siguiendo desde la raíz a cada una de sus hojas se obtiene el código
Huffman asociado.

1. Se crean varios árboles, uno por cada uno de los símbolos del alfabeto, cada uno de los árboles
en un nodo sin hijos, y se etiqueta a cada uno con su símbolo asociado y su frecuencia de
aparición.
2. Se toman los dos árboles de menor frecuencia, y se unen
creando un nuevo árbol. La etiqueta de la raíz será la
suma de las frecuencias de las raíces de los dos árboles
que se unen, y cada uno de estos árboles será un hijo del
nuevo árbol. También se etiquetan las dos ramas del
nuevo árbol: con un 0 la de la izquierda, y con un 1 la de
la derecha.

3. Se repite el paso 2 hasta que sólo quede un árbol.

NOTA: Con este árbol se puede conocer el código asociado a un símbolo, así como obtener el símbolo
asociado a un determinado código.

 Para obtener el código asociado a un símbolo se debe proceder del siguiente modo:

1. Comenzar con un código vacío


2. Iniciar el recorrido del árbol en la hoja asociada al símbolo
3. Comenzar un recorrido del árbol hacia arriba
4. Cada vez que se suba un nivel, añadir al código la etiqueta de la rama que se ha recorrido
5. Tras llegar a la raíz, invertir el código
6. El resultado es el código Huffman deseado

 Para obtener un símbolo a partir de un código se debe hacer así:

1. Comenzar el recorrido del árbol en la raíz de


éste
2. Extraer el primer símbolo del código a
descodificar
3. Descender por la rama etiquetada con ese
símbolo
4. Volver al paso 2 hasta que se llegue a una
hoja, que será el símbolo asociado al código

NOTA: En la práctica, casi siempre se utiliza el árbol


para obtener todos los códigos de una sola vez; luego
se guardan en tablas y se descarta el árbol.

2. EJEMPLO DE USO

La tabla describe el alfabeto a codificar, junto con las


frecuencias de sus símbolos. En el gráfico se muestra el
árbol construido a partir de este alfabeto siguiendo el
algoritmo descrito.
Se puede ver con facilidad cuál es el código del símbolo E: subiendo
Símbolo Porcentaje de por el árbol se recorren ramas etiquetadas con 1, 1 y 0; por lo tanto,
Frecuencia el código es 011. Para obtener el código de D se recorren las
A 0,15 ramas 0, 1, 1 y 1, por lo que el código es 1110.
B 0,30 La operación inversa también es fácil de realizar: dado el
C 0,20 código 10 se recorren desde la raíz las ramas 1 y 0, obteniéndose el
símbolo C. Para descodificar 010 se recorren las ramas 0, 1 y 0,
D 0,05
obteniéndose el símbolo A.
E 0,15
F 0,05
G 0,10
3. Limitaciones

Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de
aparición de cada símbolo, y su eficiencia depende de lo próximas a las frecuencias reales que sean las
estimadas. Algunas implementaciones del algoritmo de Huffman son adaptativas, actualizando las
frecuencias de cada símbolo conforme recorre el texto. La eficiencia de la codificación de Huffman
también depende del balance que exista entre los hijos de cada nodo del árbol, siendo más eficiente
conforme menor sea la diferencia de frecuencias entre los dos hijos de cada nodo.
Ejemplos:

 La codificación binaria es un caso particular de la codificación de Huffman que ocurre cuando todos
los símbolos del alfabeto tienen la misma frecuencia. Se tiene pues que la codificación binaria es la
más eficiente para cualquier número de símbolos equiprobables.
 El algoritmo de Huffman aplicado sobre un alfabeto de dos símbolos asignará siempre un 1 al
primero y un 0 al segundo, independientemente de la frecuencia de aparición de dichos símbolos.
En este caso nunca se realiza compresión de los datos, mientras que otros algoritmos sí podrían
conseguirlo.
Una manera de resolver este problema consiste en agrupar los símbolos en palabras antes de ejecutar el
algoritmo. Por ejemplo, si se tiene la cadena de longitud 64:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB
El algoritmo de Huffman aplicado únicamente a los símbolos devuelve el código:
1111111111111111111111111111111111111111111111111111111111111110
También de longitud 64, sin embargo, si antes de utilizar el algoritmo, se agrupan los símbolos en las
palabras "AA", "AB" y "B" (que se codifican como 1, 01 y 00), el algoritmo devuelve la siguiente cadena:
111111111111111111111111111111101
El cual tiene longitud 32, la mitad que si no se hubiera agrupado. Si observa el árbol de Huffman, se
puede comprobar que la diferencia de frecuencias entre las ramas del árbol es menor que en el caso
anterior.
3. CÓDIGOS HUFFMAN N –ARIOS (APÉNDICE)

Es posible crear códigos de Huffman ternarios, cuaternarios, y, en general, n-arios. Para ello sólo es
necesario realizar dos modificaciones al algoritmo:

1. Los árboles a crear tendrán tantos hijos como símbolos posibles puedan aparecer en los
códigos Huffman. Por ejemplo, si es ternario se crearán árboles con tres hijos; si es
cuaternario, con cuatro.
2. Si se expresa como “s” el número de símbolos en el alfabeto a codificar, y “n” el número de
símbolos que aparecen en el código Huffman, entonces “s-1” debe ser múltiplo de “n-1”. Es
decir, para un código ternario, “s” debe valer 3, 5, 7, etc. Si esta condición no se cumple,
entonces se deben añadir símbolos "nulos" con frecuencia 0, que servirán sólo como relleno a
la hora de construir el árbol.

S-ar putea să vă placă și