Algorisme divideix i venceràs: diferència entre les revisions

Contingut suprimit Contingut afegit
Cap resum de modificació
Corregir alguna falta i afegir links
Línia 1:
En la cultura popular, '''divideix i venceràs''' fa referència a un [[refrany]] que implica resoldre un problema difícil, dividint-lo en parts més simples tantes vegades com sigui necessari, fins que la resolució de les parts es torna òbvia i senzilla. La solució del problema principal es construeix amb les solucions de les parts en que s'ha dividit el problema.
 
En el camp de les [[ciències de la computació]], el terme '''divideix i venceràs''' ('''DIV''') fa referència a un dels paradigmes més importants de disseny [[Algorisme|algorítmic.]] El mètode es basa en la resolució [[Recursivitat|recursiva]] d'un problema dividint-lo en dos o més subproblemassubproblemes d'igual tipus o similar. El procés continua fins que els subproblemes arriben a ser prou senzills com perquè es resolguin directament. Al final, les solucions a cadascun dels subproblemassubproblemes es combinen per donar la solució del problema original.
 
Aquesta tècnica és la base dels algorismes eficients per gairebé qualsevol tipus de problema com, per exemple, [[Algorisme d'ordenació|algorismes d'ordenació]] ([[quicksort]], mergesort, entre molts altres), [[Algorisme de multiplicació|multiplicació nombres grans]] (Karatsuba), [[Analitzador sintàctic|anàlisis sintàctiques]] (anàlisi sintàctica top-down), la [[Transformada de Fourier|transformada discreta de Fourier]] etc...
Línia 12:
 
== Precedents històrics ==
La cerca binària, un tipic algorisme de divideix i venceràs en el qual el problema original és parteix successivament en subproblemassubproblemes més simples de més o menys la meitat de la grandària, té una llarga història. La idea d'utilitzar una llista ordenada d'objectes per facilitar la seva cerca data de l'antiga Babilònia al 200 a. C., mentre que una descripció de l'algorisme en ordinadors va aparèixer al 1946 en un article de John Mauchly. Un altre [[Algorisme d'Euclides|algorisme]] de “divideix i venceràs” amb un únic subproblema és l'algorisme d'Euclides per computar el [[màxim comú divisor]] de dos nombres (mitjançant reducció de nombres a problemes equivalents cada vegada més petits), que data de molts segles abans de Crist.
 
Un exemple antic d'algorisme de “divideix i venceràs” amb múltiples subproblemes és la descripció realitzada per [[Carl Friedrich Gauß|Gauss]] el 1805 d'un algorisme que ara s'anomena algorisme de la ràpida transformació de FourierCooley-Tukey (FFT), encara que Gauss no va analitzar el seu [[Complexitat computacional|conjunt d'operacions]] quantitativament i els FFT no es van difondre fins que es van redescobrir gairebé un segle després.
Línia 23:
La resolució d'un problema mitjançant aquesta tècnica consta fonamentalment dels següents passos:
 
# En primer lloc ha de plantejar-se el problema de forma que aquest es pugui descompondre en k subproblemassubproblemes del mateix tipus, però de menor grandària. És a dir, si la grandària de l'entrada és n, hem d'aconseguir dividir el problema en k subproblemassubproblemes (on 1 ≤ k ≤ n), cadascun amb una entrada de grandària n/k i on 0 ≤ n/k < n. A aquesta tasca se la coneix com a divisió.
# En segon lloc han de resoldre's independentment tots els subproblemassubproblemes, ja sigui directament si són elementals o bé de forma recursiva. El fet que la grandària dels subproblemassubproblemes sigui estrictament menor que la grandària original del problema ens garanteix la convergència cap als casos elementals, també anomenats casos base.
# Finalment, s'han de combinar les solucions obtingudes al pas anterior per construir la solució del problema original.
 
Línia 55:
 
=== Recursió ===
Els algorismes de “divideix i venceràs” s'implementen de forma natural, com a processos [[Recursivitat|recursius.]] En aquest cas, els subproblemassubproblemes parcials encapçalats per aquells que ja han estat resolts s'emmagatzemen a la pila de crides de procediments.
 
=== Pila explícita ===
Els algorismes de divideix i venceràs també poden ser implementats mitjançant un programa no recursiu que emmagatzemi els subproblemassubproblemes parcials en alguna estructura de dades explícita, tal com una [[Memòria en pila (estructura de dades)|pila]], una cua, o una [[Cua (estructura de dades)|cua]] de prioritat. Aquest enfocament permet més llibertat a l'hora de triar els subproblemassubproblemes a resoldre després, una característica que és important en algunes aplicacions, per exemple en la cerca en amplada i en el mètode de ramificació i poda per a optimització de subproblemassubproblemes. Aquest enfocament és també la solució estàndard en llenguatges de programació que no permeten procediments recursius.
 
=== Grandària de la pila ===
Línia 66:
 
=== Triar els casos base ===
En qualsevol algorisme recursiu, hi ha una llibertat considerable per triar els casos base, que són els subproblemassubproblemes petits que són resolts directament per acabar amb la recursión.
 
Triar els casos base més petits i simples possibles és més elegant i normalment permet obtenir programes més simples, perquè hi ha menys casos a considerar i són més fàcils de resoldre. Per exemple, un algorisme FFT podria parar la recursió quan l'entrada és una mostra simple, i l'algorisme quicksort d'ordenació podria parar quan l'entrada és una llista buida. En tots dos casos, només cal considerar un cas base, i no requereix processament.
Línia 157:
 
== Desavantatges ==
El principal desavantatge d'aquest mètode és la seva lentitud en la repetició del procés recursiu: les despeses indirectes de les crides recursives per a la resolució dels subproblemassubproblemes, juntament amb el fet d'haver d'emmagatzemar la pila de crides (l'estat en cada punt en la repetició), poden empitjorar qualsevol millora fins llavors assolida. Aquesta tasca, no obstant això, depèn de l'estil de la implementació: amb casos base prou grans, es redueixen les despeses indirectes de la repetició de les crides recursives.
 
Un altre desavantatge o inconvenient important, és la dificultat o fins i tot inconveniència d'aplicar el mètode a situacions en les quals la solució al problema general no es deriva de la suma directa i simple dels subproblemes (parts). Això es presenta per exemple quan són rellevants les interaccions o efectes mutus entre els subproblemes, la qual cosa genera nous subproblemes, en considerar cadascuna d'aquestes interaccions, incrementant exponencialment el nombre de subproblemes a considerar, en incrementar-se la complexitat de la situació general i dels seus components.
Línia 167:
* Multiplicació d'enters grans: algorisme eficient per multiplicar nombres de grandària considerable, que sobrepassen els límits de representació, i no abordable amb els algorismes clàssics a causa de l'excessiu cost.
* Subvector de suma màxima: Algorisme eficient per trobar subcadenes dins d'un vector evitant haver de recórrer tot el vector des de cada posició.
 
== Vegeu també ==
* [[Algorisme voraç]]
* [[Algorisme de Las Vegas]]
* [[Programació dinàmica]]
 
 
[[Categoria:Algorismes]]
[[Categoria:Pàgines amb traduccions sense revisar]]