lunes, 31 de mayo de 2010

Puntos Extra

Quick Sort (Ordenamiento rápido)

El ordenamiento rápido (quicksort en inglés) es un algoritmo basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n elementos en un tiempo proporcional a n log n. Esta es la técnica de ordenamiento más rápida conocida. Fue desarrollada por C. Antony R. Hoare en 1960. El algoritmo original es recursivo, pero se utilizan versiones iterativas para mejorar su rendimiento (los algoritmos recursivos son en general más lentos que los iterativos, y consumen más recursos).

Los pasos del algoritmos son los siguientes:

  • Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote. Para elegir el pivote podemos obtener el promedio de los datos y así obtener un valor que este muy cerca de uno de los elementos a ordenar y elegirlo como pivote.
  • Resituar los demás elementos de la lista a cada lado del pivote, de manera que en el lado izquierdo queden todos los menores que él, y en el lado derecho los mayores. En este momento, el pivote ocupa exactamente el lugar que le corresponderá en la lista ordenada.
  • La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.
  • Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados. Como se puede suponer, la eficiencia del algoritmo depende de la posición en la que termine el pivote elegido.
  • En el mejor caso, el pivote termina en el centro de la lista, dividiéndola en dos sublistas de igual tamaño. En este caso, el orden de complejidad del algoritmo es O(n log n).
  • En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de 0(n²). El peor caso dependerá de la implementación del algoritmo, aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas.
  • En el caso promedio, el ordenamiento es O(n·log n).

Ahora un ejemplo de la ejecución del algoritmo:
5 86 68 73 11 17 1 74 34 3

Primer paso elegir un pivote:
5 86 68 73 11 17 1 74 34 3

Segundo paso mover los elementos menores al pivote a la izquierda y los mayores a la derecha:
5 1 3 11 17 34 86 68 73 74

Después elegimos un elemento pivote de cada lado del pivote original :
Del lado izquierdo elegimos el 5 y del lado derecho el 74 y movemos los números menores a 5 y 74 a su izquierda y los mayores a su derecha:

5 1 3 11 17 34 86 68 73 74

1 3 5 11 17 34 68 73 74 86

El arreglo quedaría de esta forma: 1 3 5 11 17 34 68 73 74 86

domingo, 30 de mayo de 2010

Puntos Extra

Análisis Asintótico

Encuentre una función de complejidad asintótica f(n) así que la función g(n)
definida experimentalmente por doce puntos en la siguiente tabla sea O(f(n)).
Justifique esto con una gráfica y discute la calidad de la cota obtenida.












Con la ayuda de MS Excel hice una gráfica en la que pude ir observando el comportamiento de la función f(n)

Llegue a la conclusión que la funcion f(n log n) es mucho mejor que f(n^2) y f(log n) ya que el f(n^2) se aleja muy rápido de f(n) y la función f(log n) esta muy por debajo de f(n)
asi que (n log n) crece casi igual que f(n) como se muestra en la siguiente imagen:













Por lo tanto g(n) es O(f(n log n)).

Puntos Extra

Pseudocódigo y Diagramas de flujo(Problema 1)

Represente el siguiente pseudocódigo en un diagrama de flujo

entrada n
si (n % 2 == 0)
si(n == 2)
imprime "si"
en otro caso
imprime "no"
i = 3
mientras i <= raíz (n)
si (n % i == 0)
imprime "no"
sal
i += 2
imprime "si"


Este es el diagrama de flujo del pseudocódigo:















¿Qué es lo que hace este algoritmo?

Lo que hace este algoritmo es determinar si un numero es primo o no si no lo es.
El diagrama empieza pidiendo el numero a evaluar, después saca el modulo de n
si el modulo es cero sale por el verdadero y evalúa la condición n== 2 si es verdadero
"imprime" un "si" si es falso "imprime" un "No". En caso de que el modulo de n no
sea cero sale por el falso, i toma el valor de 3 y se hace un ciclo en el que mientras
i >= raíz(n) evalúe (n % i == 0), si es verdad "imprime" "No" y sal, si es falso suma 2 a i .

Para las siguientes entradas 1, 2, 16, 49 y 53 simular la ejecución del algoritmo.

1 = Si
2 =Si
16 = No
49 = No
53 = Si

Evaluando para 1
Primero evalúa el modulo 1%2==0
sale por el falso y como la raíz de 1 es menor a i
termina el ciclo he imprime un Si.

Evaluando para 2
Primero evalúa el modulo 2%2==0
sale por el verdadero y evalúa la
siguiente condición 2==2, como es verdadero
imprime un Si.
Para descargar el programa da clic en: Descargar

domingo, 16 de mayo de 2010

Proyecto 5


Primero empezaremos por definir algunos términos y conceptos que se deben conocer sobre los caminos.

Un camino

En un grafo G es una sucesión finita de vértices y aristas alternos, donde cada arista tiene por extremos los vértices adyacentes.

(v0, v0v1, v1, v1v2,..., vn-1, vn-1vn, vn)

A v0 y vn se les denomina extremos del camino.

Longitud del camino

Es el número de aristas que contiene.

Camino cerrado

Los extremos coinciden, v0=vn, son el principio y el final del grafo

En un grafo, un camino puede expresarse por la sucesión de vértices

(v0, v1,..., vn-1, vn)

Camino simple:

En la sucesión de vértices no hay ninguno repetido.

Grafo dirigido

Un grafo dirigido es aquel en el que un nodo tiene un lazo y un grafo no dirigido es el que no tiene lazos y o sea que no apunta a si mismo.


Camino Euleriano

Inicio del problema

El origen de la teoría de los caminos eulerianos fue planteado y resuelto por el propio Leonhard Euler en 1736 en un problema que tiene el nombre de Siete puentes de la ciudad de Königsberg (Prusia oriental en el siglo XVIII y actualmente, Kaliningrado, provincia rusa) dando origen a la Teoría de los grafos.

El problema se enuncia de la siguiente forma: Dos islas en el río Pregel, en Königsberg se unen entre ellas y con la tierra firme mediante siete puentes. ¿Es posible dar un paseo empezando por una cualquiera de las cuatro partes de tierra firme, cruzando cada puente una sola vez y volviendo al punto de partida?

Puentes Konigsberg.jpg

Euler enfocó el problema representando cada parte de tierra por un punto y cada puente, por una línea, uniendo los puntos que se corresponden. Entonces, el problema anterior se puede trasladar a la siguiente pregunta: ¿se puede recorrer el dibujo sin repetir las líneas?


Euler demostró que no era posible puesto que el número de líneas que inciden en cada punto no es par (condición necesaria para entrar y salir de cada punto, y para regresar al punto de partida, por caminos distintos en todo momento).

Camino euleriano

En la teoría de los grafos , un camino euleriano es un camino en un grafo que visita cada arista una sola vez.

Para que un en un grafo haya un camino euleriano deben de cumplirse las siguientes condiciones:

  • Un grafo no dirigido contiene un ciclo euleriano si y sólo si (1) es conexo y (2) cada vértice es de grado par.
  • Un grafo no dirigido contiene un camino euleriano si y sólo si (1) es conexo y (2) todos menos dos vértices son de grado par. Estos dos vértices serán los puntos de inicio y final de la ruta.
  • Por último, un grafo dirigido contiene un camino euleriano si y sólo si (1) es conexo y (2) todos menos dos vértices tienen el mismo grado y estos dos tienen sus vértices en grados diferentes
En la imagen P = {1,2,3,4,6,3,5,4,1} es un camino euleriano.
El camino empieza en el nodo 1 va hacia el nodo 2, después va hacia el nodo 3, después sigue hacia el nodo 4, después va hacia el nodo 6 y regresa al nodo 3 después va hacia el nodo 5 después al 4 y finalmente llega al nodo de inicio el 1.
El siguiente video explica como funciona el algoritmo:

Complejidad del algoritmo

El número de circuitos de Euler en dígrafos se puede calcular utilizando el llamado teorema de BEST , nombrado después de ruijn B , van-E hrenfest Aardenne , mito S y T utte . La fórmula establece que el número de circuitos euleriano en un digrafo es el producto de los factoriales cierto grado y el número de raíces arborescencias . Este ultimo puede ser computado como factor determinante,por el teorema de arbol de la matriz, dando un algoritmo de tiempo polinomico.


Bibliografía

Puntos Extras

Problema # 3 Máquina Turing

Instrucciones

Ejecuta paso a paso la Maquina Turing para la siguiente función de transición, con la entrada siendo la representación binaria del número decimal 37 ¿Cuál es la salida de la máquina en decimal? ¿Qué hace la máquina? ¿Qué complejidad asintótica tiene en términos de computación y memoria?


Conversión a número binario

Existen muchos métodos para convertir un número decimal a un número binario uno de ellos es el siguiente:

Primero se observa si el numero decimal es impar o es par si es impar se le resta 1 y se escribe un 1 y se divide entre 2; si es par solamente dividimos entre 2 y escribimos un 0 (el resultado de las divisiones se escriben de arriba hacia abajo).

37 = 1 (como es un número impar se escribe un 1 y después le restamos 1 y lo

dividimos entre 2)

18 = 0 (18 es un numero par así que escribimos un cero y dividimos entre dos)

9 = 1

4 = 0

2 = 0

1 = 1

El número en binario es (al escribir el número se debe de empezar desde el último número obtenido): 100101b


Ejecución de la Maquina Turing

Utilizando la siguiente tabla y el número en binario realizar las transiciones de la Maquina Turing:





































En decimal el número 01001110b es:

27(0) + 26(1) + 25(0)+ 24 (0)+ 23 (1)+ 22 (1)+ 21 (1)+ 20(0) = 64+8+4+2 = 78

¿Qué es lo que hace esta máquina? Y ¿Qué complejidad asintótica tiene en términos de computación y memoria?

Lo que hace la maquina es multiplicar el número por 2 y sumarle 4, y suma 4 porque al momento de cambiar el cero por el uno, el cambio se hace en la posición del número 4.

En este problema no hubo mucha complejidad porque se encontró un cero muy rápido así que no tuvo que volver hasta el inicio siendo este el peor caso porque tendría que recorrer toda la cinta de regreso, uno de los peores casos también seria que el numero binario fueran puros 1 y que solo hubiera un solo cero al principio de la cinta.

Este problema tiene complejidad asintótica de tiempo polinomial.


domingo, 25 de abril de 2010

Proyecto 4

Tema Colas

¿Que hice yo?
Lo que hice en este proyecto fue encontrar el pseudocódigo para insertar un nodo cuando la cola esta vacía y cuando no lo esta. El pseudocódigo consiste en insertar un nodo y asignarle dos punteros uno que indique que es el primer y ultimo dato de la cola. Al insertar otro dato se debe de cambiar el puntero al ultimo dato insertado.

Como me salio y que aspectos estoy bien y en cuales debo de mejorar
Creo que lo hice bien aunque me faltan muchos detalles por mejorar. Creo que debo de mejorar en el desarrollo y aporte del proyecto, buscar más información, mejorar la presentación y poner mucho esfuerzo en el proyecto.

Ayudo a los demás o me apoyo en ellos
Ayudo a mis compañeros cuando tienen alguna duda y cuando tengo que hacer mi trabajo yo hago mi parte y si me trabo en algo les pido ayuda.

Quien se encarga de coordinar el trabajo
Esta vez nuestra compañera Cynthia se encargo de coordinar el proyecto y de realizar la presentación.

Que papel tomo yo
En este proyecto seguí las indicaciones de mi compañera Cynthia, pero creo que lo importante es haber contribuido con el proyecto.

La presentación esta en la siguiente liga:http://medel.jimdo.com/2010/04/25/proyecto-no-4-colas/

Ligas a los blogs de mis compañeros

domingo, 21 de marzo de 2010

Proyecto 3


¿Que es recursión?

Un algoritmo recursivo es cuando el algoritmo se llama a si mismo, y se divide en problemas mas fáciles de resolver, es decir, se divide en instancias mas pequeñas del mismo problema y las resuelve parte por parte. En cuanto a cuando no es conveniente usar recursión: Cuando el algoritmo utilice arreglos muy largos, cuando el método cambie de manera impredecible de campos, cuando las iteraciones sean la mejor opción.

Como trabajaron como grupo

Todos nos dividimos el trabajo en partes, para luego enviárselos a nuestro compañero Manuel que haría la presentación en MS Power Point. Todos nos ayudamos para que el trabajo no fuera tan pesado.

¿Qué fue tu contribución al proyecto?

Mi contribución al trabajo fue muy pequeña porque solo ayude con las conclusiones del trabajo.

¿Comó compara lo que hiciste tú con el trabajo de los demás?

Aunque todos nos dividimos el trabajo, mi contribución no fue muy extensa. Y sé que debí de contribuir con mas cosas.

¿Que podrías mejorar en el futuro?

Planear mejor mi tiempo para realizar nuestro proyecto y contribuir mas con el trabajo. Como equipo deberíamos planificar, preparar, investigar y realizar el trabajo con mas tiempo para que no se complicara el trabajo y terminarlo a tiempo.

Ligas a los blogs de mis compañeros:


jueves, 4 de marzo de 2010

Proyecto 2

El Salto del caballo

Se dispone de una superficie rectangular "cuadriculada", es decir, formada por un entramado de
posiciones o casillas (como ocurre, por ejemplo, con un tablero de ajedrez). Nos interesa buscar
caminos dentro de esta superficie que cumplan ciertas condiciones, teniendo en cuenta que
algunas de las casillas no pueden formar parte de dichos caminos (para entendernos,
representan obstáculos en la superficie).
Problema
Dada una superficie rectangular de dimensión n×m, realizar un programa que la recorra
partiendo de una casilla inicial y llegando a una casilla final según las reglas siguientes:
· Todas las casillas deberán ser visitadas excepto las casillas marcadas como no
visitables.
· No se podrá visitar más de una vez cada casilla.
· El salto de una casilla a otra deberá realizarse siguiendo las reglas de
movimiento del caballo de ajedrez. Esto es, desde una casilla sólo se
podrá avanzar a aquellas resultantes de avanzar una posición en línea
recta y otra en diagonal en la misma dirección. El esquema muestra en
rojo las casillas accesibles al caballo:
El programa deberá calcular la secuencia de casillas visitadas desde la inicial hasta la final. En
caso que no exista ninguna solución, el programa debe detectar esta situación e informar.


Imagen tomada de Wikipedia

Entrada

La entrada del programa consiste en una secuencia de líneas, que tendrá el siguiente formato:
· La primera línea contiene la dimensión de la superficie, es decir, el número n de
columnas y el número m de filas. Los dos valores son por lo menos 1 y a lo mas 16.
· La segunda línea contiene la posición inicial y la posición final, cada posición siendo
dos enteros, la columna y la fila respectivamente. Puedes suponer que las dos
posiciones están dentro de los límites de la superficie.
· A continuación, m líneas más. Cada línea representa una fila de la superficie, y
contiene n caracteres, uno por columna. Cada uno de estos caracteres puede ser 'V'
o 'N', dependiendo de si la posición correspondiente es visitable o no. Los
caracteres aparecen separados por un único carácter "espacio".
A efectos de numeración, debe considerarse que las filas van de 1 a m y las columnas de 1 a n.

Salida

La salida del programa contendrá una línea por cada posición que forme parte del camino
encontrado como solución que cumpla las condiciones dadas en el enunciado. Cada posición
es un par de enteros: la columna y la fila. La primera posición de la solución será la posición
inicial, y la última la posición final.
Si no hay ninguna solución, la salida contendrá una única línea con el texto
“INSATISFACTIBLE”. Si existe más de una solución, cualquiera de ellas se considera válida.



La siguiente liga muestra la emulación del programa:http://www.ciberchess.com/comun/curiosidades/cabalo/cabalo.html

viernes, 19 de febrero de 2010

Proyecto 1

El proyecto que escogimos fue el de buscar un numero telefónico. El programa inicia introduciendo el apellido paterno de la persona que desea buscar su numero telefónico, después llegamos a un cuadro de condición que nos dice si la inicial del apellido se encuentra entre A y M, si es verdadero se llega a un cuadro de entrada de datos, donde se pide el apellido materno y el nombre; si es falso entonces se llega a una condición en el que te pide si el apellido esta entre N y Z; si es verdadero se introduce el apellido materno y el nombre e imprime el numero telefónico.
Este proceso se puede observar en el siguiente diagrama de flujo:


martes, 26 de enero de 2010

Hola! Me llamo Alberto Huerta y este es mi Blogg