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.