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
- Dividir: Dividir el problema en subproblemes més petits.
- Vèncer: Resoldre cada subproblema de manera recursiva. Si els subproblemes són prou petits, resoldre'ls directament.
- 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
- Dividir: L'array es divideix en dues meitats.
- Vèncer: Cada meitat es ordena recursivament utilitzant
merge_sort
. - 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
- Dividir: L'array es divideix en dues meitats.
- Vèncer: Es troba l'element màxim en cada meitat recursivament utilitzant
find_max
. - 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.
Curs d'Anàlisi i Disseny d'Algorismes
Mòdul 1: Introducció als Algorismes
Mòdul 2: Anàlisi d'Algorismes
- Anàlisi de Complexitat Temporal
- Anàlisi de Complexitat Espacial
- Cases de Complexitat: Millor, Pitjor i Promig
Mòdul 3: Estratègies de Disseny d'Algorismes
Mòdul 4: Algorismes Clàssics
- Cerca Binària
- Ordenació per Inserció
- Ordenació per Mescla (Merge Sort)
- Ordenació Ràpida (Quick Sort)
- Algorisme de Dijkstra
- Algorisme de Floyd-Warshall