oszd meg és uralkodj algoritmus
Kiejtés
- IPA: [ ˈozd ˈmɛɡeːʃ ˈurɒlkoɟː ˈɒlɡoritmuʃ]
Főnév
oszd meg és uralkodj algoritmus
Oszd meg és uralkodj (Divide and Conquer) algoritmusok
Definíció
Az “oszd meg és uralkodj” egy algoritmus-tervezési paradigma, amely egy problémát kisebb részproblémákra bont, azokat rekurzívan megoldja, majd az eredményeket egyesíti az eredeti probléma megoldásához.
Lépések
- Felbontás (Divide): Oszd a problémát kisebb, önálló részekre.
- Uralkodás (Conquer): Oldd meg a részproblémákat (gyakran rekurzívan).
- Összeillesztés (Combine): Kombináld a részmegoldásokat a teljes probléma megoldásához.
Példák oszd meg és uralkodj algoritmusokra
1. Merge Sort (Összefésüléses rendezés)
A Merge Sort egy rendezési algoritmus, amely a listát kisebb részekre bontja, amíg csak egy elem marad, majd összeilleszti őket rendezett sorrendben.
Algoritmus lépései:
- Oszd fel a listát két egyenlő részre.
- Rekurzívan rendezd a két részlistát.
- Fésüld össze a két rendezett részlistát.
Python implementáció:
def merge_sort(arr):
if len(arr) <= 1:
return arr
# Osztás
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
# Összefésülés
return merge(left, right)
def merge(left, right):
sorted_list = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_list.append(left[i])
i += 1
else:
sorted_list.append(right[j])
j += 1
# Maradék elemek hozzáadása
sorted_list.extend(left[i:])
sorted_list.extend(right[j:])
return sorted_list
# Példa
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Rendezett lista:", sorted_arr)
Kimenet:
Rendezett lista: [3, 9, 10, 27, 38, 43, 82]
2. Binary Search (Bináris keresés)
A Binary Search egy hatékony keresési algoritmus rendezett adatszerkezetekben. A keresés mindig a középső elemet hasonlítja össze a célelemmel.
Algoritmus lépései:
- Hasonlítsd össze a célt az aktuális intervallum középső elemével.
- Ha egyezik, visszatérhetsz a találattal.
- Ha a cél kisebb, keresd a bal oldali részt; ha nagyobb, keresd a jobb oldali részt.
Python implementáció:
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# Példa
arr = [2, 3, 4, 10, 40]
target = 10
result = binary_search(arr, target)
print("Cél elem indexe:", result)
Kimenet:
Cél elem indexe: 3
3. Quick Sort (Gyorsrendezés)
A Quick Sort egy másik rendezési algoritmus, amely a listát egy pivot elem köré rendezi, majd rekurzívan rendez kisebb és nagyobb elemeket.
Algoritmus lépései:
- Válassz egy pivot elemet.
- Helyezd el az összes kisebb elemet a pivot bal oldalára, és az összes nagyobb elemet a jobb oldalára.
- Rekurzívan rendezd a két alrészt.
Python implementáció:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
# Példa
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = quick_sort(arr)
print("Rendezett lista:", sorted_arr)
Kimenet:
Rendezett lista: [3, 9, 10, 27, 38, 43, 82]
4. Strassen’s Matrix Multiplication (Strassen-féle mátrixszorzás)
A mátrixszorzást is hatékonyabbá lehet tenni az “oszd meg és uralkodj” módszerrel. Strassen algoritmusa kisebb mátrixokra bontja a problémát, és kevesebb szorzást használ.
Algoritmus lépései:
- Oszd fel a mátrixokat négy egyenlő méretű al-mátrixra.
- Számolj ki 7 speciális mátrixszorzást az al-mátrixokkal.
- Kombináld az al-mátrixokat az eredeti mátrixhoz.
Python implementáció:
import numpy as np
def strassen_multiply(A, B):
if len(A) == 1:
return A * B
# Mátrixok felosztása
n = len(A) // 2
A11, A12, A21, A22 = A[:n, :n], A[:n, n:], A[n:, :n], A[n:, n:]
B11, B12, B21, B22 = B[:n, :n], B[:n, n:], B[n:, :n], B[n:, n:]
# Strassen-féle szorzatok
M1 = strassen_multiply(A11 + A22, B11 + B22)
M2 = strassen_multiply(A21 + A22, B11)
M3 = strassen_multiply(A11, B12 - B22)
M4 = strassen_multiply(A22, B21 - B11)
M5 = strassen_multiply(A11 + A12, B22)
M6 = strassen_multiply(A21 - A11, B11 + B12)
M7 = strassen_multiply(A12 - A22, B21 + B22)
# Eredmény mátrix összeállítása
C11 = M1 + M4 - M5 + M7
C12 = M3 + M5
C21 = M2 + M4
C22 = M1 - M2 + M3 + M6
# Mátrix összeillesztése
C = np.vstack((np.hstack((C11, C12)), np.hstack((C21, C22))))
return C
# Példa
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = strassen_multiply(A, B)
print("Mátrix szorzat eredménye:\n", C)
Kimenet:
Mátrix szorzat eredménye: [[19 22] [43 50]]
Összegzés
Az “oszd meg és uralkodj” algoritmusok hatékonyan alkalmazhatók számos problémára, például rendezésre, keresésre és mátrixműveletekre. Ez a megközelítés a kisebb részproblémák újrafelhasználásával csökkenti a számítási költségeket, miközben rekurzív természetével egyszerűsíti a megvalósítást.
- oszd meg és uralkodj algoritmus - Értelmező szótár (MEK)
- oszd meg és uralkodj algoritmus - Etimológiai szótár (UMIL)
- oszd meg és uralkodj algoritmus - Szótár.net (hu-hu)
- oszd meg és uralkodj algoritmus - DeepL (hu-de)
- oszd meg és uralkodj algoritmus - Яндекс (hu-ru)
- oszd meg és uralkodj algoritmus - Google (hu-en)
- oszd meg és uralkodj algoritmus - Helyesírási szótár (MTA)
- oszd meg és uralkodj algoritmus - Wikidata
- oszd meg és uralkodj algoritmus - Wikipédia (magyar)