lunes, 23 de febrero de 2015

Algoritmo de Ordenamiento

¿Qué es ordenamiento?

Es la operación de arreglar los registros de una tabla en algún orden secuencial de acuerdo a un criterio de ordenamiento.
El propósito principal de un ordenamiento es el de facilitar las búsquedas de los miembros del conjunto ordenado.


A continuación se mostrarán los algoritmos de ordenamiento de los elementos de un vector.


QUICKSORT


Es actualmente el más eficiente y veloz de los métodos de ordenación interna. Es también conocido con el nombre del método rápido y de ordenamiento por partición.


Recibe el nombre de Quick Sort por la velocidad con que ordena los elementos del arreglo. Su autor C.A. Hoare lo bautizó así.

Código en Python:



def partition(list2, first, last):
    sred = (first + last)/2
    if list2[first] > list2 [sred]:
        list2[first], list2[sred] = list2[sred], list2[first] 
    if list2[first] > list2 [last]:
        list2[first], list2[last] = list2[last], list2[first]  
    if list2[sred] > list2[last]:
        list2[sred], list2[last] = list2[last], list2[sred]    
    list2 [sred], list2 [first] = list2[first], list2[sred]    
    pivot = first
    i = first + 1
    j = last
  
    while True:
        while i <= last and list2[i] <= list2[pivot]:
            i += 1
        while j >= first and list2[j] > list2[pivot]:
            j -= 1
        if i >= j:
            break
        else:
            list2[i], list2[j] = list2[j], list2[i]  # swap
    list2[j], list2[pivot] = list2[pivot], list2[j]  # swap
    return j



def quick_sort(list2):
    quick_sort_r(list2, 0, len(list2) - 1)

    

def quick_sort_r(list2 , first, last):
    if last > first:
        pivot = partition(list2, first, last)
        quick_sort_r(list2, first, pivot - 1)
        quick_sort_r(list2, pivot + 1, last)




def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]
        

lista=[]
cn=int(raw_input("Cantidad de numeros a ingresar: "))

for i in range(0,cn):
    lista.append(int(raw_input("Ingrese numero %d : " % i)))


quick_sort(lista)

imprimeLista(lista,len(lista))




 MÉTODO DE LA BURBUJA

    Este método consiste en acomodar el vector moviendo el mayor hasta la última casilla comenzando desde la casilla cero del vector hasta haber acomodado el número más grande el la última posición, una vez acomodado el más grande, prosigue a encontrar  y acomodar el siguiente más grande comparando de nuevo los números desde el inicio del vector, y así sigue hasta ordenar todo los elementos el arreglo. 

Código en Python

def ordenamientoBurbuja(lista,tam):
    for i in range(1,tam):
        for j in range(0,tam-i):
            if(lista[j] > lista[j+1]):
                k = lista[j+1]
                lista[j+1] = lista[j]
                lista[j] = k;

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
ordenamientoBurbuja(A,len(A))

imprimeLista(A,len(A))




SELECTION SORT


Su funcionamiento es el siguiente:
  • Buscar el mínimo elemento de la lista
  • Intercambiarlo con el primero
  • Buscar el siguiente mínimo en el resto de la lista
  • Intercambiarlo con el segundo
Y en general:
  • Buscar el mínimo elemento entre una posición i y el final de la lista
  • Intercambiar el mínimo con el elemento de la posición i

Código en Python


def print_lista(lista,tam):
    for i in range(0,tam):
        print lista[i]


# Ordenamiento por selección
def ordenamiento_porseleccion(lista):
    # Itera por todo el array
    for posActual in range( len(lista) ):
        # Encuentra la posición del valor más pequeño
        # Empieza por la posición actual
        posMin = posActual
        # Escanea de izquierda a derecha (hasta el final de la lista)
        for escanPos in range(posActual+1, len(lista) ):
            # Es ésta la posición más pequeña?
            if lista[escanPos] < lista[posMin]:
                # Si lo es, la marcamos como la más pequeña
                posMin = escanPos
        # intercambia los dos valores
        temp = lista[posMin]
        lista[posMin] = lista[posActual]
        lista[posActual] = temp

    
# Creamos una lista con números aleatorios
lista=[]
cn=int(raw_input("Cantidad de numeros a ingresar: "))
for i in range(0,cn):
    lista.append(int(raw_input("Ingrese numero %d : " % i)))
    

ordenamiento_porseleccion(lista)
print_lista(lista,len(lista))



INSERTION SORT

La idea de este algoritmo de ordenación consiste en ir insertando un elemento de la lista ó un arreglo en la parte ordenada de la misma, asumiendo que el primer elemento es la parte ordenada, el algoritmo ira comparando un elemento de la parte desordenada de la lista con los elementos de la parte ordenada, insertando el elemento en la posición correcta dentro de la parte ordenada, y así sucesivamente hasta obtener la lista ordenada. Para explicarlo mejor nos basaremos en el siguiente enunciado:

“Para cada elemento de la lista después del primero, comparar los elementos con los anteriores desplazando una posición a la derecha a todos los elementos anteriores que cumplan con la comparación y luego colocar el elemento en la posición del último elemento anterior desplazado.”

Ahora veamos un ejemplo ordenando de menor a mayor (ascendentemente) la siguiente lista de números:

7, 3, 10, 1, 9

La lista tiene 5 elementos, con lo cual tendremos que recorrer la lista 4 veces. Ya que la comparación se hará desde el segundo elemento de la lista, es decir recorremos la lista después del primer elemento hasta el último.

1er. recorrido: Se toma 3 para comparar con los elementos anteriores. Los elementos anteriores son: 7

3
7
10
1
9

La comparación 3<7, es verdadera, entonces desplazamos el 7 una posición a la derecha.

3

7
10
1
9

Al no haber más elementos a comparar colocamos el 3 en la posición del último elemento desplazado.


3
7
10
1
9

2do. recorrido: Se toma 10 para comparar con los elementos anteriores. Los elementos anteriores son: 3, 7


10
3
7

1
9

La comparación 10<7, es falsa, entonces no desplazamos nada y se termina este recorrido.


3
7
10
1
9

3er. recorrido: Se toma 1 para comparar con los elementos anteriores. Los elementos anteriores son: 3, 7, 10


1
3
7
10

9

La comparación 1<10, es verdadera, entonces desplazamos el 10 una posición a la derecha.


1
3
7

10
9

La comparación 1<7, es verdadera, entonces desplazamos el 7 una posición a la derecha.


1
3
7
10
9

La comparación 1<3, es verdadera, entonces desplazamos el 3 una posición a la derecha.


1

3
7
10
9

Al no haber más elementos a comparar colocamos el 1 en la posición del último elemento desplazado.


1
3
7
10
9

4to. recorrido: Se toma 9 para comparar con los elementos anteriores. Los elementos anteriores son: 1, 3, 7, 10


9
1
3
7
10


La comparación 9<10 es verdadera, entonces desplazamos el 10 una posición a la derecha.

9
1
3
7

10

La comparación 9<7 es falsa, entonces no desplazamos nada y se termina este recorrido, colocando el 9 en la posición del último elemento desplazado.

1
3
7
9
10



Código Python



def insertion_sort(list2):
    for i in range(1, len(list2)):
        save = list2[i]
        j = i
        while j > 0 and list2[j - 1] > save:
            list2[j] = list2[j - 1]
            j -= 1
        list2[j] = save


def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]
        

lista=[]
cn=int(raw_input("Cantidad de numeros a ingresar: "))
for i in range(0,cn):
    lista.append(int(raw_input("Ingrese numero %d : " % i)))


insertion_sort(lista)
imprimeLista(lista,len(lista))


Merge Sort

El algoritmo de ordenamiento por mezcla  es un algoritmo de ordenamiento externo estable basado en la técnica divide y vencerás
 Si el vector tiene más de dos elementos se lo divide en dos mitades, se invoca recursivamente al algoritmo y luego se hace una intercalación de las dos mitades ordenadas.

Código Python:


def merge_sort(list2):
    merge_sort_r(list2, 0, len(list2) -1)

    
# merge sort recursive (used by merge_sort)
def merge_sort_r(list2, first, last):
    if first < last:
        sred = (first + last)/2
        merge_sort_r(list2, first, sred)
        merge_sort_r(list2, sred + 1, last)
        merge(list2, first, last, sred)

        
# merge (used by merge_sort_r)
def merge(list2, first, last, sred):
    helper_list = []
    i = first
    j = sred + 1
    while i <= sred and j <= last:
        if list2 [i] <= list2 [j]:
            helper_list.append(list2[i])
            i += 1
        else:
            helper_list.append(list2 [j])
            j += 1
    while i <= sred:
        helper_list.append(list2[i])
        i +=1
    while j <= last:
        helper_list.append(list2[j])
        j += 1
    for k in range(0, last - first + 1):
        list2[first + k] = helper_list [k]
        



def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]
        

lista=[]
cn=int(raw_input("Cantidad de numeros a ingresar: "))
for i in range(0,cn):
    lista.append(int(raw_input("Ingrese numero %d : " % i)))


merge_sort(lista)
imprimeLista(lista,len(lista))




Referencias


http://adrorodri.blogspot.mx/2012/09/metodo-de-ordenacion-merge-sort.html

http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap08-02-Ordenamiento%20por%20insercion%20%28Insertion%20sort%29.php
http://es.wikipedia.org/wiki/Ordenamiento_por_selecci%C3%B3n
http://www.estructuradedatos.galeon.com/burbujatext.htm
http://www.angelfire.com/wy2/est_info/quicksort.html

https://www.daniweb.com/software-development/python/code/216689/sorting-algorithms-in-python
https://saforas.wordpress.com/2011/01/24/codigo-python-ordenamiento-burbuja/
http://www.monografias.com/trabajos/algordenam/algordenam.shtml#ixzz3Sd09L7N6

martes, 17 de febrero de 2015

Situación del Cómputo Paralelo en el Mercado y la Industria.

En la actualidad la programación en paralelo es importante debido a que mejora la velocidad al solucionar los problemas. Esto se debe a que consiste en solucionar varios problemas al mismo tiempo. 

Con el fin de conocer si los actuales desarrolladores de software, estudiantes de ingeniería en computación o egresados, saben manejar este tipo de programación, como consideran  y manejan en su entorno la programación paralela, se aplicó la siguiente encuesta:











Y los resultados finales de la encuesta fueron los siguientes:





Ir a la liga: https://docs.google.com/forms/d/1RC8q3M6rX2rmy_QMu9W0H9X-oFyPpOcv0RNfJkCDfiE/viewanalytics


Como se puede notar en las gráficas, hoy en día mucha gente ha llegado a trabajar con hilos, sin embargo, nadie domina el tema, pero es considerado importante.

La mayoría de la gente ven importante el código paralelo para poder optimizar el desempeño multicore con poco esfuerzo así como aumentar el desempeño con equipos más sencillos.

Las encuestas fueron aplicadas en varios sectores, pero nos enfocamos más en los estudiantes que están por terminar la carrera de Ingeniería en Computación o en egresados de la misma. La mayoría maneja el lengaje de programación Java seguido por C/C++.


Al ver los resultados nos podemos dar cuenta que a pesar de que muchos consideran el cómputo paralelo como parte importante y como una optimización del desempeño del código, no es muy común que lo utilicen.



Cooperación de :
Alejandro Salvador Hernández.
Luis Eduardo Beltrán Domínguez
Pedro Jimenez

miércoles, 11 de febrero de 2015

Computadoras Cuánticas.




Todas las computadoras de hoy funcionan de acuerdo con las leyes de la llamada física clásica, las cuales realizan excelentes cosas y es una buena herramienta, pero a los físicos les interesaba, en particular, el problema de hacer simulaciones del mundo real, que es cuántico, por medio de computadoras clásicas. Al intentarlo por medio de una computadora clásica se dieron cuenta que sólo se pueden resolver problemas muy simples y de poco interés, en los que intervienen sólo unas cuantas partículas. Si el número de partículas aumenta, la capacidad de la máquina debe aumentar de la misma manera. Para simular procesos cuánticos no tan difíciles, la computadora clásica tendría que ser gigantesca, porque su capacidad aumenta.


DESARROLLO

Computación Cuántica.


Es un paradigma de computación distinto al de la computación clásica. Se basa en el uso de qubits en lugar de bits, y da lugar a nuevas puertas lógicas que hacen posibles nuevos algoritmos.

Una computadora cuántica es un dispositivo informático que hace uso directo del fenómeno de la mecánica cuántica, como la superposición y el entrelazamiento cuántico, para realizar operaciones sobre datos.

Un Poco De Historia...

Richard Feynman Propuso la utilización de sistemas cuánticos sencillos, llamados qubits (de quantum bits), como elementos estructurales básicos de una nueva computadora para poder desarrollar y resolver problemas más complejos del mundo real. Así nace el sueño de una computadora cuántica.

Pero la peculiaridad cuántica más importante es el llamado principio de superposición. Si en el mundo clásico un objeto puede estar en uno de varios estados distintos (por ejemplo, en distintas posiciones, o con distintos valores de la energía), en mecánica cuántica puede estar, además, en combinaciones de todos los estados posibles. 

En 1985 David Deutsch dio una base matemática sólida a la propuesta de Feynman. Deutsch explicó cómo podría funcionar una computadora cuántica universal y describió su funcionamiento como secuencias de operaciones elementales sobre qubits. La computadora cuántica de Deutsch es muy parecida a la máquina universal de Turing, pero con qubits en el lugar de bits clásicos. Sin embargo, la operación de una computadora cuántica es muy distinta de la operación de la máquina de Turing. Había que formular algoritmos computacionales cuánticos.

 Pensemos en la siguiente analogía. Supongamos que queremos comunicar información sobre una figura geométrica tridimensional muy complicada por medio de fotografías. La computadora clásica funcionaría entonces como una cámara que sólo maneja fotos en blanco y negro. En cambio una computadora cuántica podría transmitir todos los tonos de gris además del blanco y negro. Es claro que necesitaremos muchas menos fotos para representar el objeto debido a la riqueza de la descripción cuántica.

El obstáculo principal para la construcción de una computadora cuántica es la fragilidad de los estados superpuestos de los qubits con el mundo exterior debe disminuirse al nivel más bajo posible para evitar la decoherencia de los estados superpuestos. Las influencias no controlables destruirían por completo la delicada superposición y el “enredamiento” de los qubits, propiedades que son la base de todos los algoritmos computacionales cuánticos. 

CONCLUSIONES

En un ordenador clásico, la unidad base es el bit. Éste puede tener forma de los números 0 ó 1.
En una computadora cuántica, los bits pueden adoptar otros estados (llamados qubits), y con ello son capaces de transferir cantidades mucho mayores de información.
Las computadoras cuánticas pueden resolver o acercarse más a un resultado real aplicado a nuestro entorno.


REFERENCIAS

http://www.abc.es/20101216/ciencia/diez-grandes-descubrimientos-cientificos-201012161615.html
http://www.invdes.com.mx/tecnologia-mobil/3910-computadoras-cuanticas-el-nuevo-horizonte-de-la-informatica
http://es.wikipedia.org/wiki/Computaci%C3%B3n_cu%C3%A1ntica
http://www.comoves.unam.mx/numeros/articulo/67/computacion-cuantica
http://www.alegsa.com.ar/Dic/computadora%20cuantica.php