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