En aquest tema, explorarem els diferents tipus d'algorismes que existeixen i com es poden classificar segons diverses característiques. Aquesta comprensió és fonamental per seleccionar l'algorisme adequat per a un problema específic i per optimitzar el rendiment del codi.

Classificació segons la seva Funció

  1. Algorismes de Cerca

Els algorismes de cerca s'utilitzen per trobar un element específic dins d'una estructura de dades. Alguns exemples comuns inclouen:

  • Cerca Lineal: Recorre la llista element per element fins a trobar l'element desitjat.
  • Cerca Binària: Requereix una llista ordenada i divideix repetidament la llista en meitats per trobar l'element desitjat.

Exemple de Cerca Binària en Python:

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

# Exemple d'ús
arr = [2, 3, 4, 10, 40]
x = 10
resultat = cerca_binaria(arr, x)
print(f'Element trobat a l\'índex {resultat}' if resultat != -1 else 'Element no trobat')

  1. Algorismes d'Ordenació

Els algorismes d'ordenació s'utilitzen per organitzar els elements d'una llista en un ordre específic (ascendent o descendent). Alguns exemples inclouen:

  • Ordenació per Inserció: Insereix cada element en la seva posició correcta dins d'una llista ordenada.
  • Ordenació per Mescla (Merge Sort): Divideix la llista en subllistes més petites i les combina de manera ordenada.

Exemple d'Ordenació per Inserció en Python:

def ordenacio_per_insercio(arr):
    for i in range(1, len(arr)):
        clau = arr[i]
        j = i - 1
        while j >= 0 and clau < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = clau

# Exemple d'ús
arr = [12, 11, 13, 5, 6]
ordenacio_per_insercio(arr)
print(f'Llista ordenada: {arr}')

  1. Algorismes de Caminament

Aquests algorismes s'utilitzen per trobar camins o rutes en un graf. Alguns exemples inclouen:

  • Algorisme de Dijkstra: Troba el camí més curt des d'un node d'origen a tots els altres nodes en un graf amb pesos no negatius.
  • Algorisme de Floyd-Warshall: Troba els camins més curts entre tots els parells de nodes en un graf.

Classificació segons la seva Estratègia

  1. Divideix i Venceràs

Aquesta estratègia divideix el problema en subproblemes més petits, els resol de manera recursiva i després combina les solucions. Exemples inclouen:

  • Ordenació per Mescla (Merge Sort)
  • Ordenació Ràpida (Quick Sort)

  1. Algorismes Greedy

Aquests algorismes prenen decisions locals òptimes amb l'esperança que aquestes decisions conduiran a una solució global òptima. Exemples inclouen:

  • Algorisme de Kruskal per trobar l'arbre de cobertura mínima.
  • Algorisme de Prim per trobar l'arbre de cobertura mínima.

  1. Programació Dinàmica

Aquesta estratègia resol problemes complexos descomposant-los en subproblemes més simples i emmagatzemant els resultats de subproblemes ja resolts per evitar càlculs repetits. Exemples inclouen:

  • Problema del Camí Més Curt (com l'algorisme de Floyd-Warshall).
  • Problema de la Mochila.

  1. Backtracking

Aquesta estratègia prova totes les possibles solucions i retrocedeix quan arriba a una solució invàlida. Exemples inclouen:

  • Resolució del Sudoku
  • Problema de les N-Reines

Exercicis Pràctics

Exercici 1: Implementació de la Cerca Binària

Implementa una funció de cerca binària en el teu llenguatge de programació preferit i prova-la amb diferents llistes ordenades.

Exercici 2: Ordenació per Inserció

Implementa l'algorisme d'ordenació per inserció i prova'l amb una llista desordenada. Compara el rendiment amb altres algorismes d'ordenació.

Exercici 3: Algorisme Greedy

Implementa un algorisme greedy per resoldre el problema de la moneda (donar canvi amb el menor nombre de monedes possibles).

Resum

En aquesta secció, hem explorat diversos tipus d'algorismes i com es poden classificar segons la seva funció i estratègia. Hem vist exemples pràctics de cerca binària i ordenació per inserció, i hem introduït conceptes clau com "divideix i venceràs", algorismes greedy, programació dinàmica i backtracking. Aquesta comprensió és essencial per seleccionar i dissenyar algorismes eficients per a diferents problemes.

En el següent tema, aprofundirem en la Notació Asimptòtica, que ens permetrà analitzar i comparar l'eficiència dels algorismes de manera formal.

© Copyright 2024. Tots els drets reservats