sábado, 24 de abril de 2010

Coloración de Grafos

Que es un grafo
Informalmente, un grafo es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones entre elementos de un conjunto.

Típicamente, un grafo se representa gráficamente como un conjunto de puntos (vértices o nodos) unidos por líneas (aristas).

Un grafo G es un par ordenado G = (V,E), donde:
• V es un conjunto de vértices o nodos, y
• E es un conjunto de arcos o aristas, que relacionan estos nodos.

La imagen es una representación del siguiente grafo:
• V:={1,2,3,4,5,6}
• E:={{1,2},{1,5},{2,3},{2,5},{3,4},{4,5},{4,6}}

Coloración de Grafos
El problema famoso relativo a los grafos: ¿Cuántos colores son necesarios para colorear un grafo?

Teorema de los cuatro colores
Otro problema famoso relativo a los grafos: ¿Cuántos colores son necesarios para dibujar un mapa político, con la condición obvia que dos países adyacentes no puedan tener el mismo color? Se supone que los países son de un solo pedazo, y que el mundo es esférico o plano. En un mundo en forma de toro; el teorema siguiente no es válido:

Cuatro colores son siempre suficientes para colorear un mapa.
El mapa siguiente muestra que tres colores no bastan: Si se empieza por el país central a y se esfuerza uno en utilizar el menor número de colores, entonces en la corona alrededor de a alternan dos colores. Llegando al país h se tiene que introducir un cuarto color. Lo mismo sucede en i si se emplea el mismo método.

La forma precisa de cada país no importa; lo único relevante es saber qué país toca a qué otro. Estos datos están incluidos en el grafo donde los vértices son los países y las aristas conectan los que justamente son adyacentes. Entonces la cuestión equivale a atribuir a cada vértice un color distinto del de sus vecinos.

Hemos visto que tres colores no son suficientes, y demostrar que con cinco siempre se llega, es bastante fácil. Pero el teorema de los cuatro colores no es nada obvio. Prueba de ello es que se han tenido que emplear ordenadores para acabar la demostración (se ha hecho un programa que permitió verificar una multitud de casos, lo que ahorró muchísimo tiempo a los matemáticos). Fue la primera vez que la comunidad matemática aceptó una demostración asistida por ordenador, lo que ha creado una fuerte polémica dentro de la comunidad matemática, llegando en algunos casos a plantearse la cuestión de que esta demostración y su aceptación es uno de los momentos que han generado una de las más terribles crisis en el mundo matemático.

Para una compresión mas clara ver el siguiente video.

miércoles, 21 de abril de 2010

Apuntadores en C++

Un apuntador es una variable cuyo valor es la dirección de memoria de otra variable. Se dice que un apuntador “apunta” a la variable cuyo valor se almacena a partir de la dirección de memoria que contiene el apuntador. Por ejemplo, si un apuntador p almacena la dirección de una variable x, se dice que “p apunta a x”.

Los apuntadores en C++ sirven para señalar objetos, y también para manipularlos.

Diferencia entre apuntador y variables
Declarar un apuntador no creará un objeto. Por ejemplo: int *entero; no crea un
Objeto de tipo "int" en memoria, sólo crea una variable que puede contener una dirección
de memoria. Se puede decir que existe físicamente la variable "entero", y también que
esta variable puede contener la dirección de un objeto de tipo "int".

Beneficios:
• Generar elementos bajo demanda, i.e. asignación dinámica de memoria
• Manipular y recorrer grandes espacios de memoria
• Generar estructuras de datos complejas
• Parámetros de entrada/salida para funciones, i.e. parámetros por referencia

Dificultades:
• Programación avanzada, caótica y/o complicada
• Programación más susceptible de errores muy difíciles de depurar
• Dificultad para leer y comprender código

Uso de los apuntadores
El operador unario o monódico & devuelve la dirección de memoria de una variable.

int *ptr;
ptr = &count /* Guarda la dirección de count en ptr */
/* El operador unario & regresa la dirección de una variable */

El operador de indirección o de referencia * devuelve el ``contenido de un objeto apuntado por un apuntador''.

int total;
total = *ptr;
/* El valor de la dirección guardada en ptr es asignada a total */

Ejemplo de uso de apuntadores.

int main()
{
int j;
int k;
int l;
int *pt1; /* Declara un apuntador entero */
int *pt2; /* Declara un apuntador entero */
float values[100];
float results[100];
float *pt3; /* Declara un apuntador flotante */
float *pt4; /* Declara un apuntador flotante */
j = 1;
k = 2;
pt1 = &j; /* pt1 contiene la dirección de la variable j */
pt2 = &k; /* pt2 contiene la dirección de la variable k */
pt3 = values;
/* pt3 contiene la dirección del primer elemento de values */
pt3 = &values[0];
/* Esto es equivalente a la afirmación de arriba */
return 0;
}


http://conclase.net/
http://www.fismat.umich.mx
http://eztigma.brinkster.net/apuntadores.html


viernes, 16 de abril de 2010

Algoritmos Recursivos

Un Algoritmo recursivo es aquel que durante su ejecución se llama o invoca directa o indirectamente a sí mismo. Esta invocación deberá de depender de al menos de una condición que cumpla el papel de ruptura para que el algoritmo no se ejecute en una iteración infinita lo cual podría ocasionar que el computador sufra de un desbordamiento de pila (Stact Overflow).

Un algoritmo recursivo deberá de constar de lo siguiente.

1- Al menos un caso base, es decir, que no vuelva a invocarse y que se ejecuta cuando se cumple cierta condición,
2- El caso general que es el que vuelve a invocar al algoritmo con un caso más pequeño que el caso base.

Ventas de la Recursividad
• Reducción notable del tamaño del algoritmo.
• A través de una recursividad puede resolver los problemas de una manera sencilla, mientras que con algoritmos iterativos la solución es muy grande y compleja.
• Se usa para dividir problemas complejos en subproblemas, existe una frase que dice “divide y vencerás”

Desventajas de la recursividad
• Es confusa y difícil de depurar.
• Es Peligrosa, ya que podría ocasionar que el algoritmo recursivo deje sin memoria al computador si no es bien controlado.

Un ejemplo comun de un algoritmo recursivo es el Fibonacci

static int fib (int n)
{
if ((n == 0) (n == 1))
return 1;
else
return fib(n-1) + fib(n-2);
}




Conclusión:
La recursividad es buena para la resolución de muchos problemas, pero deberá de considerarse aspectos como:
Deberá de hacerse un mayor análisis del problema para resolverlo de una forma recursiva.
Si el algoritmo está mal diseñado se podría producir resultados erróneos.

miércoles, 14 de abril de 2010

Acerca de mí...


Mi nombre es Jhony Castro Morán

Soy estudiante de Ingeniería en Informática en el Centro Universitario Tecnológico de UNITEC (CEUTEC). Una de mis principales metas es graduarme de Ingeniero y luego seguir con una maestría y posiblemente con una licenciatura en administración o contaduría ya que me gusta programar aplicaciones administrativas y la contabilidad es algo primordial en esta área. Trabajo en Gabriel Kafati S.A. (Café el Indio), en el departamento de Informática, como Programador. Me gustan el video juegos aunque no soy fanático de ellos. En mis tiempos libres (y que son pocos), me gusta ver televisión y pasar horas sentado frente a mi computador buscado como revolucionarme en el mundo de la informática.
Uno de mis libros favorito es El Perfume de Patrick Suskind y me gusta la película también.

Espero aprender en la clase ya que será de mucha importancia los conocimientos que aquí adquiera.