sábado, 29 de mayo de 2010

Web 3.0


Es inegable para mi reconocer que una de las grandes razones por las que me interese en la Web fue la ciencia ficcion, con peliculas The Matrix y muchas mas que a finales de los 90 mostraba una muy interesante forma de ver las redes. fue en aquellos años cuando por primera vez y ayudado por un primo comence a construir una pequeña pagina web de Prueba, nuestra software y herramienta de desarrollo fue el bloc de notas de windows y asi en aquel archivo de texto comenzamos a escribir las etiquetas del HTML para crear nuestra pagina web que no tenia mas que unas cuantas imagenes y palabras.

puedo recordar (quizas hasta con nostalgia) sitios que formaron parte de la llamada web 1.0 y entre ellas puedo mencionar a , que resulta ser muy interesante porque aun conserva el mismo diseño desde 1996.

luego las paginas web tubieron mas movimiento en su presentacion a las imagenes Gif que presentaban una forma nueva para presentar los botones y menús. pero la llegada y apogeo del formato de video y animacion vectorial Flash, las cosas cambiaron mucho, comparado a la primer pagina html que diseñe, con flash alcance crear cosas mas interesantes como el sitio www.cafeguancasco.com que resulta ser el unico sitio web que eh creado que funciona aun en la web.

la primera vez que escuche hablar de la web 2.0 me parecio algo medio extraño, que sinceramente no me interesaba mucho, pero luego comence a ver el apogeo que tomaron sitios web como www.hi5.com, y comence a involucrarme de forma mas profundidad con sitios de la web 2.0 como taringa.net, vagos.es, youtube.com, y sin darme cuenta
me encontre muy involucrado con este nuevo concepto de la web 2.0, y debo decir que la web es un lugar mucho mas amigable ahora.

en cuanto a lo que deslumbra ser la web 3.0 debo decir que me encuentro muy entusiasmado, la mivilidad es algo que me ha llamado mucho la atencion y ahora mi HTC se ha vuelto una herramienta indispensable para mi trabajo. es necesario para mi mantenerme conectado, y los correos que me llegan a diario son sumamente indispensables para mi la labor que realizo, y ademas de revisar mi correo, puedo actualizar mi perfil de Facebook, twittear, leer las noticias de los periodicos que prefiero, y me encuentro muy entusiasmado por proyectos como el Sistema Operativo Chrome de google, y buscadores como Wolphram Alpha, pues todo esta cantidad de tecnologia semantica, de inteligencia artificial, y bases de datos, han mejorado significativa y de forma directa mi estilo de vida.

solo espero que Skynet tenga piedad de nosotros, o que las maquinas no nos utilizen como una bateria rayovac! pero por lo demas creo que la Web 3.0 es uno de los temas que mas a capturado mi interes en esta etapa de mi vida, y me agrada ver como los sitios web que frecuento, cambian hacias estas nuevas tendencias. y espero que pase mas de ser un elemento teorico a algo mas tangible, habra que ver que tanto afectara nuestro estilo de vida.

sábado, 22 de mayo de 2010

Estructuras de Datos XML



XML es un Lenguaje de Etiquetado Extensible muy simple, pero estricto que juega un papel fundamental en el intercambio de una gran variedad de datos. Es un lenguaje muy similar a HTML pero su función principal es describir datos y no mostrarlos como es el caso de HTML. XML es un formato que permite la lectura de datos a través de diferentes aplicaciones.

Las tecnologías XML son un conjunto de módulos que ofrecen servicios útiles a las demandas más frecuentes por parte de los usuarios. XML sirve para estructurar, almacenar e intercambiar información.

La tecnología XML busca dar solución al problema de expresar información estructurada de la manera más abstracta y reutilizable posible. Que la información sea estructurada quiere decir que se compone de partes bien definidas, y que esas partes se componen a su vez de otras partes. Entonces se tiene un árbol de pedazos de información. Ejemplos son un tema musical, que se compone de compases, que están formados a su vez con notas. Estas partes se llaman elementos, y se las señala mediante etiquetas.
Una etiqueta consiste en una marca hecha en el documento, que señala una porción de este como un elemento, un pedazo de información con un sentido claro y definido. Las etiquetas tienen la forma , donde nombre es el nombre del elemento que se está señalando.


en lo personal eh utilizado un poco de XML cuando eh programado algunas cosas sencillas en Adobe Flash, comparado al manejo en HTML presenta una gran mejora en cuanto al tratamiento Web

Dejo un video que deja lo mas basico para trabajar en XML:



Bibliografia:

http://www.youtube.com/watch?v=UqwGSo82cwU&feature=fvst
http://www.w3c.es/divulgacion/guiasbreves/tecnologiasxml
http://www.mitecnologico.com/Main/EstructuraDatosXml



sábado, 15 de mayo de 2010

Grafos dirigidos con Matrices de adyacencia


Grafos dirigidos.

G=(V,A) un grafo dirigido con |V|=n .Se define la matriz de adyacencia o booleana asociada a G como Bnxn con



Como se ve,se asocia cada fila y cada columna a un vértice y los elementos bi,j de la matriz son 1 si existe el arco (i,j) y 0 en caso contrario.
Grafos no dirigidos.

G=(V,A) un grafo no dirigido con |V|=n .Se define la matriz de adyacencia o booleana asociada a G como Bnxn con:



La matriz B es simetrica con 1 en las posiciones ij y ji si existe la arista (i,j).

EJEMPLO:






Si el grafo es etiquetado,entonces tanto bi,j como bi,j representan al coste o valor asociado al arco (i,j) y se suelen denominar matrices de coste. Si el arco (i,j) no pertenece a A entonces se asigna bi,j o bi,j un valor que no puede ser utilizado como una etiqueta valida.

Creo que La principal ventaja de la matriz de adyacencia es que el orden de eficiencia de las operaciones de obtencion de etiqueta de un arco o ver si dos vertices estan conectados son independientes del número de vértices y de arcos. Por el contrario, existen dos grandes inconvenientes:

  • Es una representación orientada hacia grafos que no modifica el número de sus vertices ya que una matriz no permite que se le o supriman filas o columnas.
  • Se puede producir un gran derroche de memoria en grafos poco densos (con gran número de vértices y escaso número de arcos).
Para evitar estos inconvenientes se introduce otra representación: las listas de adyacencia.

Bibliografia:

http://www.monografias.com/trabajos16/grafos/grafos.shtml

http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/grafos.htm

http://docencia.udea.edu.co/regionalizacion/teoriaderedes/representacionu1.html

jueves, 13 de mayo de 2010

Arbol Binario de Busqueda

La búsqueda binaria utiliza un método de `divide y vencerás'para localizar el valor deseado. Con este método se examina primero el elemento central de la lista; si éste es el elemento buscado, entonces la búsqueda ha terminado.

En caso contrario, se determinar si el elemento buscado será en la primera o la segunda mitad de la lista y a continuación se repite este porceso, utilizando el elemento central de esa sublista.

Se puede aplicar tanto a datos en listas lineales como en árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda binaria son:

*

La lista debe estar ordenada en un orden específico de acuerdo al valor de la llave.
*

Debe conocerse el número de registros.

Algoritmo:
#

Se compara la llave buscada con la llave localizada al centro del arreglo.
#

Si la llave analizada corresponde a la buscada fin de búsqueda si no.
#

Si la llave buscada es menor que la analizada repetir proceso en mitad superior, sino en la mitad inferior.
#

El proceso de partir por la mitad el arreglo se repite hasta encontrar el registro o hasta que el tamaño de la lista restante sea cero , lo cual implica que el valor de la llave buscada no esta en la lista.

El esfuerzo máximo para este algoritmo es de log2n. El mínimo de 1 y en promedio ½ log2 n.


Ventajas de la técnica.


La búsqueda binaria es un método eficiente siempre que el vector esté ordenado. En la práctica, esto suele suceder, pero no siempre. Por esta razón la búsqueda binaria exige una ordenación previa del archivo.

La búsqueda binaria proporciona un medio para reducir el tiempo requerido para buscar en una lista. Este método, sin embargo, exige que los datos estén ordenados.

Es mas rapido por su recursividad, su mayor ventaja es con los archivos extensos.

El codigo del procedimiento de esta busqueda es corto en comparacion con las demas tecnicas de busqueda.

En esencia, con una sola comparacion eliminamos la mitad de la tabla; este es el metodo mas eficiente de buscar en una lista ordenada sin emplear tablas o indices adicionales.


Desventajas de la técnica.


La búsqueda binaria tiene, sin embargo, inconvenientes a resaltar:

El archivo debe estar ordenado y el almacenamietno de un archivo ordenado suele plantear problemas en las inserciones y eliminaciones de elementos.

No revisa todos los elementos del archivo, requiere que todos los elementos esten ordenados

Esta busqueda mas de uno o dos accesos si el archivo es enorme;y mantener ese archivo ordenado es muy costoso.



Principales Aplicaciones.


Ejemplo: Árbol Binario de Búsqueda:

Se distinguen 2 casos triviales con solución directa: árbol vacío (elemento no encontrado) o raíz del árbol.

Solución:

Cuando el elemento no se encuentra en la raíz, dividimos el árbol en 2 subarboles (izquierda y derecha) y aplicamos ABB, sobre aquel que nos interese (al estar ordenado solo debemos ir por una de las ramas).

La combinación de resultados es trivial: la solución del subproblema es también la del problema global.

Supongamos la lista:

1231

1473

1545

1834

1892

1898 elemento central

1983

2005

2446

2685

3200

Si está buscando el elemento 1983, se examina el número central 1898 en la sexta posición. Ya que 1983 es mayor que 1898, se desprecia la primera sublista y nos centramos en la segunda

1983

2005

2446 elemento central

2685

3200

El número central de esta sublista es 2446 y el elemento buscado es 1983 menos que 2446; eliminamos la segunda sublista y nos queda

1983

2005

Como no hay término central elegimos el término inmediatamente anterior al término central, 1983, que es el buscado.

Se han necesitado tres comparaciones, mientras que la búsqueda secuencial hubiese necesitado siete.



por ultimo de el primer video de un lista de reproduccion de videos de exposiciones acerca de lo arboles binarios







Bibliografia:

http://www.youtube.com/watch?v=Rr1t8UX_d10

http://www.elrincondelc.com/nuevorincon/index.php?pag=codigos&id=4

http://html.rincondelvago.com/algoritmos-de-busqueda.html


lunes, 10 de mayo de 2010

Arboles Binarios y sus aplicaciones





El árbol binario es el caso más simple de árbol de orden N, cuando N vale 2. Su
especificación se puede hacer considerando un valor constante, el árbol nulo, y un constructor
de árboles a partir de un elemento y dos árboles.
Para saber el contenido de todos los nodos en un árbol es necesario recorrer el árbol. Esto es debido a que solo tenemos conocimiento del contenido de la dirección de un nodo a la vez. Al recorrer el árbol es necesario tener la dirección de cada nodo, no necesariamente todos al mismo tiempo, de hecho normalmente se tiene la dirección de uno o dos nodos a la vez; de manera que cuando se tiene la dirección de un nodo, se dice que se visita ese nodo.

Un árbol binario es una estructura de datos útil cuando se trata de hacer modelos de procesos en donde se requiere tomar decisiones en uno de dos sentidos en cada parte del proceso. Por ejemplo, supongamos que tenemos un arreglo en donde queremos encontrar todos los duplicados. Esta situación es bastante útil en el manejo de las bases de datos, para evitar un problema que se llama redundancia.

Una manera de encontrar los elementos duplicados en un arreglo es recorrer todo el arreglo y comparar con cada uno de los elementos del arreglo. Esto implica que si el arreglo tiene $ n$ elementos, se deben hacer $ n$ comparaciones, claro, no es mucho problema si $ n$ es un número pequeño, pero el problema se va complicando más a medida que $ n$ aumenta.

Si usamos un árbol binario, el número de comparaciones se reduce bastante, veamos cómo.

El primer número del arreglo se coloca en la raíz del árbol (como en este ejemplo siempre vamos a trabajar con árboles binarios, simplemente diremos árbol, para referirnos a un árbol binario) con sus subárboles izquierdo y derecho vacíos. Luego, cada elemento del arreglo se compara son la información del nodo raíz y se crean los nuevos hijos con el siguiente criterio:

* Si el elemento del arreglo es igual que la información del nodo raíz, entonces notificar duplicidad.
* Si el elemento del arreglo es menor que la información del nodo raíz, entonces se crea un hijo izquierdo.
* Si el elemento del arreglo es mayor que la información del nodo raíz, entonces se crea un hijo derecho.

Una vez que ya está creado el árbol, se pueden buscar los elementos repetidos. Si x el elemento buscado, se debe recorrer el árbol del siguiente modo:

Sea k la información del nodo actual p. Si X>K entonces cambiar el nodo actual a right(p), en caso contrario, en caso de que X=k informar una ocurrencia duplicada y en caso de que X >= K cambiar el nodo actual a left(p).

El siguiente algoritmo

leer numero buscado >> n
tree=makeTree(n)
while(hay numeros en el arreglo){
leeSiguienteNumero >> k
p=q=tree;
while(k!=info(p)&&q!=NULL){
p=q
if(k
q=left(p)
else
q=right(p)
}
if(k==info(p))
despliega<<" el numero es duplicado"; else if (k
setLeft(p,k)
else
setRight(p,k)
}

Aunque hay un orden preestablecido (la enumeración de los nodos) no siempre es bueno recorrer el árbol en ese orden, porque el manejo de los apuntadores se vuelve más complejo. En su lugar se han adoptado tres criterios principales para recorrer un árbol binario, sin que de omita cualquier otro criterio diferente.

Los tres criterios principales para recorrer un árbol binario y visitar todos sus nodos son, recorrer el árbol en:

preorden:
Se ejecutan las operaciones:

1. Visitar la raíz
2. recorrer el subárbol izquierdo en preorden
3. recorrer el subárbol derecho en preorden

entreorden:
Se ejecutan las operaciones:

1. recorrer el subárbol izquierdo en entreorden
2. Visitar la raíz
3. recorrer el subárbol derecho en entreorden

postorden:
Se ejecutan las operaciones:

1. recorrer el subárbol izquierdo en postorden
2. recorrer el subárbol derecho en postorden
3. Visitar la raíz

Al considerar el árbol binario que se muestra en la figura:


usando cada uno de los tres criterios para recorrer el árbol se tienen las siguientes secuencias de nodos:


En preorden: 14,4,3,9,7,5,15,18,16,17,20

En entreorden:3,4,5,7,9,14,15,16,17,18,20

En postorden: 3,5,7,9,4,17,16,20,18,15,14

Esto nos lleva a pensar en otra aplicación, el ordenamiento de los elementos de un arreglo.

Para ordenar los elementos de un arreglo en sentido ascendente, se debe construir un árbol similar al árbol binario de búsqueda, pero sin omitir las coincidencias.

El árbol de ordenamiento es el que se muestra Para ordenar los elementos de este arreglo basta recorrer el árbol en forma de entreorden.

se podría decir que un árbol binario se define como un conjunto finito de elementos llamados nodos. En estos casos se puede usar terminología de relaciones familiares para descubrir las relaciones entre los nodos de un árbol; y que un árbol puede ser implementado fácilmente en una computadora.

En Conclusion es bueno hacer énfasis en esto ya que se puede saber mucho sobre lo que tiene que ver con los árboles; entre las cosas que podemos mencionar se encuentra la raíz, los nodos de un árbol y la diferencia entre nodos sucesores y nodos terminales, como se muestran en el contenido del trabajo. Por ultimo dejo este video muy Ilustrativo acerca del recorrido de un arbol binario.








Bibliografia
http://computacion.cs.cinvestav.mx/~acaceres/courses/estDatosCPP/node53.html

http://foro.elhacker.net/programacion_cc/arboles_binarios-t293011.0.html;msg1451005


sábado, 8 de mayo de 2010

Arboles de Expresiones en C#

Una expresión lambda es una función anónima que puede contener expresiones e instrucciones y se puede utilizar para crear delegados o tipos de árboles de expresión.

Todas las expresiones lambda utilizan el operador lambda = >, que se lee como "va a". El lado izquierdo del operador lambda especifica los parámetros de entrada (si existe alguno), mientras que el lado derecho contiene el bloque de expresiones o instrucciones. La expresión lambda x => x * x se lee "x va a x veces x". Esta expresión se puede asignar a un tipo de delegado del siguiente modo:

Cuando se utiliza la sintaxis de método para llamar al método Where en la clase Enumerable (como se hace en LINQ to Objects y LINQ to XML), el parámetro es un tipo delegado System.Func(Of T, TResult). Una expresión lambda constituye la manera más práctica de crear ese delegado. Cuando se llama al mismo método en, por ejemplo, la clase System.Linq.Queryable (como se hace en LINQ to SQL), el tipo de parámetro es System.Linq.Expressions.Expression, donde Func es cualquier delegado de Func que tenga hasta cinco parámetros de entrada. De nuevo, una expresión lambda constituye una manera muy concisa de construir ese árbol de expresión. Las expresiones lambda permiten que las llamadas a Where tengan un aspecto similar, aunque, de hecho, el tipo de objeto creado desde la expresión lambda sea diferente.

Los árboles de expresiones representan el código de nivel del lenguaje en forma de datos. Los datos se almacenan en una estructura con forma de árbol. Cada nodo del árbol de expresión representa una expresión, por ejemplo, una llamada al método o una operación binaria, como x <>.

En la ilustración siguiente se muestra un ejemplo de una expresión y su representación en forma de un árbol de expresión. Las diferentes partes de la expresión tienen un color distinto para hacerlas coincidir con el nodo correspondiente del árbol de expresión. También se muestran los diferentes tipos de los nodos del árbol de expresión.

En el ejemplo de código siguiente se muestra cómo el árbol de expresión que representa la expresión lambda num => num <> (C#) o Function(num) num <> (Visual Basic) se puede descomponer en partes.




Generar árboles de expresiones

El espacio de nombres System.Linq.Expressions proporciona una API para la compilación manual de árboles de expresiones. La clase Expression contiene métodos de generador estáticos que crean nodos del árbol de expresión de tipos específicos, por ejemplo, un objeto ParameterExpression, que representa una expresión de parámetro con nombre, o un objeto, MethodCallExpression, que representa una llamada a un método. ParameterExpression, MethodCallExpression y los demás tipos de árboles de expresiones específicos de la expresión se definen también en el espacio de nombres System.Linq.Expressions. Estos tipos se derivan del tipo abstracto Expression.

El compilador también puede generar un árbol de expresión. Un árbol de expresión generado por el compilador siempre tiene como raíz un nodo de tipo Expression<TDelegate>; es decir, su nodo raíz representa una expresión lambda.

En el ejemplo de código siguiente se muestran dos mecanismos para crear un árbol de expresión que representa la expresión lambda num => num <> (C#) o Function(num) num <> (Visual Basic).

Para mi lo mas interesante de los arboles de expresiones es que en vez de dejar que el compilador los genere automaticamente, podemos construirlos nosotros manualmente, aunque puede ser algo tedioso.




Bibliografía:

http://kartones.net/blogs/jadengine/archive/2009/03/31/193-rboles-de-expresiones.aspx
http://msdn.microsoft.com/es-es/library/bb397687%28VS.90%29.aspx
http://msdn.microsoft.com/es-es/library/bb397951%28VS.90%29.aspx
http://www.elguille.info/NET/futuro/firmas_octavio_ArbolesExpresiones.htm

jueves, 29 de abril de 2010

Algoritmo Recolector de Basura

Un recolector de basura (del inglés, garbage collector) es un mecanismo implícito de gestión de memoria implementado en algunos lenguajes de programación de tipo interpretado o semi-interpretado.

Su improtancia radica en que Cualquier programa informático hace uso de una cierta cantidad de memoria de trabajo puesta a su disposición por el sistema operativo. Esta memoria tiene que ser gestionada por el propio programa para:

* Reservar espacios de memoria para su uso.
* Liberar espacios de memoria previamente reservados.
* Compactar espacios de memoria libres y consecutivos entre sí.
* Llevar cuenta de qué espacios están libres y cuáles no.

Generalmente, el programador dispone de una biblioteca de código que se encarga de estas tareas. No obstante, el propio programador es responsable de utilizar adecuadamente esta biblioteca.

Esto tiene la ventaja de que se hace un uso eficiente de la memoria, es decir, los espacios de memoria quedan libres cuando ya no son necesarios. No obstante, este mecanismo explícito de gestión de memoria es propenso a errores. Por ejemplo, un programador puede olvidar liberar la memoria de manera que, tarde o temprano, no quede memoria disponible, abortando la ejecución del programa.

Como alternativa es necesaria una gestión implícita de memoria, donde el programador no es consciente de la reserva y liberación de memoria. Esto es obligado en algunos lenguajes de programación donde no se maneja el concepto de memoria. Por ejemplo en lenguajes declarativos como Lisp o Prolog.



Recolección de basura: El espacio de memoria se va llenando con diferentes "objetos" (representados con colores), también pueden destruirse algunos de ellos, dejando "huecos" en el espacio de memoria. Cuando ya no queda espacio disponible, o cuando lo decide la rutina de recolección de basura, la memoria es "compactada", colocando todos los "objetos" que se están usando al principio, y consolidando todos los "huecos" de memoria al final, quedando así un gran área de memoria disponible para la futura creación de objetos.



Algunos lenguajes que Usan garbage collector:




Como anotacion final. la mayoria de lenguajes nuevos tienen recolector de basura (garbage collector) propio, el cual va liberando automáticamente la memoria inutilizada para evitar hacer un gasto innecesario de memoria, pero los algoritmos de estos “recogedores de basura” son complicados y no son ni mucho menos perfectos, así que si le ayudamos un poco y además así maximizaremos la memoria disponible en el momento deseado.

Para liberar estos recursos podemos hacer uso de por ejemplo en PHP la variable unset($variable) para así liberar la memoria.

por ultimo dejo este video del instructor Jonathan Shewchuk de la universidad de Berkeley acerca de garbage collections en java, que espero el ingeniero guillen no lo mire para que no tome ideas de evaluacion de él jeje. este video lo encontre muy entretenido e informativo en este tema.






Bibliografia:
http://java.sun.com/docs/hotspot/gc1.4.2/
http://www.cristalab.com/tips/clase-para-manejar-el-garbage-collector-de-flash-player-c68118l/
http://www.youtube.com/watch?v=rp8PvFvSO_c
http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

viernes, 23 de abril de 2010

Colorear Grafos con Algoritmos


¿Qué es un grafo?
Es aquel que se compone de un conjunto de puntos, llamados vértices, y de líneas que
unen los puntos, llamadas aristas. La Coloración de un grafo Consiste en la asignación de un color a cada vértice de
éste, de tal forma que no haya dos vértices del mismo color unidos por un arista
De manera simple, una coloración de los vértices de un grafo tal que ningún vértice adyacente comparta el mismo color es llamado vértice coloración. Similarmente, una arista coloración asigna colores a cada arista talque aristas adyacentes no compartan el mismo color, y una coloración de caras de un grafo plano a la asignación de un color a cada cara o región tal que caras que compartan una frontera común tengan colores diferentes.

La vértice coloración es el punto de inicio de la coloración, y los otros problemas de coloreo pueden ser transformados a una versión con vértices. Por ejemplo, una arista coloración de un grafo es justamente una vértice coloración del grafo de línea respectivo, y una coloración de caras de un grafo plano es una vértice coloración del grafo dual.



La convención de usar colores se origina de la coloración de países de un mapa, donde cada cara es literalmente coloreada. Esto fue generalizado a la coloración de caras de grafos inmersos en el plano. En representaciones matemáticas y computacionales es típicamente usado enteros no-negativos como colores. En general se puede usar un conjunto finito como conjunto de colores. La naturaleza del problema de coloración depende del número de colores pero no sobre cuales son.

¿Cómo colorear un grafo?


Se selecciona un vértice no coloreado y se le
asigna el nuevo color.
Se examina la lista de vértices no coloreados coloreados.
Para cada uno de ellos se determina si existe
alguna arista que una con un vértice que ya
tenga asignado el nuevo color color, si tal arista no
existe, se asigna el nuevo color al vértice.


Básicamente el algoritmo emplearía dos ciclos (en
algunos casos usa while, en otros casos ciclos for)
de esta forma por cada vértice no coloreado visita
sus adyacentes y comprueba si ya fueron
coloreados, si no han sido pintados, entonces los
colorea de tal forma que no hayan vértices
consecutivos con la misma tonalidad de color.
Este algoritmo en su forma básica nos lleva un
tiempo O(v²).

Uno de los mayores aplicaciones de la coloración de grafos, es la asignación de registros en compiladores introducida en 1981.
Gracias a la teoría de grafos se pueden resolver diversos problemas como por ejemplo la síntesis de circuitos secuenciales, contadores o sistemas de apertura. Se utiliza para diferentes áreas por ejemplo, Dibujo computacional, en toda las áreas de Ingeniería.

Los grafos se utilizan también para modelar trayectos como el de una línea de autobús a través de las calles de una ciudad, en el que podemos obtener caminos óptimos para el trayecto aplicando diversos algoritmos como puede ser el algoritmo de Floyd.

Para la administración de proyectos, utilizamos técnicas como PERT en las que se modelan los mismos utilizando grafos y optimizando los tiempos para concretar los mismos.

Creo que para problemas con algoritmos de este tipo es de suma importancia poder reconocer que nos intereza mas si rapidez o eficiencia. puesto que al ser un algoritmo tan complejo debemos tener cuidado con la misma complejidad con el que sea estructurado, para poder reducir lo mas posible la cantidad de colores a usar, tiempo de ejecucion o eficiencia de codigo.

Por ultimo dejo este excelente video con el que queda mejor plasmado la idea de coloracion de un grafo.







Bibliografía
http://www.youtube.com/watch?v=moZdSyN1KuI
http://www.sol.com/algoritmos/pagina02.asp
http://es.wikipedia.org/wiki/Teor%C3%ADa_de_grafos
http://www.infovis.net/printMag.php?num=137&lang=1
http://www.monografias.com/trabajos/grafos/grafos.shtml

martes, 20 de abril de 2010

Los Apuntadores en Programacion.

Los apuntadores son variables que almacenan direcciones de memoria. En general una variable contiene un valor específico dependiendo de cómo fue declarada. Un apuntador contiene la dirección de una variable que contiene un valor específico. Un puntero o apuntador es una variable que referencia una región de memoria;

En otras palabras es una variable cuyo valor es una dirección de memoria. Si se tiene una variable ' p’ De tipo puntero que contiene una dirección de memoria en la que se encuentra almacenado un valor ' v ' se dice que ' p ' apunta a ' v’.
Una variable se refiere directamente a un valor y un apuntador se refiere indirectamente a un valor. Cuentan con una declaración propia. Los apuntadores disponen de dos operadores unarios

Los apuntadores como cualquier otra variable deben de ser declarados antes de que puedan ser utilizados. El tipo de un apuntador lo proporciona implícitamente el tipo de la variable a la que apunta. Los apuntadores pueden ser declarados para apuntar a objetos de cualquier clase.

La sintaxis general de declaración es:
*
Ejemplos de declaraciones:
int *contPtr, cont;
float *res;
unsugned int *nosigno;
char *mensaje;
La variable contPtr es del tipo apuntador a entero, (int *) y se lee ``contPtr es un apuntador a int'' o ``contPtr apunta a una variable entera''.

El ejemplo que sigue es propio del lenguaje C/C++ y no es de aplicación en otros lenguajes de programación:

struct Elemento // Ejemplo de un nodo de lista doble enlazada
{
int dato;
struct Elemento *siguiente; // Para la declaración de un puntero se usa '*'
struct Elemento *anterior;
};

Los apuntadores en C, C++ son una herramienta muy potente de programación que suele causar mucha confusión en el programador sin experiencia o en quienes estamos aprendiendo a programar, y que lastimosamente en los cursos universitarios a veces se le da una cobertura muy superficial al tema de apuntadores. Además, cuando los programadores cometen un error en su utilización, puede ser muy difícil encontrar el error, por lo cual es importante saber utilizarlos muy bien. El uso de apuntadores en C y C++ es muy importante debido a que permite hacer los programas más eficientes y más flexibles. Y para el manejo de estructuras de TDAs como las pilas, listas, colas etc. son de gran importancia para crear un código de programación mas solido


viernes, 16 de abril de 2010

Ejemplo de Algoritmos Recursivos

Ejemplo Se muestra un programa recursivo para calcular n\, que es el producto de todos los enteros de 1 a n inclusive.
Una medida de tamaño apropiado para esta función es el valor de n. Sea T(n) el tiempo de ejecución para fact(n). El tiempo de ejecución para las líneas (1) y (2) es 0(1), y para la línea (3) es 0(1) + 7X*-1). Por tanto, para ciertas constantes c y d.Esto es, T(n-\) - c + T(n-2)> como se puede ver al sustituir n por n-\ en (1.1). Así pues, es posible reemplazar T(n-\) con c + T(n-2) en la ecuación T(n) - c + T(n-t) Después, se puede usar (1.1) para desarrollar 7\n-2), con lo que se obtiene
T(n) - 3c + T(n-3) si« > 3
y así sucesivamente. En general,
T(n) ~ ic + T(n-i) si n > i
Por último, cuando / - /i-l, se obtiene
T(n) - c(n-l) + 7(1) - c(«-l) + d (1.2)
Por eso concluye que T(n) es 0(n). Es importante observar que en este análisis se ha supuesto que la multiplicación de dos enteros es una operación de tiempo 0(1). En la práctica, no obstante, no se puede emplear el programa de la figura 1.14 para calcular n\ cuando los valores de n son grandes, pues el tamaño de los enteros que se calculen excederá del tamaño de palabra de la máquina en cuestión.
El método general para resolver una ecuación de recurrencia, tal como se tipifica en el ejemplo 1.10, consiste en reemplazar en forma repetida términos T(k) del lado derecho de la ecuación por el lado derecho completo, donde k se reemplaza por n, hasta obtener una fórmula en la que Tno aparezca en el lado derecho como en (1.2). A menudo es necesario calcular la suma de una sucesión o, si no es posible encon¬trar la suma exacta, obtener una cota superior cercana para la suma a fin de hallar una cota superior para 7^«).


Bibliografia:
Aho, Alfred V., John E. Hopcroft y Jeffrey D. Ullman. (1998). Diseño y análisis de algoritmos. En Estructuras de datos y algoritmos

Algoritmos Recursivos


Se dice que un método es recursivo si contiene llamadas o
Invocaciones a sí mismo.
Un método recursivo tendría este aspecto:
… metodoRecursivo (…){
……
metodoRecursivo (…);
……
}
Esto implica que una llamada al método recursivo puede generar una o
más invocaciones al mismo método, que a su vez genera otras
invocaciones, y así sucesivamente.

Siempre hay que asegurar que existe una condición de salida, es decir,
si se cumple esa condición, estaremos en el caso base, donde no se
producen llamadas recursivas.
Ya que la solución recursiva tiene un coste de tiempo y memoria mayor
que la iterativa. Es decir, los programas recursivos en general son
menos eficientes. Podríamos utilizar los siguientes consejos:
Los algoritmos que por naturaleza son recursivos, y donde la solución iterativa es complicada y debe manejarse explícitamente una pila para enumerar las llamadas recursivas, deben resolverse por métodos recursivos.
Cuando haya una solución obvia por iteración al problema, debe evitarse la recursividad.

El backtraking o “vuelta atrás” es una técnica algorítmica de resolución
general de problemas mediante una búsqueda sistemática de
soluciones.
Se descompone la tarea a realizar en tareas parciales de posibles
soluciones, y estas tareas parciales a su vez se descompondrán en
más tareas, en caso de que una tarea no conduzca a una solución se
tendrá que hacer vuelta atrás guardando los puntos de elección para
poder volver a ellos cuando no se alcance una solución.

Pienso que la experiencia es un factor importante al momento de programar decidir cuándo utilizar algoritmos recursivos o iterativos no es algo que deba tomarse a la ligera porque es algo que afectara positiva o negativamente al comportamiento de nuestros programas. La recursividad es quizás uno de los temas más ambiguos que y oscuros que eh recibido en cursos de programación. Sin embargo puede ser una herramienta potente si se sabe aprovechar.

Por ultimo dejo este video acerca de la resolucion de un problema simple con un algoritmo recursivo.



Bibliografía
http://www.slideshare.net/demogorgon/algoritmos-recursivos
http://es.wikipedia.org/wiki/Algoritmo_recursivo
http://www.uniandes.edu.co/la_universidad/Informatica.php
http://www.youtube.com/watch?v=FVkZzdZxEks

lunes, 12 de abril de 2010

Volker Strasse y su investigacion de algoritmos.


Volker Strassen es un matemático alemán, profesor del departamento de matemáticas y estadística de la Universidad de Constanza.
Strassen nació el 29 de abril de 1936 en Düsseldorf-Gerresheim. estudio música, filosofía, física y matemáticas en muchas universidades alemanas, recibió su doctorado en matemáticas en 1962 en la Universidad de Göttingen bajo la supervisión de Konrad Jacobs.


Strassen comenzó su investigación como probabilista; su artículo de 1964 Un principio de invariancia para la ley del logaritmo iterado definió una forma funcional de la ley del logaritmo iterado, mostrando una forma de invariancia de escala en un paseo aleatorio. Este resultado, ahora conocido como Principio de invariancia de Strassen o Ley de Strassen del logaritmo iterado, ha sido muy citado y llevado a una presentación de 1966 en el Congreso Internacional de Matemáticos.

Strassen's Knuth Prize lecture (2) Strassen's Knuth Prize lecture (6)




Ocupó un puesto en el departamento de estadística de la Universidad de California, Berkeley. En 1968, se trasladó al Instituto de Matemática Aplicada de la Universidad de Zúrich, donde permaneció 20 hasta trasladarse a la Universidad de Constanza en 1988.
En 1969, Strassen desplazó sus esfuerzos investigadores hacia el análisis de algoritmos con un artículo sobre eliminación gaussiana, presentando el algoritmo de Strassen, el primer algoritmo para realizar multiplicación de matrices más rápido que O(n3), la complejidad temporal que tendría el algoritmo más sencillo. En el mismo artículo también presentó un método asintóticamente rápido para realizar la inversión de una matriz, basada en la multiplicación rápida de matrices. Este resultado fue un importante avance teórico, logrando mucha investigación adicional sobre la multiplicación rápida de matrices, y a pesar de las mejoras teóricas posteriores sigue siendo un método práctico para la multiplicación de matrices densas de tamaños moderados a grandes. En 1971 Strassen publicó otro artículo junto a Arnold Schönhage sobre la multiplicación de enteros asintóticamente rápida basada en transformada rápida de Fourier; vea algoritmo de Schönhage–Strassen. Strassen también es conocido por su trabajo de 1977 con Robert M. Solovay por el test de primalidad Solovay–Strassen, el primer método muestra que probar cuándo un número es primo puede ser realizado tiempo polinomial aleatorio y es uno de los primeros resultados que muestra la potencia de los algoritmos aleatorios más generalmente. Se jubiló en 1998.
Strassen's Knuth Prize lecture (5)Strassen's Knuth Prize lecture (7)



Bibliografia:
http://www.ics.uci.edu/~eppstein/pix/strassen/
http://www.sigact.org/prizes/knuth/2008.html
http://es.wikipedia.org/wiki/Volker_Strassen
http://www.math.uni-konstanz.de/~strassen/

Quien Soy....

Tener una identidad propia en este mundo se ha vuelto complicado, dejamos que otros decidan quienes somos. Dejamos que el molde establecido por otros se adueñe de nuestra forma de ser y pensar.

Creo en la soberanía de los pueblos y en la libertad de las personas. Soy estudiante de la carrera Ingeniería en Informática en el Centro Universitario Tecnológico (CEUTEC) y Trabajo en la Financiera Finca Honduras, en el departamento de sistemas, para poder costear mis estudios universitarios y poder obtener mayor experiencia laboral, por un mejor futuro aun cuando este en nuestra sociedad cada vez se pone más gris. Me fascina la informática, la computación, creo que estoy siguiendo la carrera correcta para mí.

Me gusta el la lectura, (cuando las tarántulas atacan y prisión verde son de esos libros que me han hecho formar una opinión muy solida acerca de las cosas que ocurren en la actualidad en mi país) me gusta el cine, los videojuegos, la música (jazz, blues, rock los favoritos), el manga, anime, comics, al fin soy una persona normal.

Pienso que la religión es lo peor en este mundo… pero también creo que Jesús murió en la cruz por mis pecado. Gran contradicción prefiero creer en El…..que en los pastores.

Por ultimo dejo el video de una de las mejores compositoras de la actualidad: Yoko Kano