En aquest tema, explorarem els conceptes bàsics dels algoritmes de cerca, que són fonamentals en la programació i la informàtica. Els algoritmes de cerca s'utilitzen per trobar un element específic dins d'una estructura de dades com ara una llista o un array. Aprendrem sobre els dos tipus d'algoritmes de cerca més comuns: la cerca lineal i la cerca binària.

Objectius d'aprenentatge

Al final d'aquest tema, hauràs de ser capaç de:

  1. Comprendre què és un algoritme de cerca.
  2. Implementar la cerca lineal.
  3. Implementar la cerca binària.
  4. Comparar l'eficiència dels dos tipus de cerca.

  1. Cerca Lineal

Descripció

La cerca lineal és el mètode més simple de cerca. Consisteix a recórrer la llista o array element per element fins a trobar l'element desitjat o fins a arribar al final de la llista.

Exemple de codi

def cerca_lineal(llista, element):
    for i in range(len(llista)):
        if llista[i] == element:
            return i  # Retorna la posició de l'element
    return -1  # Retorna -1 si l'element no es troba a la llista

# Exemple d'ús
llista = [4, 2, 7, 1, 3]
element = 7
resultat = cerca_lineal(llista, element)
print(f"L'element {element} es troba a la posició {resultat}")

Explicació del codi

  1. La funció cerca_lineal pren com a paràmetres una llista i l'element que es vol cercar.
  2. Utilitza un bucle for per recórrer cada element de la llista.
  3. Si l'element actual és igual a l'element que es busca, retorna la posició de l'element.
  4. Si el bucle acaba sense trobar l'element, retorna -1.

Exercici pràctic

Implementa una funció de cerca lineal que cerqui un número en una llista de nombres i retorni la posició de l'última aparició del número.

def cerca_lineal_ultima_aparicio(llista, element):
    # Implementa la funció aquí
    pass

# Prova la teva funció
llista = [4, 2, 7, 1, 3, 7, 8]
element = 7
resultat = cerca_lineal_ultima_aparicio(llista, element)
print(f"L'última aparició de l'element {element} es troba a la posició {resultat}")

Solució

def cerca_lineal_ultima_aparicio(llista, element):
    posicio = -1
    for i in range(len(llista)):
        if llista[i] == element:
            posicio = i
    return posicio

# Prova la teva funció
llista = [4, 2, 7, 1, 3, 7, 8]
element = 7
resultat = cerca_lineal_ultima_aparicio(llista, element)
print(f"L'última aparició de l'element {element} es troba a la posició {resultat}")

  1. Cerca Binària

Descripció

La cerca binària és un mètode de cerca més eficient que la cerca lineal, però requereix que la llista estigui ordenada. Divideix repetidament la llista en dues meitats i compara l'element del mig amb l'element que es busca.

Exemple de codi

def cerca_binaria(llista, element):
    esquerra, dreta = 0, len(llista) - 1
    while esquerra <= dreta:
        mig = (esquerra + dreta) // 2
        if llista[mig] == element:
            return mig
        elif llista[mig] < element:
            esquerra = mig + 1
        else:
            dreta = mig - 1
    return -1

# Exemple d'ús
llista = [1, 2, 3, 4, 7, 8]
element = 7
resultat = cerca_binaria(llista, element)
print(f"L'element {element} es troba a la posició {resultat}")

Explicació del codi

  1. La funció cerca_binaria pren com a paràmetres una llista ordenada i l'element que es vol cercar.
  2. Defineix dos índexs, esquerra i dreta, que representen els límits de la part de la llista que s'està considerant.
  3. Utilitza un bucle while per continuar dividint la llista fins que esquerra sigui major que dreta.
  4. Calcula l'índex del mig i compara l'element del mig amb l'element que es busca.
  5. Si l'element del mig és igual a l'element que es busca, retorna la posició.
  6. Si l'element del mig és menor, ajusta esquerra per considerar només la meitat dreta de la llista.
  7. Si l'element del mig és major, ajusta dreta per considerar només la meitat esquerra de la llista.
  8. Si el bucle acaba sense trobar l'element, retorna -1.

Exercici pràctic

Implementa una funció de cerca binària que cerqui un número en una llista ordenada de nombres i retorni la posició de la primera aparició del número.

def cerca_binaria_primera_aparicio(llista, element):
    # Implementa la funció aquí
    pass

# Prova la teva funció
llista = [1, 2, 3, 4, 7, 7, 8]
element = 7
resultat = cerca_binaria_primera_aparicio(llista, element)
print(f"La primera aparició de l'element {element} es troba a la posició {resultat}")

Solució

def cerca_binaria_primera_aparicio(llista, element):
    esquerra, dreta = 0, len(llista) - 1
    resultat = -1
    while esquerra <= dreta:
        mig = (esquerra + dreta) // 2
        if llista[mig] == element:
            resultat = mig
            dreta = mig - 1  # Continua cercant a l'esquerra
        elif llista[mig] < element:
            esquerra = mig + 1
        else:
            dreta = mig - 1
    return resultat

# Prova la teva funció
llista = [1, 2, 3, 4, 7, 7, 8]
element = 7
resultat = cerca_binaria_primera_aparicio(llista, element)
print(f"La primera aparició de l'element {element} es troba a la posició {resultat}")

Comparació d'Eficiència

Taula Comparativa

Algoritme Complexitat en el pitjor cas Requisits de la llista
Cerca Lineal O(n) Cap
Cerca Binària O(log n) Llista ordenada

Resum

  • La cerca lineal és simple i no requereix que la llista estigui ordenada, però pot ser lenta per a llistes grans.
  • La cerca binària és molt més eficient per a llistes grans, però requereix que la llista estigui ordenada.

Conclusió

En aquest tema, hem après sobre dos tipus d'algoritmes de cerca: la cerca lineal i la cerca binària. Hem vist com implementar-los i hem comparat la seva eficiència. Ara estàs preparat per aplicar aquests coneixements en situacions reals de programació.

En el següent tema, explorarem els algoritmes d'ordenació, que són essencials per preparar les llistes per a una cerca binària eficient.

© Copyright 2024. Tots els drets reservats