Introducció
La cerca binària és un algorisme eficient per trobar un element en una llista ordenada. Funciona dividint repetidament la llista en dues meitats i comparant l'element de la meitat amb l'element que es busca. Aquest algorisme té una complexitat temporal de \(O(\log n)\), la qual cosa el fa molt més ràpid que una cerca lineal \(O(n)\) en llistes grans.
Conceptes Bàsics
Cerca Binària
- Llista Ordenada: La cerca binària només funciona en llistes que estan prèviament ordenades.
- Divisió i Conquesta: L'algorisme es basa en el principi de dividir la llista en dues parts i conquerir la part que pot contenir l'element buscat.
Pseudocodi
funció cerca_binaria(llista, element): inici = 0 final = longitud(llista) - 1 mentre inici <= final: mig = (inici + final) // 2 si llista[mig] == element: retorna mig si llista[mig] < element: inici = mig + 1 si llista[mig] > element: final = mig - 1 retorna -1 # Element no trobat
Implementació en Python
def cerca_binaria(llista, element): inici = 0 final = len(llista) - 1 while inici <= final: mig = (inici + final) // 2 if llista[mig] == element: return mig elif llista[mig] < element: inici = mig + 1 else: final = mig - 1 return -1 # Element no trobat
Variants de la Cerca Binària
Cerca Binària Recursiva
La cerca binària també es pot implementar de manera recursiva.
Pseudocodi
funció cerca_binaria_recursiva(llista, element, inici, final): si inici > final: retorna -1 # Element no trobat mig = (inici + final) // 2 si llista[mig] == element: retorna mig si llista[mig] < element: retorna cerca_binaria_recursiva(llista, element, mig + 1, final) si llista[mig] > element: retorna cerca_binaria_recursiva(llista, element, inici, mig - 1)
Implementació en Python
def cerca_binaria_recursiva(llista, element, inici, final): if inici > final: return -1 # Element no trobat mig = (inici + final) // 2 if llista[mig] == element: return mig elif llista[mig] < element: return cerca_binaria_recursiva(llista, element, mig + 1, final) else: return cerca_binaria_recursiva(llista, element, inici, mig - 1)
Cerca Binària en Llistes amb Duplicats
Quan una llista pot contenir elements duplicats, la cerca binària es pot modificar per trobar la primera o l'última aparició d'un element.
Pseudocodi per trobar la primera aparició
funció cerca_binaria_primera_aparicio(llista, element): inici = 0 final = longitud(llista) - 1 resultat = -1 mentre inici <= final: mig = (inici + final) // 2 si llista[mig] == element: resultat = mig final = mig - 1 # Continua cercant a l'esquerra si llista[mig] < element: inici = mig + 1 si llista[mig] > element: final = mig - 1 retorna resultat
Implementació en Python
def cerca_binaria_primera_aparicio(llista, element): inici = 0 final = len(llista) - 1 resultat = -1 while inici <= final: mig = (inici + final) // 2 if llista[mig] == element: resultat = mig final = mig - 1 # Continua cercant a l'esquerra elif llista[mig] < element: inici = mig + 1 else: final = mig - 1 return resultat
Exercicis Pràctics
Exercici 1: Implementació Bàsica
Implementa una funció de cerca binària iterativa en Python que trobi un element en una llista ordenada.
Solució
def cerca_binaria(llista, element): inici = 0 final = len(llista) - 1 while inici <= final: mig = (inici + final) // 2 if llista[mig] == element: return mig elif llista[mig] < element: inici = mig + 1 else: final = mig - 1 return -1 # Element no trobat
Exercici 2: Cerca Binària Recursiva
Implementa una funció de cerca binària recursiva en Python.
Solució
def cerca_binaria_recursiva(llista, element, inici, final): if inici > final: return -1 # Element no trobat mig = (inici + final) // 2 if llista[mig] == element: return mig elif llista[mig] < element: return cerca_binaria_recursiva(llista, element, mig + 1, final) else: return cerca_binaria_recursiva(llista, element, inici, mig - 1)
Exercici 3: Primera Aparició
Implementa una funció de cerca binària que trobi la primera aparició d'un element en una llista ordenada amb elements duplicats.
Solució
def cerca_binaria_primera_aparicio(llista, element): inici = 0 final = len(llista) - 1 resultat = -1 while inici <= final: mig = (inici + final) // 2 if llista[mig] == element: resultat = mig final = mig - 1 # Continua cercant a l'esquerra elif llista[mig] < element: inici = mig + 1 else: final = mig - 1 return resultat
Errors Comuns i Consells
- Llista No Ordenada: La cerca binària només funciona en llistes ordenades. Assegura't que la llista estigui ordenada abans d'aplicar l'algorisme.
- Desbordament d'Enter: En llenguatges de programació amb limitacions d'enter, la suma de
inici
ifinal
pot causar un desbordament. Utilitza(inici + final) // 2
en lloc de(inici + final) / 2
. - Condicions de Bucle: Assegura't que les condicions del bucle
while
o les condicions de recursió estiguin correctament definides per evitar bucles infinits.
Conclusió
La cerca binària és un algorisme fonamental per a la cerca eficient en llistes ordenades. Les seves variants, com la cerca recursiva i la cerca en llistes amb duplicats, amplien la seva aplicabilitat. Practicar la implementació d'aquests algorismes ajuda a comprendre millor els conceptes de divisió i conquesta i l'eficiència algorítmica.
Algoritmes Avançats
Mòdul 1: Introducció als Algoritmes Avançats
Mòdul 2: Algoritmes d'Optimització
- Programació Lineal
- Algoritmes d'Optimització Combinatòria
- Algoritmes Genètics
- Optimització de Colònia de Formigues
Mòdul 3: Algoritmes en Grafs
- Representació de Grafs
- Cerca en Grafs: BFS i DFS
- Algoritmes de Camins Mínims
- Algoritmes de Flux Màxim
- Algoritmes d'Aparellament en Grafs
Mòdul 4: Algoritmes de Cerca i Ordenació
Mòdul 5: Algoritmes d'Aprenentatge Automàtic
- Introducció a l'Aprenentatge Automàtic
- Algoritmes de Classificació
- Algoritmes de Regressió
- Xarxes Neuronals i Deep Learning
- Algoritmes de Clustering
Mòdul 6: Casos d'Estudi i Aplicacions
- Optimització en la Indústria
- Aplicacions de Grafs en Xarxes Socials
- Cerca i Ordenació en Grans Volums de Dades
- Aplicacions d'Aprenentatge Automàtic en la Vida Real