2

Como entender cualquier algoritmo. Guía Definitiva!!!

Hola, en este tutorial les enseñare a entender cualquier algoritmo
desde los más sencillos hasta los más complicados.

Lo único que necesitas es un lapiz, papel y el código que tanto
te dificulta aprender.

En este tutorial usaremos los algoritmos de busqueda lineal y
ordenamiento por mezcla.

Empezemos por el algoritmo de busqueda lineal, el cual busca en una lista un número seleccionado por el usuario.


import random #importa la libreria random

def busqueda_lineal(lista, objetivo):
    match = False

    for elemento in lista: 
        if elemento == objetivo:
            match = True
            breakreturnmatchif __name__ == '__main__':

    tamano_de_lista = int(input('Deque tamano sera la lista? '))       
    objetivo = int(input('Que numero quieres encontrar? '))

    lista = [random.randint(0, 100) for i inrange(tamano_de_lista)]    

    encontrado = busqueda_lineal(lista, objetivo)
    print(lista)
    print(f'El elemento {objetivo} {"esta"if encontrado else"no esta"} enla lista')

    ```

Primero debemos tener claro cual es el inputque recibira el algoritmo y cual es el output deseado.

Para este caso el input es una lista aleatoria con números del 1 al 100 y un número quese buscara dentro dela lista, 
para simplificarlo podemos crear inputs arbitrarios.
Por ejemplo: lista = [1,2,3,4] y objetivo = 4
El resultado o output sería, El elemento 4 esta enla lista.

Lo puedes comprobar usando el siguiente código...

``` <code>

def busqueda_lineal(lista, objetivo):
    match = False

    for elemento in lista: 
        if elemento == objetivo:
            match = True
            breakreturnmatchif __name__ == '__main__':
    lista = [1, 2, 3, 4, 5]    
    objetivo = 4

    encontrado = busqueda_lineal(lista, objetivo)
    print(lista)
    print(f'El elemento {objetivo} {"esta"if encontrado else"no esta"} enla lista')

    ```

Notamos que el programa empiza cuando invocamos la función busqueda_lineal la cual toma de parametro lista y objetivo.

![](https://drive.google.com/file/d/1a0Pq4y5jQc-60U57lVoxM5K17E8h4QfM/view?usp=sharing)

Sabiendo cual es el valor de match, nos regresamos a encontrado, donde se invoco la función, entonces encontrado == True y se 
ejecuta la última línea del código.

![](https://drive.google.com/file/d/1a4r57ugXe2ni_qPaR0kuYmlIaKakMNWi/view?usp=sharing)

Y con este analisis se puede saber el funcionamiento de cualquier algoritmo, aunque mientras el algoritmo sea más complejo el analisis
tambien lo será.


Segundo ejemplo, ordenamiento por lista. Este algoritmo nos permite ordenar listas y tiene una complejidad de O(nlog n).

``` <code>
import random

def ordenamiento_por_mezcla(lista):
    if len(lista) > 1:
        medio = len(lista) // 2
        izquierda = lista[:medio]
        derecha = lista[medio:]
        print(izquierda, '*' * 5, derecha)

        # llamada recursiva en cada mitad
        ordenamiento_por_mezcla(izquierda)
        ordenamiento_por_mezcla(derecha)

        # Iteradores para recorrer las dos sublistas
        i = 0
        j = 0
        # Iterador para la lista principal
        k = 0

        while i < len(izquierda) and j < len(derecha):
            if izquierda[i] < derecha[j]:
                lista[k] = izquierda[i]
                i += 1
            else:
                lista[k] = derecha[j]
                j += 1

            k += 1

        while i < len(izquierda):
            lista[k] = izquierda[i]
            i += 1
            k +=1

        while j < len(derecha):
            lista[k] = derecha[j]
            j += 1
            k += 1
        
        print(f'izquierda {izquierda}, derecha {derecha}')
        print(lista)
        print('-' * 50)

    return lista


if __name__ == '__main__':
    tamano_de_lista = int(input('Deque tamano sera la lista? '))

    lista = [random.randint(0, 100) for i inrange(tamano_de_lista)]
    print(lista)
    print('-' * 20)

    lista_ordenada = ordenamiento_por_mezcla(lista)
    print(lista_ordenada)

    ```

    De igual forma creamos inputs arbitrarios y establecemos el inputque debe generar.

    Input: lista = [8, 4, 6, 2]
    Output: [2, 4, 6, 8]

    Despues verificamos que el codigo funciona con los valores arbitrarios.

``` <code>
import random

def ordenamiento_por_mezcla(lista):
    if len(lista) > 1:
        medio = len(lista) // 2
        izquierda = lista[:medio]
        derecha = lista[medio:]
        print(izquierda, '*' * 5, derecha)

        # llamada recursiva en cada mitad
        ordenamiento_por_mezcla(izquierda)
        ordenamiento_por_mezcla(derecha)

        # Iteradores para recorrer las dos sublistas
        i = 0
        j = 0
        # Iterador para la lista principal
        k = 0

        while i < len(izquierda) and j < len(derecha):
            if izquierda[i] < derecha[j]:
                lista[k] = izquierda[i]
                i += 1
            else:
                lista[k] = derecha[j]
                j += 1

            k += 1

        while i < len(izquierda):
            lista[k] = izquierda[i]
            i += 1
            k +=1

        while j < len(derecha):
            lista[k] = derecha[j]
            j += 1
            k += 1
        
        print(f'izquierda {izquierda}, derecha {derecha}')
        print(lista)
        print('-' * 50)

    return lista


if __name__ == '__main__':
    
    lista = [8, 4, 6, 2]

    lista_ordenada = ordenamiento_por_mezcla(lista)
    print(lista_ordenada)

    ```


Ahora, realizamos el proceso a mano, empezando por donde se invoca la primera función, en este caso 
en lista_ordenada = ordenamiento_por_mezcla(lista).

![](https://drive.google.com/file/d/1aP3qOrlkJsLMPzQC25vD8Wq1SD6qAcJL/view?usp=sharing)

![](https://drive.google.com/file/d/1aUdSPAve_1FAWullKFjNnlYvkEZDI-3D/view?usp=sharing)

![](https://drive.google.com/file/d/1aJpA9HDB-zppYOPm6fvQ5DBshmzckyNO/view?usp=sharing)

Hasta este punto tenemos el ordenamiento dela primera izquierda, es decir [4, 8].

Tu trabajo es hacer el ordenamiento dela derecha [6, 2] y terminar de ordenar la lista.

Recuerda cuando quieras usar este analisis debes:

1.- Generar inputs arbitrarios y saber cual será el output que debe salir.
2.- Testear el codigo con los inputs dados para verificar que el output es correcto.
3.- Y por último ejecutar el código a mano y tratar de llegar al output deseado.

Eso es todo por mi parte, espero te haya gustado este tutorial.

Link a mi repositorio de GitHub con varios ejercios de Python: https://github.com/Mauro-CVO/Python_Programs
Escribe tu comentario
+ 2