logo

Introducere în algoritmul Divide and Conquer – Structura datelor și tutoriale de algoritm

Diviza și cuceri Algoritm este o tehnică de rezolvare a problemelor folosită pentru a rezolva probleme prin împărțirea problemei principale în subprobleme, rezolvarea lor individual și apoi fuzionarea lor pentru a găsi soluția problemei inițiale. În acest articol, vom discuta cum este util algoritmul Divide and Conquer și cum îl putem folosi pentru a rezolva probleme.

c număr aleator



Cuprins

Diviza și cuceri Definiția algoritmului:

Algoritmul Divide and Conquer implică împărțirea unei probleme mai mari în subprobleme mai mici, rezolvarea lor independent și apoi combinarea soluțiilor lor pentru a rezolva problema inițială. Ideea de bază este de a împărți recursiv problema în subprobleme mai mici până când acestea devin suficient de simple pentru a fi rezolvate direct. Odată obținute soluțiile subproblemelor, acestea sunt apoi combinate pentru a produce soluția globală.

Funcționarea algoritmului Divide and Conquer:

Algoritmul Divide and Conquer poate fi împărțit în trei pași: Divide , A cuceri și Combina .



1. Împărțiți:

  • Împărțiți problema inițială în subprobleme mai mici.
  • Fiecare subproblemă ar trebui să reprezinte o parte a problemei generale.
  • Scopul este de a împărți problema până când nu mai este posibilă o altă împărțire.

2. Cuceri:

  • Rezolvați fiecare dintre subproblemele mai mici individual.
  • Dacă o subproblemă este suficient de mică (denumită adesea cazul de bază), o rezolvăm direct fără recursuri suplimentare.
  • Scopul este de a găsi soluții pentru aceste subprobleme în mod independent.

3. Îmbinați:

  • Combinați sub-problemele pentru a obține soluția finală a întregii probleme.
  • Odată rezolvate subproblemele mai mici, combinăm recursiv soluțiile lor pentru a obține soluția problemei mai mari.
  • Scopul este de a formula o soluție pentru problema inițială prin îmbinarea rezultatelor din subprobleme.

Caracteristicile algoritmului Divide and Conquer:

Algoritmul Divide and Conquer implică împărțirea unei probleme în părți mai mici, mai ușor de gestionat, rezolvând fiecare parte individual și apoi combinând soluțiile pentru a rezolva problema inițială. Caracteristicile algoritmului Divide and Conquer sunt:

  • Împărțirea problemei : Primul pas este să împărțiți problema în subprobleme mai mici și mai ușor de gestionat. Această împărțire se poate face recursiv până când subproblemele devin suficient de simple pentru a fi rezolvate direct.
  • Independenta subproblemelor : Fiecare subproblemă ar trebui să fie independentă de celelalte, ceea ce înseamnă că rezolvarea unei subprobleme nu depinde de soluția alteia. Acest lucru permite procesarea paralelă sau execuția concomitentă a subproblemelor, ceea ce poate duce la câștiguri de eficiență.
  • Cucerirea fiecărei subprobleme : Odată împărțite, subproblemele sunt rezolvate individual. Acest lucru poate implica aplicarea aceleiași abordări de împărțire și cucerire în mod recursiv până când subproblemele devin suficient de simple pentru a fi rezolvate direct, sau poate implica aplicarea unui algoritm sau tehnică diferită.
  • Combinarea Soluțiilor : După rezolvarea subproblemelor, soluțiile acestora sunt combinate pentru a obține soluția problemei inițiale. Această etapă de combinare ar trebui să fie relativ eficientă și simplă, deoarece soluțiile la subprobleme ar trebui concepute pentru a se potrivi perfect.

Exemple de algoritm Divide and Conquer:

1. Găsirea elementului maxim din matrice:

Putem folosi algoritmul Divide and Conquer pentru a găsi elementul maxim din matrice, împărțind matricea în două subtaiere de dimensiuni egale, găsind maximul acestor două jumătăți individuale împărțindu-le din nou în două jumătăți mai mici. Acest lucru se face până când ajungem la sub-tabele de dimensiunea 1. După ce ajungem la elemente, returnăm elementul maxim și combinăm sub-tabelul returnând maximul din fiecare sub-seză.



C++salut) returnează Integer.MIN_VALUE; // Dacă subbarra are un singur element, returnează elementul // dacă (lo == hi) returnează a[lo]; int mid = (lo + hi) / 2; // Obține elementul maxim din jumătatea stângă int leftMax = findMax(a, lo, mid); // Obține elementul maxim din jumătatea dreaptă int rightMax = findMax(a, mid + 1, hi); // Returnează elementul maxim din stânga și // jumătate din dreapta returnează Math.max(leftMax, rightMax); }>>>Python3>>C#salut) returnează Numărul.MIN_VALUE; // Dacă subbarra are un singur element, returnează elementul // dacă (lo === hi) returnează a[lo]; const mid = Math.floor((lo + hi) / 2); // Obține elementul maxim din jumătatea stângă const leftMax = findMax(a, lo, mid); // Obține elementul maxim din jumătatea dreaptă const rightMax = findMax(a, mid + 1, hi); // Returnează elementul maxim din stânga și dreapta // returnează jumătate Math.max(leftMax, rightMax); }>>>

2. Găsirea elementului minim din matrice:

În mod similar, putem folosi algoritmul Divide and Conquer pentru a găsi elementul minim din matrice, împărțind matricea în două subtaiere de dimensiuni egale, găsind minimul acestor două jumătăți individuale împărțindu-le din nou în două jumătăți mai mici. Acest lucru se face până când ajungem la sub-tabele de dimensiunea 1. După ce ajungem la elemente, returnăm elementul minim și combinăm sub-tabelul returnând minimul în fiecare sub-tază.

3. Sortare îmbinare:

Putem folosi algoritmul Divide and Conquer pentru a sorta matricea în ordine crescătoare sau descrescătoare, împărțind matricea în sub-taze mai mici, sortând sub-tabele mai mici și apoi îmbinând matricele sortate pentru a sorta matricea originală.

Analiza complexității algoritmului Divide and Conquer:

T(n) = aT(n/b) + f(n), unde n = dimensiunea intrării a = numărul de subprobleme în recursivitate n/b = dimensiunea fiecărei subprobleme. Se presupune că toate subproblemele au aceeași dimensiune. f(n) = costul lucrării efectuate în afara apelului recursiv, care include costul împărțirii problemei și costul îmbinării soluțiilor

Aplicații ale algoritmului Divide and Conquer:

Următorii sunt câțiva algoritmi standard care urmează algoritmul Divide and Conquer:

k cel mai apropiat vecin
  • Sortare rapida este un algoritm de sortare care alege un element pivot și rearanjează elementele matricei astfel încât toate elementele mai mici decât elementul pivot ales să se deplaseze în partea stângă a pivotului, iar toate elementele mai mari să se deplaseze în partea dreaptă. În cele din urmă, algoritmul sortează recursiv subbaryurile din stânga și din dreapta elementului pivot.
  • Merge Sort este, de asemenea, un algoritm de sortare. Algoritmul împarte matricea în două jumătăți, le sortează recursiv și, în final, unește cele două jumătăți sortate.
  • Cea mai apropiată pereche de puncte Problema este de a găsi cea mai apropiată pereche de puncte dintr-un set de puncte în planul x-y. Problema poate fi rezolvată în timp O(n^2) calculând distanțele fiecărei perechi de puncte și comparând distanțele pentru a găsi minimul. Algoritmul Divide and Conquer rezolvă problema în timp O(N log N).
  • Algoritmul lui Strassen este un algoritm eficient pentru multiplicarea a două matrice. O metodă simplă de înmulțire a două matrice necesită 3 bucle imbricate și este O(n^3). Algoritmul lui Strassen înmulțește două matrice în timp O(n^2,8974).
  • Algoritmul Cooley-Tukey Fast Fourier Transform (FFT). este cel mai comun algoritm pentru FFT. Este un algoritm de împărțire și cucerire care funcționează în timp O(N log N).
  • Algoritm Karatsuba pentru multiplicare rapidă face înmulțirea a două șiruri binare în O(n1,59) unde n este lungimea șirului binar.

Avantajele algoritmului Divide and Conquer:

  • Rezolvarea problemelor dificile: Tehnica Divide and Conquer este un instrument pentru rezolvarea problemelor dificile din punct de vedere conceptual. de exemplu. Puzzle Turnul din Hanoi. Este nevoie de o modalitate de a împărți problema în sub-probleme și de a le rezolva pe toate ca cazuri individuale și apoi de a combina sub-problemele cu problema inițială.
  • Eficiența algoritmului: Algoritmul divide-and-conquer ajută adesea la descoperirea algoritmilor eficienți. Este cheia unor algoritmi precum Sortare rapidă și Sortare prin îmbinare și transformări rapide Fourier.
  • Paralelism: În mod normal, algoritmii Divide and Conquer sunt utilizați în mașinile cu mai multe procesoare care au sisteme de memorie partajată în care comunicarea datelor între procesoare nu trebuie să fie planificată în avans, deoarece subprobleme distincte pot fi executate pe procesoare diferite.
  • Acces la memorie: Acești algoritmi fac, în mod natural, o utilizare eficientă a memoriei cache. Deoarece subproblemele sunt suficient de mici pentru a fi rezolvate în cache fără a utiliza memoria principală care este mai lentă. Orice algoritm care folosește cache în mod eficient este numit cache ignorant.

Dezavantajele algoritmului Divide and Conquer:

  • deasupra capului: Procesul de împărțire a problemei în subprobleme și apoi combinarea soluțiilor poate necesita timp și resurse suplimentare. Această suprasarcină poate fi semnificativă pentru probleme care sunt deja relativ mici sau care au o soluție simplă.
  • Complexitate: Împărțirea unei probleme în subprobleme mai mici poate crește complexitatea soluției generale. Acest lucru este valabil mai ales atunci când subproblemele sunt interdependente și trebuie rezolvate într-o anumită ordine.
  • Dificultate de implementare: Unele probleme sunt dificil de împărțit în subprobleme mai mici sau necesită un algoritm complex pentru a face acest lucru. În aceste cazuri, poate fi dificil să implementezi o soluție de împărțire și cuceri.
  • Limitări de memorie: Când lucrați cu seturi mari de date, cerințele de memorie pentru stocarea rezultatelor intermediare ale subproblemelor pot deveni un factor limitativ.

Întrebări frecvente (FAQs) despre algoritmul Divide and Conquer:

1. Ce este algoritmul Divide and Conquer?

Divide and Conquer este o tehnică de rezolvare a problemelor în care o problemă este împărțită în subprobleme mai mici, mai ușor de gestionat. Aceste subprobleme sunt rezolvate recursiv, iar apoi soluțiile lor sunt combinate pentru a rezolva problema inițială.

2. Care sunt pașii cheie implicați în algoritmul Divide and Conquer?

Principalii pași sunt:

Divide : Împărțiți problema în subprobleme mai mici.

A cuceri : Rezolvați subproblemele recursiv.

Combina : Îmbinați sau combinați soluțiile subproblemelor pentru a obține soluția problemei inițiale.

3. Care sunt câteva exemple de probleme rezolvate folosind Divide and Conquer?

Algoritmul Divide and Conquer este utilizat în algoritmi de sortare precum Merge Sort și Quick Sort, găsirea celei mai apropiate perechi de puncte, algoritmul lui Strassen etc.

4. Cum folosește Merge Sort abordarea Divide and Conquer?

Merge Sort împarte matricea în două jumătăți, sortează recursiv fiecare jumătate și apoi îmbină jumătățile sortate pentru a produce matricea sortată finală.

5. Care este complexitatea în timp a algoritmilor Divide and Conquer?

Complexitatea timpului variază în funcție de problema specifică și de modul în care este implementată. În general, mulți algoritmi Divide and Conquer au o complexitate de timp de O(n log n) sau mai bună.

6. Pot fi paralelizați algoritmii Divide and Conquer?

Da, algoritmii Divide and Conquer sunt adesea paralelizabili în mod natural, deoarece subproblemele independente pot fi rezolvate concomitent. Acest lucru le face potrivite pentru medii de calcul paralele.

7. Care sunt câteva strategii pentru alegerea cazului de bază în algoritmii Divide and Conquer?

Cazul de bază ar trebui să fie suficient de simplu pentru a fi rezolvat direct, fără alte diviziuni. Este adesea ales pe baza celei mai mici dimensiuni de intrare unde problema poate fi rezolvată trivial.

enumerare tostring java

8. Există dezavantaje sau limitări în utilizarea Divide and Conquer?

În timp ce Divide and Conquer poate duce la soluții eficiente pentru multe probleme, este posibil să nu fie potrivit pentru toate tipurile de probleme. Suplimentarul de recursivitate și combinarea soluțiilor poate fi, de asemenea, o preocupare pentru probleme de dimensiuni foarte mari.

9. Cum analizați complexitatea spațială a algoritmilor Divide and Conquer?

Complexitatea spațiului depinde de factori precum adâncimea recursiunii și spațiul auxiliar necesar pentru combinarea soluțiilor. Analiza complexității spațiului implică de obicei luarea în considerare a spațiului utilizat de fiecare apel recursiv.

10. Care sunt câteva avantaje comune ale algoritmului Divide and Conquer?

Algoritmul Divide and Conquer are numeroase avantaje. Unele dintre ele includ:

  • Rezolvarea problemelor dificile
  • Eficiența algoritmului
  • Paralelism
  • Acces la memorie

Divide and Conquer este o tehnică algoritmică populară în informatică care implică împărțirea unei probleme în sub-probleme mai mici, rezolvarea fiecărei sub-probleme în mod independent și apoi combinarea soluțiilor sub-problemelor pentru a rezolva problema inițială. Ideea de bază din spatele acestei tehnici este de a împărți o problemă în sub-probleme mai mici, mai ușor de gestionat, care pot fi rezolvate mai ușor.