En esta sección, exploraremos los diferentes tipos de algoritmos que existen y cómo se clasifican. Comprender los tipos de algoritmos es fundamental para seleccionar la estrategia adecuada para resolver un problema específico.

Clasificación de Algoritmos

Los algoritmos se pueden clasificar de varias maneras, dependiendo de su propósito, estructura y método de resolución. A continuación, se presentan algunas de las clasificaciones más comunes:

  1. Según su Propósito

  • Algoritmos de Búsqueda: Se utilizan para encontrar un elemento específico dentro de una estructura de datos. Ejemplos: Búsqueda Lineal, Búsqueda Binaria.
  • Algoritmos de Ordenamiento: Se utilizan para ordenar elementos en una estructura de datos. Ejemplos: Ordenamiento por Inserción, Ordenamiento por Mezcla (Merge Sort), Ordenamiento Rápido (Quick Sort).
  • Algoritmos de Optimización: Se utilizan para encontrar la mejor solución a un problema dado. Ejemplos: Algoritmo de Dijkstra, Algoritmo de Floyd-Warshall.
  • Algoritmos de Dividir y Vencerás: Se basan en dividir el problema en subproblemas más pequeños, resolverlos y combinar sus soluciones. Ejemplos: Merge Sort, Quick Sort.
  • Algoritmos Greedy (Avariciosos): Toman decisiones locales óptimas con la esperanza de encontrar una solución global óptima. Ejemplos: Algoritmo de Kruskal, Algoritmo de Prim.

  1. Según su Estructura

  • Algoritmos Iterativos: Utilizan bucles para repetir un conjunto de instrucciones hasta que se cumpla una condición. Ejemplo: Búsqueda Lineal.
  • Algoritmos Recursivos: Se llaman a sí mismos con subproblemas más pequeños hasta que se alcanza una condición base. Ejemplo: Búsqueda Binaria Recursiva, Merge Sort.

  1. Según su Método de Resolución

  • Algoritmos Determinísticos: Producen el mismo resultado para una entrada dada cada vez que se ejecutan. Ejemplo: Algoritmo de Euclides para encontrar el máximo común divisor.
  • Algoritmos No Determinísticos: Pueden producir diferentes resultados para la misma entrada en diferentes ejecuciones. Ejemplo: Algoritmos Genéticos.

  1. Según su Complejidad

  • Algoritmos de Complejidad Constante (O(1)): El tiempo de ejecución no depende del tamaño de la entrada. Ejemplo: Acceso a un elemento en un array.
  • Algoritmos de Complejidad Logarítmica (O(log n)): El tiempo de ejecución crece logarítmicamente con el tamaño de la entrada. Ejemplo: Búsqueda Binaria.
  • Algoritmos de Complejidad Lineal (O(n)): El tiempo de ejecución crece linealmente con el tamaño de la entrada. Ejemplo: Búsqueda Lineal.
  • Algoritmos de Complejidad Cuadrática (O(n^2)): El tiempo de ejecución crece cuadráticamente con el tamaño de la entrada. Ejemplo: Ordenamiento por Burbuja.
  • Algoritmos de Complejidad Exponencial (O(2^n)): El tiempo de ejecución crece exponencialmente con el tamaño de la entrada. Ejemplo: Algoritmos de Backtracking.

Ejemplos Prácticos

Búsqueda Lineal

La búsqueda lineal es un algoritmo iterativo que recorre una lista de elementos para encontrar un elemento específico.

def busqueda_lineal(lista, objetivo):
    for i in range(len(lista)):
        if lista[i] == objetivo:
            return i
    return -1

# Ejemplo de uso
lista = [2, 4, 6, 8, 10]
objetivo = 6
resultado = busqueda_lineal(lista, objetivo)
print(f'Elemento encontrado en el índice: {resultado}')

Búsqueda Binaria

La búsqueda binaria es un algoritmo recursivo que encuentra un elemento en una lista ordenada dividiendo repetidamente el rango de búsqueda a la mitad.

def busqueda_binaria(lista, objetivo, inicio, fin):
    if inicio > fin:
        return -1
    medio = (inicio + fin) // 2
    if lista[medio] == objetivo:
        return medio
    elif lista[medio] < objetivo:
        return busqueda_binaria(lista, objetivo, medio + 1, fin)
    else:
        return busqueda_binaria(lista, objetivo, inicio, medio - 1)

# Ejemplo de uso
lista = [2, 4, 6, 8, 10]
objetivo = 6
resultado = busqueda_binaria(lista, objetivo, 0, len(lista) - 1)
print(f'Elemento encontrado en el índice: {resultado}')

Ejercicios Prácticos

Ejercicio 1: Implementar Búsqueda Lineal

Instrucciones: Implementa una función de búsqueda lineal que reciba una lista y un objetivo, y devuelva el índice del objetivo en la lista o -1 si no se encuentra.

def busqueda_lineal(lista, objetivo):
    # Tu código aquí
    pass

# Prueba tu función
lista = [1, 3, 5, 7, 9]
objetivo = 5
print(busqueda_lineal(lista, objetivo))  # Debe imprimir 2

Ejercicio 2: Implementar Búsqueda Binaria

Instrucciones: Implementa una función de búsqueda binaria que reciba una lista ordenada, un objetivo, el índice de inicio y el índice de fin, y devuelva el índice del objetivo en la lista o -1 si no se encuentra.

def busqueda_binaria(lista, objetivo, inicio, fin):
    # Tu código aquí
    pass

# Prueba tu función
lista = [1, 3, 5, 7, 9]
objetivo = 7
print(busqueda_binaria(lista, objetivo, 0, len(lista) - 1))  # Debe imprimir 3

Conclusión

En esta sección, hemos explorado los diferentes tipos de algoritmos y cómo se clasifican según su propósito, estructura, método de resolución y complejidad. También hemos visto ejemplos prácticos de búsqueda lineal y búsqueda binaria, y hemos proporcionado ejercicios para reforzar estos conceptos. Con esta base, estarás mejor preparado para abordar el análisis y diseño de algoritmos en los módulos siguientes.

© Copyright 2024. Todos los derechos reservados