Menu iconMenu icon
Algoritmos y Estructuras de Datos con Python

Capítulo 5: Operaciones de Búsqueda y Eficiencia

Ejercicios Prácticos: Capítulo 5

Ejercicio 1

Implementa una función que realice una búsqueda lineal en una lista dada.

Entrada: Una lista y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def linear_search(lst, target):
    for i in range(len(lst)):
        if lst[i] == target:
            return i
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(linear_search(lst, 5))  # Output: 2
print(linear_search(lst, 6))  # Output: -1

Ejercicio 2

Implementa una función de búsqueda binaria sin usar recursión.

Entrada: Una lista ordenada y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def binary_search(lst, target):
    low, high = 0, len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] == target:
            return mid
        elif lst[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(binary_search(lst, 5))  # Output: 2
print(binary_search(lst, 6))  # Output: -1

Ejercicio 3

Dada la explicación anterior sobre el hashing, implementa una función hash básica para cadenas que distribuya los caracteres de manera uniforme.

Sugerencia: Para simplificar, asume que la cadena de entrada consiste solo en letras minúsculas del alfabeto inglés, y el tamaño de la tabla hash es 100.

def simple_hash(s):
    total = 0
    for char in s:
        total += ord(char) - ord('a') + 1
    return total % 100

# Test
print(simple_hash('hello'))  # This will give an output between 0 and 99.

Ejercicio 4

Evalúa las complejidades temporales:

  1. Un bucle que se ejecuta n veces dentro de otro bucle que se ejecuta m veces.
  2. Una función que divide una lista por la mitad repetidamente hasta que la lista tenga una longitud de 1.
  3. Un algoritmo que procesa cada elemento en una lista, y para cada elemento, verifica todos los demás elementos en la lista.

Soluciones:

  1. O(n * m)
  2. O(log n)
  3. O(n^2)

Ejercicio 5

Reflexionando sobre la eficiencia del hashing: Si tenemos una tabla hash de tamaño 100 y 50 entradas, ¿cuál es el factor de carga? Cálculalo.

Soluciones:
Factor de carga = número de entradas / tamaño de la tabla = 50/100 = 0.5 o 50%.

Estos ejercicios te darán una exposición práctica a los conceptos presentados en el Capítulo 5. Están diseñados para combinar preguntas de implementación y teóricas para una comprensión completa.

Ejercicios Prácticos: Capítulo 5

Ejercicio 1

Implementa una función que realice una búsqueda lineal en una lista dada.

Entrada: Una lista y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def linear_search(lst, target):
    for i in range(len(lst)):
        if lst[i] == target:
            return i
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(linear_search(lst, 5))  # Output: 2
print(linear_search(lst, 6))  # Output: -1

Ejercicio 2

Implementa una función de búsqueda binaria sin usar recursión.

Entrada: Una lista ordenada y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def binary_search(lst, target):
    low, high = 0, len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] == target:
            return mid
        elif lst[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(binary_search(lst, 5))  # Output: 2
print(binary_search(lst, 6))  # Output: -1

Ejercicio 3

Dada la explicación anterior sobre el hashing, implementa una función hash básica para cadenas que distribuya los caracteres de manera uniforme.

Sugerencia: Para simplificar, asume que la cadena de entrada consiste solo en letras minúsculas del alfabeto inglés, y el tamaño de la tabla hash es 100.

def simple_hash(s):
    total = 0
    for char in s:
        total += ord(char) - ord('a') + 1
    return total % 100

# Test
print(simple_hash('hello'))  # This will give an output between 0 and 99.

Ejercicio 4

Evalúa las complejidades temporales:

  1. Un bucle que se ejecuta n veces dentro de otro bucle que se ejecuta m veces.
  2. Una función que divide una lista por la mitad repetidamente hasta que la lista tenga una longitud de 1.
  3. Un algoritmo que procesa cada elemento en una lista, y para cada elemento, verifica todos los demás elementos en la lista.

Soluciones:

  1. O(n * m)
  2. O(log n)
  3. O(n^2)

Ejercicio 5

Reflexionando sobre la eficiencia del hashing: Si tenemos una tabla hash de tamaño 100 y 50 entradas, ¿cuál es el factor de carga? Cálculalo.

Soluciones:
Factor de carga = número de entradas / tamaño de la tabla = 50/100 = 0.5 o 50%.

Estos ejercicios te darán una exposición práctica a los conceptos presentados en el Capítulo 5. Están diseñados para combinar preguntas de implementación y teóricas para una comprensión completa.

Ejercicios Prácticos: Capítulo 5

Ejercicio 1

Implementa una función que realice una búsqueda lineal en una lista dada.

Entrada: Una lista y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def linear_search(lst, target):
    for i in range(len(lst)):
        if lst[i] == target:
            return i
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(linear_search(lst, 5))  # Output: 2
print(linear_search(lst, 6))  # Output: -1

Ejercicio 2

Implementa una función de búsqueda binaria sin usar recursión.

Entrada: Una lista ordenada y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def binary_search(lst, target):
    low, high = 0, len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] == target:
            return mid
        elif lst[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(binary_search(lst, 5))  # Output: 2
print(binary_search(lst, 6))  # Output: -1

Ejercicio 3

Dada la explicación anterior sobre el hashing, implementa una función hash básica para cadenas que distribuya los caracteres de manera uniforme.

Sugerencia: Para simplificar, asume que la cadena de entrada consiste solo en letras minúsculas del alfabeto inglés, y el tamaño de la tabla hash es 100.

def simple_hash(s):
    total = 0
    for char in s:
        total += ord(char) - ord('a') + 1
    return total % 100

# Test
print(simple_hash('hello'))  # This will give an output between 0 and 99.

Ejercicio 4

Evalúa las complejidades temporales:

  1. Un bucle que se ejecuta n veces dentro de otro bucle que se ejecuta m veces.
  2. Una función que divide una lista por la mitad repetidamente hasta que la lista tenga una longitud de 1.
  3. Un algoritmo que procesa cada elemento en una lista, y para cada elemento, verifica todos los demás elementos en la lista.

Soluciones:

  1. O(n * m)
  2. O(log n)
  3. O(n^2)

Ejercicio 5

Reflexionando sobre la eficiencia del hashing: Si tenemos una tabla hash de tamaño 100 y 50 entradas, ¿cuál es el factor de carga? Cálculalo.

Soluciones:
Factor de carga = número de entradas / tamaño de la tabla = 50/100 = 0.5 o 50%.

Estos ejercicios te darán una exposición práctica a los conceptos presentados en el Capítulo 5. Están diseñados para combinar preguntas de implementación y teóricas para una comprensión completa.

Ejercicios Prácticos: Capítulo 5

Ejercicio 1

Implementa una función que realice una búsqueda lineal en una lista dada.

Entrada: Una lista y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def linear_search(lst, target):
    for i in range(len(lst)):
        if lst[i] == target:
            return i
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(linear_search(lst, 5))  # Output: 2
print(linear_search(lst, 6))  # Output: -1

Ejercicio 2

Implementa una función de búsqueda binaria sin usar recursión.

Entrada: Una lista ordenada y un valor objetivo.

Salida: El índice del valor objetivo en la lista. Si el valor objetivo no está presente, devuelve -1.

def binary_search(lst, target):
    low, high = 0, len(lst) - 1
    while low <= high:
        mid = (low + high) // 2
        if lst[mid] == target:
            return mid
        elif lst[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# Test
lst = [1, 3, 5, 7, 9, 11]
print(binary_search(lst, 5))  # Output: 2
print(binary_search(lst, 6))  # Output: -1

Ejercicio 3

Dada la explicación anterior sobre el hashing, implementa una función hash básica para cadenas que distribuya los caracteres de manera uniforme.

Sugerencia: Para simplificar, asume que la cadena de entrada consiste solo en letras minúsculas del alfabeto inglés, y el tamaño de la tabla hash es 100.

def simple_hash(s):
    total = 0
    for char in s:
        total += ord(char) - ord('a') + 1
    return total % 100

# Test
print(simple_hash('hello'))  # This will give an output between 0 and 99.

Ejercicio 4

Evalúa las complejidades temporales:

  1. Un bucle que se ejecuta n veces dentro de otro bucle que se ejecuta m veces.
  2. Una función que divide una lista por la mitad repetidamente hasta que la lista tenga una longitud de 1.
  3. Un algoritmo que procesa cada elemento en una lista, y para cada elemento, verifica todos los demás elementos en la lista.

Soluciones:

  1. O(n * m)
  2. O(log n)
  3. O(n^2)

Ejercicio 5

Reflexionando sobre la eficiencia del hashing: Si tenemos una tabla hash de tamaño 100 y 50 entradas, ¿cuál es el factor de carga? Cálculalo.

Soluciones:
Factor de carga = número de entradas / tamaño de la tabla = 50/100 = 0.5 o 50%.

Estos ejercicios te darán una exposición práctica a los conceptos presentados en el Capítulo 5. Están diseñados para combinar preguntas de implementación y teóricas para una comprensión completa.