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 lápiz, papel y el código que tanto te dificulta aprender.
En este tutorial usaremos los algoritmos de búsqueda lineal y ordenamiento por mezcla.
Empezamos por el algoritmo de búsqueda lineal, el cual busca en una lista un número seleccionado por el usuario.
<code>
import random #importa la libreria randomdefbusqueda_lineal(lista, objetivo):
match = Falsefor elemento in lista:
if elemento == objetivo:
match = Truebreakreturn match
if __name__ == '__main__':
tamano_de_lista = int(input('De que tamano sera la lista? '))
objetivo = int(input('Que numero quieres encontrar? '))
lista = [random.randint(0, 100) for i in range(tamano_de_lista)]
encontrado = busqueda_lineal(lista, objetivo)
print(lista)
print(f'El elemento {objetivo} {"esta" if encontrado else "no esta"} en la lista')
Primero debemos tener claro cual es el input que recibirá 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 que se buscara dentro de la 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 en la lista.
Lo puedes comprobar usando el siguiente código…
<code>
defbusqueda_lineal(lista, objetivo):
match = Falsefor elemento in lista:
if elemento == objetivo:
match = Truebreakreturn match
if __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"} en la lista')
Notamos que el programa empieza cuando invocamos la función búsqueda_lineal la cual toma de parámetro lista y objetivo.
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.
Y con este análisis se puede saber el funcionamiento de cualquier algoritmo, aunque mientras el algoritmo sea más complejo el análisistambién lo será.
Segundo ejemplo, ordenamiento por mezcla. Este algoritmo nos permite ordenar listas y tiene una complejidad de O(nlog n).
<code>
import random
defordenamiento_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 = 0while i < len(izquierda) and j < len(derecha):
if izquierda[i] < derecha[j]:
lista[k] = izquierda[i]
i += 1else:
lista[k] = derecha[j]
j += 1
k += 1while i < len(izquierda):
lista[k] = izquierda[i]
i += 1
k +=1while 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('De que tamano sera la lista? '))
lista = [random.randint(0, 100) for i in range(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 input que debe generar.
Input: lista = [8, 4, 6, 2]
Output: [2, 4, 6, 8]
Después verificamos que el código funciona con los valores arbitrarios.
<code>
import random
defordenamiento_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 = 0while i < len(izquierda) and j < len(derecha):
if izquierda[i] < derecha[j]:
lista[k] = izquierda[i]
i += 1else:
lista[k] = derecha[j]
j += 1
k += 1while i < len(izquierda):
lista[k] = izquierda[i]
i += 1
k +=1while 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).
Hasta este punto tenemos el ordenamiento de la primera izquierda, es decir [4, 8].
Tu trabajo es hacer el ordenamiento de la derecha [6, 2] y terminar de ordenar la lista.
Recuerda cuando quieras usar este análisis debes:
1.- Generar inputs arbitrarios y saber cual será el output que debe salir.
2.- Testear el código 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 ejercicios de Python: https://github.com/Mauro-CVO/Python_Programs
Link del repositorio con las imágenes usadas para el tutorial: https://drive.google.com/drive/folders/1OHRTb2r2C0WdX7fqNwZlX6Raxfw1K5KW?usp=sharing