miércoles, 6 de julio de 2011

Problema de la partición


Buenos para esta clase estuve investigando sobre los problemas de np completos yo elegí el problemas de las particiones ya que me pareció interesante la forma en que un disco duro puede ser divido.

Este tipo de algoritmos puede servir como por ejemplo particionar un disco duro e instalar dos sistemas operativos como por ejemplo uno de sus aplicaciones.

Bueno primero que nada tenemos que saber que es la complejidad computacional.

La teoría de la complejidad computacional es la rama de la teoría de la computación que estudia, de manera teórica, la complejidad inherente a la resolución de un problema computable. Los recursos comúnmente estudiados son el tiempo (mediante una aproximación al número y tipo de pasos de ejecución de un algoritmo para resolver un problema) y el espacio (mediante una aproximación a la cantidad de memoria utilizada para resolver un problema).

Se pueden estudiar igualmente otros parámetros, tales como el número de procesadores necesarios para resolver el problema en paralelo. La teoría de la complejidad difiere de la teoría de la computabilidad en que ésta se ocupa de la factibilidad de expresar problemas como algoritmos efectivos sin tomar en cuenta los recursos necesarios para ello.

Fuente
Problema de la partición es un problema NP-completo, que visto como un problema de decisión, consiste en decidir si, dado un multiconjunto de números enteros, puede éste ser particionado en dos "mitades" tal que sumando los elementos de cada una, ambas den como resultado la misma suma.

Más precisamente, dado un multiconjunto S de enteros: ¿existe alguna forma de particionar S en dos subconjuntos S1 y S2, tal que la suma de los elementos en S1 sea igual que la suma de los elementos en S2
El problema de partición es equivalente a un caso particular del problema de la suma de subconjuntos, el cual dice: dado un conjunto S de enteros, ¿existe algún subconjunto S1 de S cuyos elementos suman exactamente t /2, donde t es la suma de todos los elementos de S?

La equivalencia puede verse definiendo S2 como la diferencia
S − S1. Por lo tanto, la solución con programación dinámica existente para resolver el problema de suma de subconjuntos, utilizando tiempo pseudo-polinomial, también es aplicable al problema de partición.



Aquí les dejo una pagina interesante que encontré de los problemas de la particiones y de sodoku de una forma interactiva.


Aquí dejo otro link muy interesante me hubiera gustado hablar sobre ello pero creo que tendré que esperar para una futura entrada es sobre Reduction of the Three-Partition Problem y aquí les dejo este pdf muy bueno que viene hablando sobre ello.


Otro link muy bueno es un pdf que habla sobre problemas np completos y en también habla del problema de la partición.


Saludos...

jueves, 30 de junio de 2011

Quicksort


El ordenamiento rápido (quicksort) es un algoritmo creado por el matemático John von Neumann 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.

Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
Resituar los demás elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que él, y al otro los mayores. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementación deseada. 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 O(n²). El peor caso dependerá de la implementación del algoritmo, aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas. Pero principalmente depende del pivote, si por ejemplo el algoritmo implementado toma como pivote siempre el primer elemento del array, y el array que le pasamos está ordenado, siempre va a generar a su izquierda un array vacío, lo que es ineficiente.


Aquí les dejo de como funciona el quicksort



También un vídeo que comparada el método quick sort vs bubble sort.


Bueno aquí les dejo mi pseudocódigo que me base de lo leei y de un varios códigos dela wikipedia

funcion quicksort(parametros)
declarar las variables
mientras izquierda < que derecha
elementos en i < elpivote
incrementas i
mientras elementos en j > elpivote
decrementas a i
si i <= que j
temporal asigna a elementos de i
elementos de i asigna elementos de j
elementos de j asigna a temporal
incrementas i
decrementas j

si la izquierda es menor que la j
elementos = funcion
si la derecha es mayor que i
elementos = funcion
regersa datos



Saludos..

lunes, 16 de mayo de 2011

Servicio de alojamiento en la nube



Puntos Extras Taller de Programación Orientada a Objetos

Dropbox es un servicio de alojamiento de archivos multiplataforma en la nube, operado por la compañía Dropbox. El servicio permite a los usuarios almacenar y sincronizar archivos en línea y entre computadoras y compartir archivos y carpetas con otros.
El cliente de Dropbox permite a los usuarios dejar cualquier archivo en una carpeta designada. Ese archivo es sincronizado en la nube y en todas las demás computadores del cliente de Dropbox.

Los archivos en la carpeta de Dropbox pueden entonces ser compartidos con otros usuarios de Dropbox o ser accedidos desde la página Web de Dropbox. Asimismo, los usuarios pueden grabar archivos manualmente por medio de un navegador web.

Aquí les dejo como luce los archivos que subas a tu cuenta de Dropbox.

Características:

  • Compatible con Windows, Linux y Mac.
  • Solo sincroniza los archivos modificados.
  • Puede trabajar offline (Sincroniza los archivos y carpetas una vez restauremos nuestra conexión a internet).
  • Permite modificar el límite de consumo de Internet.
  • Guarda un historial de los archivos modificados durante 30 días (puede ampliarse este período con un pago adicional).
  • Compatible con dispositivos móbiles iPad, iPhone, Android y próximamente Blackberry.


Dropbox cuenta con transferencias SSL y almacena los datos mediante el protocolo de cifrado AES-256.

Aquí les dejo un vídeo de que es Dropbox y como funciona.


Aquí les deho el link de la paguina de Dropbox


Bueno en realidad es muy sencillo y muy útil espero y les aya gustado y les sirva de ayuda :D

Saludos...

jueves, 12 de mayo de 2011

Presentación final

Presentación final - Taller





Link

Saludos...

Presentación final

Presentación Final





Link

Saludos...

Interfaz gráfica



Interfaz gráfica - Taller


Hola que tal esta entrada trata sobre la aplicación de las interfaces gráficas de usuario de mi proyecto a continuación pondré el código de los archivos que se utilizan en mi proyecto.

El main.xml

Bueno empezando con el main.xml el tipo de layout que considere a usar y también los controladores a usar yo uso el Tipo de layout ScrollView por que si el usuario cambia de portrait mode a landscape mode la aplicación pueda ser visualizada completamente en cualquier tipo de resolución de celular con Android.

Mi layout es de tipo ScrollView y tiene la propiedad de scrollbar verticales para cuando la resolución de un celular con Android es muy pequeña aun así con la ayuda de las scrollbars el usuario pueda navegar en toda la interfaz gráfica de la aplicación sin ningún problema ya que puede deslizar las barras hasta donde el usuario deseé.Dentro del ScrollView tengo otro layout anidado de tipo LinearLayout para ir acomodando los componentes de la aplicación con la propiedad de que van a estar orientados verticalmente.





Bueno dentro de mi layout LinearLayout tengo un componente de tipo TextView este componente lo utilizo para poder mostrar en mi aplicación el texto que da referencia ala "Banda 1" de mi aplicación.





El TextView cuenta con un identificador único que se muestra en la siguiente linea.
android:id="@+id/MyBand01"

La linea siguiente hace referencia al tamaño de letra a usar.
android:textSize="10pt"

En el TextView la linea siguiente corresponde ala llamada de la cadena a mostrar en en layout:
android:text="@string/band01"

Después asigno los spinner yo utilice los spinner para poder mostrar la lista de colores disponibles de una forma sencilla.





Y se mostraría de la siguiente manera:

También contiene un botón que es el que hace la acción de calcular el valor de las resistencias ya una vez seleccionado los colores:





android:id="@+id/ButtonCalculate"
android:layout_height="wrap_content"
android:text="@string/calculate"
android:onClick="calculatenow"
android:layout_width="fill_parent">


strings.xml

El archivo strings.xml contiene las cadenas a utilizar dentro de la aplicación en ellas también se utilizan las cadenas del spinner para mostrar el nombre de los colores disponibles.


Resistors
Banda 1:
Escoja un color
Negro
Cafe
Rojo
Naranja
Amarillo
Verde
Azul
Violeta
Gris
Blanco



array.xml

Hace referencia para mostrar los colores disponibles dentro del spinner.


@string/color0
@string/color1
@string/color2
@string/color3
@string/color4
@string/color5
@string/color6
@string/color7
@string/color8
@string/color9



Bueno a continuación les dejo el codigo completo de cada uno de los xml que utilice.

main.xml
























strings.xml


Resistors
Banda 1 para calcular cualquier valor de cualquier resistencia!:
Escoja un color
Negro
Cafe
Rojo
Naranja
Amarillo
Verde
Azul
Violeta
Gris
Blanco
Banda 2:
Escoja un color
Negro
Cafe
Rojo
Naranja
Amarillo
Verde
Azul
Violeta
Gris
Blanco
Banda 3:
Escoja un color
Negro
Cafe
Rojo
Naranja
Amarillo
Verde
Azul
Violeta
Gris
Blanco
Tolerancia:
Escoja un color
Oro
Plata
Calcular



array.xml



@string/color0
@string/color1
@string/color2
@string/color3
@string/color4
@string/color5
@string/color6
@string/color7
@string/color8
@string/color9


@string/color00
@string/color01
@string/color02
@string/color03
@string/color04
@string/color05
@string/color06
@string/color07
@string/color08
@string/color09


@string/color000
@string/color001
@string/color002
@string/color003
@string/color004
@string/color005
@string/color006
@string/color007
@string/color008
@string/color009


@string/color0000
@string/color0001


Bueno y en la imagen siguiente es como luce la aplicación con la interfaz gráfica con los botones y los spinners.

Saludos...

Interfaz gráfica




Interfaz gráfica - Clase

Bueno esta semana en clase nos toco diseñar las interfaz gráfica de nuestro proyecto primero que es una interfaz gráfica:

La interfaz gráfica de usuario, conocida también como GUI (del inglés graphical user interface) es un programa informático que actúa de interfaz de usuario, utilizando un conjunto de imágenes y objetos gráficos para representar la información y acciones disponibles en la interfaz. Su principal uso, consiste en proporcionar un entorno visual sencillo para permitir la comunicación con el sistema operativo de una máquina o computador.


En la siguiente imagen se muestra algunos de los menús usados en las interfaces de usuario para la un manejo mas fácil entres los mas comunes se encuentran:

  • TextView.
  • Spinner.
  • Button.
  • ImageButton.
  • CheckBox.
  • EditText.
  • etc.
En las aplicaciones de Android al crear las las interfaces gráficas debe tenerse presente lo siguiente:

No incluir screenshots: Un error bastante común es el no incluir las dos pantallas de previsualización de ejemplo en la descripción de una aplicación en el Market. Muchos de nosotros, si no vemos una pantalla de la aplicación, buscamos otra.

¡Rotar, rotar, rotar!: Recuerda que a muchos usuarios les gusta rotar la pantalla del móvil para utilizarla tanto en vertical como en horizontal. Si no controlas cómo se ve en horizontal. Al menos quita la rotación automática que deforma la vista vertical.

Diseño: Una de las grandes verdades en el mundo del software es la que dice que los programas entran por los ojos. Hay que cuidar minimamente el diseño de una aplicación, para que sea agradable y usable.

Utiliza DIP en lugar de Pixels: Es muy común, venir de diseño gráfico tradicional y utilizar los pixels como unidad. Sin embargo, los pixels son un tipo de unidad estática, que no debería utilizarse (se vería bien en sólo el tipo de móvil que hayamos usado: pantallas pequeñas o medianas o grandes). En su lugar, una buena alternativa son los dip, un tipo de resolución que ajusta la densidad dependiendo de la resolución del dispositivo (viéndose bien en todas).


Aquí les dejo un boceto de la interfaz gráfica que hice de mi aplicación la idea del boceto es para tener una idea de como va hacer la interfaz gráfica de mi aplicación para después incorporarla ala aplicación:

Bueno aquí les dejo como se visualiza el menu donde se puede ver el icono de mi aplicación con el smbolo de ohm para entrar ala aplicación.

Aquí les dejo una captura de como es la interfaz gráfica de mi proyecto como se puede observar mi interfaz gráfica en su mayoría esta constituida de Spinner de los cuales se despliega una lista de los colores disponibles.


Aquí les dejo una captura de como se visualiza el Spinner con los colores disponibles.

Ya una vez seleccionado los colores y de cada una de las bandas y de la tolerancia dando click en el boton Calcular calcula el valor el valor de la resistencia y lo despliega.

Saludos...