Introducció

La tècnica de "Divideix i Venceràs" és una estratègia de disseny d'algorismes que es basa en dividir un problema en subproblemes més petits, resoldre aquests subproblemes de manera recursiva i després combinar les solucions per obtenir la solució del problema original. Aquesta tècnica és especialment útil per a problemes que poden ser descompostos en subproblemes similars al problema original.

Passos de la Tècnica

  1. Dividir: Dividir el problema en subproblemes més petits.
  2. Vèncer: Resoldre cada subproblema de manera recursiva. Si els subproblemes són prou petits, resoldre'ls directament.
  3. Combinar: Combinar les solucions dels subproblemes per obtenir la solució del problema original.

Exemple Clàssic: Merge Sort

Merge Sort és un algorisme d'ordenació que utilitza la tècnica de "Divideix i Venceràs". A continuació es mostra una implementació de Merge Sort en Python:

def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    # Dividir l'array en dues meitats
    mid = len(arr) // 2
    left_half = arr[:mid]
    right_half = arr[mid:]

    # Vèncer: ordenar cada meitat recursivament
    left_sorted = merge_sort(left_half)
    right_sorted = merge_sort(right_half)

    # Combinar: fusionar les dues meitats ordenades
    return merge(left_sorted, right_sorted)

def merge(left, right):
    sorted_array = []
    i = j = 0

    # Fusionar els dos arrays ordenats
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            sorted_array.append(left[i])
            i += 1
        else:
            sorted_array.append(right[j])
            j += 1

    # Afegir els elements restants
    sorted_array.extend(left[i:])
    sorted_array.extend(right[j:])

    return sorted_array

# Exemple d'ús
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Array ordenat:", sorted_arr)

Explicació del Codi

  1. Dividir: L'array es divideix en dues meitats.
  2. Vèncer: Cada meitat es ordena recursivament utilitzant merge_sort.
  3. Combinar: Les dues meitats ordenades es fusionen utilitzant la funció merge.

Avantatges i Desavantatges

Avantatges

  • Eficient: Molts algorismes de "Divideix i Venceràs" tenen una complexitat temporal logarítmica o quasi-lineal.
  • Simplicitat: La recursivitat pot simplificar la implementació de l'algorisme.

Desavantatges

  • Sobrecàrrega de Memòria: La recursivitat pot utilitzar molta memòria de la pila.
  • Complexitat de la Combinació: La fase de combinació pot ser complexa i costosa en termes de temps.

Exercici Pràctic

Problema

Implementa un algorisme de "Divideix i Venceràs" per trobar l'element màxim en una llista d'elements.

Solució

def find_max(arr):
    if len(arr) == 1:
        return arr[0]

    # Dividir l'array en dues meitats
    mid = len(arr) // 2
    left_half = arr[:mid]
    right_half = arr[mid:]

    # Vèncer: trobar el màxim en cada meitat recursivament
    left_max = find_max(left_half)
    right_max = find_max(right_half)

    # Combinar: retornar el màxim dels dos màxims
    return max(left_max, right_max)

# Exemple d'ús
arr = [38, 27, 43, 3, 9, 82, 10]
max_element = find_max(arr)
print("Element màxim:", max_element)

Explicació del Codi

  1. Dividir: L'array es divideix en dues meitats.
  2. Vèncer: Es troba l'element màxim en cada meitat recursivament utilitzant find_max.
  3. Combinar: Es retorna el màxim dels dos màxims trobats en les submeitats.

Resum

La tècnica de "Divideix i Venceràs" és una poderosa estratègia per dissenyar algorismes eficients. Consisteix en dividir el problema en subproblemes més petits, resoldre aquests subproblemes de manera recursiva i combinar les solucions per obtenir la solució del problema original. Hem vist exemples pràctics com Merge Sort i la cerca del màxim element en una llista, que il·lustren com aplicar aquesta tècnica.

© Copyright 2024. Tots els drets reservats